2025-08-21 - ComplexFilter SearchResult Frontend structure
Jump to navigation
Jump to search
2024-06-26 - SearchResult linkpath
2024-11-28 - OrderPrice using linkPath flows
Overview
Creating visual representation of ComplexFilters for allowing frontend to create and manage.
Examples
- Main complex filter used in tableData
- filters used at each level of LinkSteps in requiredData/Linkpaths
- perParentComplexFilters and combinationComplexFilters used in LinkPaths
- complexFilters used in categoryLinks
Considerations
- Want to be able to achieve all features of complexFilters including childComplexFilters, grouping and (and/or) operations
- all elementTypes such as identifier/translateIds/traversals
- tableOutput currently separates each filterDataField to have it's own filter path
- operations and grouping or operations can happen at any childComplexFilter level and between filters
Option 1: OrGroups
Attempted this approach but became too complex and messy when creating multiple levels of grouped and/or statements.
- have an array of filters, each is a single path with an optional array of filterElements at each step
- each filter path sets its orGroup
- orGroups can be child of another orGroup, child orGroups only exist/group underneath their parent hierarchy
- orGroups group all filter paths using an OR operator
- however multiple filters at the same level within an orGroup (with a single filter path are considered the same orGroup) use AND operator
- if same level filters need to be separated by OR need to be separate *****check with Praew*****
Implementation
Every frontend complexFilter case must:
- allow adding multiple filter paths
- have orGroup hierarchy for filter paths
Option 2: OperationFilters
An alternative method of building and editing complexFilters on frontend could be building up a chain of operationFilters, this will closely resembe the request structure of processComplexFilter
- starts with the initial filter, choose type, eg logical or operation
- operation filter must go into each side and set with filter type and settings to use
- each side can then be an operation or a childComplexFilter
- adding operations chain filters at the same level
- childComplexFilters create a new level with a link
- Each operation sets it's operator (or/and)
- can open a new group (opening bracket) and close a group (closing bracket) at any point
- validate all groups at each level are opened and closed
- probably validate have at least one filterElement before closing
tableConfig
- Build a single filter structure
- filterDataFields point to a filterElement, with additional settings if needed (eg identifying a value inside a traversal filterElement)
- defaultValue is moved from filterDataField to filterElement, if a filterDataField sets the value then the default filterElement value is shown first and the filterDataField can adjust it after loading
- if adjust the filter structure, need to go through all filterDataFields to see if they need to be updated, eg filterElement they link to is removed, maybe set to null and validate when saving tableConfig
notes
- separate validate uiFilter from saving final filterElement structure, so can validate while building the filter
- have a breadcrumb or other representation of the childComplexFilter steps that can be navigated through
- each childComplexFilter step have a list of the added uiFilterElements, each can be clicked on to edit (or list them all)
- when click on a childComplexFilter move to it's level of uiFilterElements
- whenever adding a component we input the previous element which allows us to shuffle references
- cannot add closeBracket when previousLogicalElementId type openBracket, childComplexFilter, or null
- must choose operator when previousLogicalElementId type not openBracket, childComplexFilter, or null
Validate:
- all opening brackets at each level have equal number of closing brackets
- all element types have required data
- all childComplexFilters have at least 1 uiFilterElement (childLogicalElementId != null)
Example
- Click to buildFilter, no filterElements exists
let exampleData = {
objType {
objectType: "product",
serviceTag: "productManager"
},
initialLogicalElementId: null,
logicalElements: {
}
}
- add uuid_openBracket_1
- previousLogicalElementId = null
let exampleData = {
objType {
objectType: "product",
serviceTag: "productManager"
},
initialLogicalElementId: uuid_openBracket_1,
logicalElements: {
uuid_openBracket_1: {
logicalElementType: "openBracket",
previousLogicalElementId: null,
nextLogicalElementId: null,
},
}
}
- add uuid_childComplex_1
- previousLogicalElementId = uuid_openBracket_1
- must choose link detail when adding childComplexFilter (relType/direction)
let exampleData = {
objType {
objectType: "product",
serviceTag: "productManager"
},
initialLogicalElementId: uuid_openBracket_1,
logicalElements: {
uuid_openBracket_1: {
logicalElementType: "openBracket",
previousLogicalElementId: null,
nextLogicalElementId: uuid_childComplex_1,
},
uuid_childComplex_1: {
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_openBracket_1,
nextLogicalElementId: null,
childLogicalElementId: null,
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
},
}
}
- add uuid_childComplex_2
- OR operator
- previousLogicalElementId = uuid_childComplex_1
let exampleData = {
objType {
objectType: "product",
serviceTag: "productManager"
},
initialLogicalElementId: uuid_openBracket_1,
logicalElements: {
uuid_openBracket_1: { // level: product
logicalElementType: "openBracket",
previousLogicalElementId: null,
nextLogicalElementId: uuid_childComplex_1,
},
uuid_childComplex_1: { // level: product
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_openBracket_1,
nextLogicalElementId: uuid_operation_1,
childLogicalElementId: null,
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
},
uuid_operation_1: { // level: product
logicalElementType: "operation",
previousLogicalElementId: "uuid_childComplex_1",
nextLogicalElementId: "uuid_childComplex_2",
operation: "or"
},
uuid_childComplex_2: { // level: product
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_operation_1,
nextLogicalElementId: null,
childLogicalElementId: null,
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
},
}
}
- add uuid_logical_1
- previousLogicalElementId = uuid_childComplex_1
let exampleData = {
objType {
objectType: "product",
serviceTag: "productManager"
},
initialLogicalElementId: uuid_openBracket_1,
logicalElements: {
uuid_openBracket_1: { // level: product
logicalElementType: "openBracket",
previousLogicalElementId: null,
nextLogicalElementId: uuid_childComplex_1,
},
uuid_childComplex_1: { // level: product
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_openBracket_1,
nextLogicalElementId: uuid_operation_1,
childLogicalElementId: uuid_logical_1,
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
},
uuid_operation_1: { // level: product
logicalElementType: "operation",
previousLogicalElementId: "uuid_childComplex_1",
nextLogicalElementId: "uuid_childComplex_2",
operation: "or"
},
uuid_childComplex_2: { // level: product
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_operation_1,
nextLogicalElementId: null,
childLogicalElementId: null,
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
},
uuid_logical_1: { // level: sellOffer
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_1",
nextLogicalElementId: "null",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
}
}
- add uuid_logical_2
- previousLogicalElementId = uuid_childComplex_1
let exampleData = {
objType {
objectType: "product",
serviceTag: "productManager"
},
initialLogicalElementId: uuid_openBracket_1,
logicalElements: {
uuid_openBracket_1: { // level: product
logicalElementType: "openBracket",
previousLogicalElementId: null,
nextLogicalElementId: uuid_childComplex_1,
},
uuid_childComplex_1: { // level: product
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_openBracket_1,
nextLogicalElementId: uuid_operation_1,
childLogicalElementId: uuid_logical_1,
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
},
uuid_operation_1: { // level: product
logicalElementType: "operation",
previousLogicalElementId: "uuid_childComplex_1",
nextLogicalElementId: "uuid_childComplex_2",
operation: "or"
},
uuid_childComplex_2: { // level: product
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_operation_1,
nextLogicalElementId: null,
childLogicalElementId: uuid_logical_2,
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
},
uuid_logical_1: { // level: sellOffer
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_1",
nextLogicalElementId: "null",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_logical_2: { // level: sellOffer
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_2",
nextLogicalElementId: "null",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
}
}
- add uuid_childComplex_3
- previousLogicalElementId = uuid_childComplex_2
let exampleData = {
objType {
objectType: "product",
serviceTag: "productManager"
},
initialLogicalElementId: uuid_openBracket_1,
logicalElements: {
uuid_openBracket_1: { // level: product
logicalElementType: "openBracket",
previousLogicalElementId: null,
nextLogicalElementId: uuid_childComplex_1,
},
uuid_childComplex_1: { // level: product
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_openBracket_1,
nextLogicalElementId: uuid_operation_1,
childLogicalElementId: uuid_logical_1,
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
},
uuid_operation_1: { // level: product
logicalElementType: "operation",
previousLogicalElementId: "uuid_childComplex_1",
nextLogicalElementId: "uuid_childComplex_2",
operation: "or"
},
uuid_childComplex_2: { // level: product
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_operation_1,
nextLogicalElementId: null,
childLogicalElementId: uuid_logical_2,
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
},
uuid_logical_1: { // level: sellOffer
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_1",
nextLogicalElementId: "null",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_logical_2: { // level: sellOffer
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_2",
nextLogicalElementId: "uuid_operation_2",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_operation_2: { // level: sellOffer
logicalElementType: "operation",
previousLogicalElementId: "uuid_logical_2",
nextLogicalElementId: "uuid_childComplex_3",
operation: "or"
},
uuid_childComplex_3: { // level: sellOffer
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_operation_2,
nextLogicalElementId: null,
childLogicalElementId: null,
relType: {
relationshipTag: "hasSellOfferPlan",
serviceTag: "sellOfferPlan"
},
direction: "from"
},
}
}
- add uuid_childComplex_4 and add uuid_logical_3
- previousLogicalElementId = uuid_childComplex_3
let exampleData = {
objType {
objectType: "product",
serviceTag: "productManager"
},
initialLogicalElementId: uuid_openBracket_1,
logicalElements: {
uuid_openBracket_1: { // level: product
logicalElementType: "openBracket",
previousLogicalElementId: null,
nextLogicalElementId: uuid_childComplex_1,
},
uuid_childComplex_1: { // level: product
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_openBracket_1,
nextLogicalElementId: uuid_operation_1,
childLogicalElementId: uuid_logical_1,
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
},
uuid_operation_1: { // level: product
logicalElementType: "operation",
previousLogicalElementId: "uuid_childComplex_1",
nextLogicalElementId: "uuid_childComplex_2",
operation: "or"
},
uuid_childComplex_2: { // level: product
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_operation_1,
nextLogicalElementId: null,
childLogicalElementId: uuid_logical_2,
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
},
uuid_logical_1: { // level: sellOffer
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_1",
nextLogicalElementId: "null",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_logical_2: { // level: sellOffer
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_2",
nextLogicalElementId: "uuid_operation_2",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_operation_2: { // level: sellOffer
logicalElementType: "operation",
previousLogicalElementId: "uuid_logical_2",
nextLogicalElementId: "uuid_childComplex_3",
operation: "or"
},
uuid_childComplex_3: { // level: sellOffer
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_operation_2,
nextLogicalElementId: null,
childLogicalElementId: uuid_childComplex_4,
relType: {
relationshipTag: "hasSellOfferPlan",
serviceTag: "sellOfferPlan"
},
direction: "from"
},
uuid_childComplex_4: { // level: sellOfferPlan
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_childComplex_3,
nextLogicalElementId: null,
childLogicalElementId: uuid_logical_3,
relType: {
relationshipTag: "hasDeliveryMethodLink",
serviceTag: "sellOfferPlan"
},
direction: "from"
},
uuid_logical_3: { // level: deliveryMethodLink
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_4",
nextLogicalElementId: "null",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
}
}
- add uuid_logical_4
- OR operator
- previousLogicalElementId = uuid_logical_3
let exampleData = {
objType {
objectType: "product",
serviceTag: "productManager"
},
initialLogicalElementId: uuid_openBracket_1,
logicalElements: {
uuid_openBracket_1: { // level: product
logicalElementType: "openBracket",
previousLogicalElementId: null,
nextLogicalElementId: uuid_childComplex_1,
},
uuid_childComplex_1: { // level: product
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_openBracket_1,
nextLogicalElementId: uuid_operation_1,
childLogicalElementId: uuid_logical_1,
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
},
uuid_operation_1: { // level: product
logicalElementType: "operation",
previousLogicalElementId: "uuid_childComplex_1",
nextLogicalElementId: "uuid_childComplex_2",
operation: "or"
},
uuid_childComplex_2: { // level: product
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_operation_1,
nextLogicalElementId: null,
childLogicalElementId: uuid_logical_2,
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
},
uuid_logical_1: { // level: sellOffer
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_1",
nextLogicalElementId: "null",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_logical_2: { // level: sellOffer
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_2",
nextLogicalElementId: "uuid_operation_2",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_operation_2: { // level: sellOffer
logicalElementType: "operation",
previousLogicalElementId: "uuid_logical_2",
nextLogicalElementId: "uuid_childComplex_3",
operation: "or"
},
uuid_childComplex_3: { // level: sellOffer
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_operation_2,
nextLogicalElementId: null,
childLogicalElementId: uuid_childComplex_4,
relType: {
relationshipTag: "hasSellOfferPlan",
serviceTag: "sellOfferPlan"
},
direction: "from"
},
uuid_childComplex_4: { // level: sellOfferPlan
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_childComplex_3,
nextLogicalElementId: null,
childLogicalElementId: uuid_logical_3,
relType: {
relationshipTag: "hasDeliveryMethodLink",
serviceTag: "deliveryMethodLink"
},
direction: "from"
},
uuid_logical_3: { // level: deliveryMethodLink
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_4",
nextLogicalElementId: "uuid_operation_2",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_operation_3: { // level: deliveryMethodLink
logicalElementType: "operation",
previousLogicalElementId: "uuid_logical_3",
nextLogicalElementId: "uuid_logical_4",
operation: "or"
},
uuid_logical_4: { // level: deliveryMethodLink
logicalElementType: "logical",
previousLogicalElementId: "uuid_operation_2",
nextLogicalElementId: "null",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
}
}
- add uuid_childComplex_5 and uuid_childComplex_6 and uuid_logical_5
- AND operator
- previousLogicalElementId = uuid_childComplex_3
let exampleData = {
objType {
objectType: "product",
serviceTag: "productManager"
},
initialLogicalElementId: uuid_openBracket_1,
logicalElements: {
uuid_openBracket_1: { // level: product
logicalElementType: "openBracket",
previousLogicalElementId: null,
nextLogicalElementId: uuid_childComplex_1,
},
uuid_childComplex_1: { // level: product
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_openBracket_1,
nextLogicalElementId: uuid_operation_1,
childLogicalElementId: uuid_logical_1,
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
},
uuid_operation_1: { // level: product
logicalElementType: "operation",
previousLogicalElementId: "uuid_childComplex_1",
nextLogicalElementId: "uuid_childComplex_2",
operation: "or"
},
uuid_childComplex_2: { // level: product
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_operation_1,
nextLogicalElementId: null,
childLogicalElementId: uuid_logical_2,
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
},
uuid_logical_1: { // level: sellOffer
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_1",
nextLogicalElementId: "null",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_logical_2: { // level: sellOffer
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_2",
nextLogicalElementId: "uuid_operation_2",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_operation_2: { // level: sellOffer
logicalElementType: "operation",
previousLogicalElementId: "uuid_logical_2",
nextLogicalElementId: "uuid_childComplex_3",
operation: "or"
},
uuid_childComplex_3: { // level: sellOffer
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_operation_2,
nextLogicalElementId: uuid_operation_4,
childLogicalElementId: uuid_childComplex_4,
relType: {
relationshipTag: "hasSellOfferPlan",
serviceTag: "sellOfferPlan"
},
direction: "from"
},
uuid_childComplex_4: { // level: sellOfferPlan
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_childComplex_3,
nextLogicalElementId: null,
childLogicalElementId: uuid_logical_3,
relType: {
relationshipTag: "hasDeliveryMethodLink",
serviceTag: "deliveryMethodLink"
},
direction: "from"
},
uuid_logical_3: { // level: deliveryMethodLink
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_4",
nextLogicalElementId: "uuid_operation_2",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_operation_3: { // level: deliveryMethodLink
logicalElementType: "operation",
previousLogicalElementId: "uuid_logical_3",
nextLogicalElementId: "uuid_logical_4",
operation: "or"
},
uuid_logical_4: { // level: deliveryMethodLink
logicalElementType: "logical",
previousLogicalElementId: "uuid_operation_2",
nextLogicalElementId: "null",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_operation_4: { // level: sellOffer
logicalElementType: "operation",
previousLogicalElementId: "uuid_childComplex_3",
nextLogicalElementId: "uuid_childComplex_5",
operation: "or"
},
uuid_childComplex_5: { // level: sellOffer
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_operation_4,
nextLogicalElementId: null,
childLogicalElementId: uuid_childComplex_6,
relType: {
relationshipTag: "hasSellOfferPlan",
serviceTag: "sellOfferPlan"
},
direction: "from"
},
uuid_childComplex_6: { // level: sellOfferPlan
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_childComplex_5,
nextLogicalElementId: null,
childLogicalElementId: uuid_logical_5,
relType: {
relationshipTag: "hasDeliveryMethodLink",
serviceTag: "deliveryMethodLink"
},
direction: "from"
},
uuid_logical_5: { // level: deliveryMethodLink
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_6",
nextLogicalElementId: null,
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
}
}
- add closeBracket
- previousLogicalElementId = uuid_childComplex_2
let exampleData = {
objType {
objectType: "product",
serviceTag: "productManager"
},
initialLogicalElementId: uuid_openBracket_1,
logicalElements: {
uuid_openBracket_1: { // level: product
logicalElementType: "openBracket",
previousLogicalElementId: null,
nextLogicalElementId: uuid_childComplex_1,
},
uuid_childComplex_1: { // level: product
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_openBracket_1,
nextLogicalElementId: uuid_operation_1,
childLogicalElementId: uuid_logical_1,
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
},
uuid_operation_1: { // level: product
logicalElementType: "operation",
previousLogicalElementId: "uuid_childComplex_1",
nextLogicalElementId: "uuid_childComplex_2",
operation: "or"
},
uuid_childComplex_2: { // level: product
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_operation_1,
nextLogicalElementId: uuid_closeBracket_1,
childLogicalElementId: uuid_logical_2,
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
},
uuid_logical_1: { // level: sellOffer
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_1",
nextLogicalElementId: "null",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_logical_2: { // level: sellOffer
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_2",
nextLogicalElementId: "uuid_operation_2",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_operation_2: { // level: sellOffer
logicalElementType: "operation",
previousLogicalElementId: "uuid_logical_2",
nextLogicalElementId: "uuid_childComplex_3",
operation: "or"
},
uuid_childComplex_3: { // level: sellOffer
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_operation_2,
nextLogicalElementId: uuid_operation_4,
childLogicalElementId: uuid_childComplex_4,
relType: {
relationshipTag: "hasSellOfferPlan",
serviceTag: "sellOfferPlan"
},
direction: "from"
},
uuid_childComplex_4: { // level: sellOfferPlan
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_childComplex_3,
nextLogicalElementId: null,
childLogicalElementId: uuid_logical_3,
relType: {
relationshipTag: "hasDeliveryMethodLink",
serviceTag: "deliveryMethodLink"
},
direction: "from"
},
uuid_logical_3: { // level: deliveryMethodLink
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_4",
nextLogicalElementId: "uuid_operation_2",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_operation_3: { // level: deliveryMethodLink
logicalElementType: "operation",
previousLogicalElementId: "uuid_logical_3",
nextLogicalElementId: "uuid_logical_4",
operation: "or"
},
uuid_logical_4: { // level: deliveryMethodLink
logicalElementType: "logical",
previousLogicalElementId: "uuid_operation_2",
nextLogicalElementId: "null",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_operation_4: { // level: sellOffer
logicalElementType: "operation",
previousLogicalElementId: "uuid_childComplex_3",
nextLogicalElementId: "uuid_childComplex_5",
operation: "or"
},
uuid_childComplex_5: { // level: sellOffer
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_operation_4,
nextLogicalElementId: null,
childLogicalElementId: uuid_childComplex_6,
relType: {
relationshipTag: "hasSellOfferPlan",
serviceTag: "sellOfferPlan"
},
direction: "from"
},
uuid_childComplex_6: { // level: sellOfferPlan
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_childComplex_5,
nextLogicalElementId: null,
childLogicalElementId: uuid_logical_5,
relType: {
relationshipTag: "hasDeliveryMethodLink",
serviceTag: "deliveryMethodLink"
},
direction: "from"
},
uuid_logical_5: { // level: deliveryMethodLink
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_6",
nextLogicalElementId: null,
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_closeBracket_1: { // level: product
logicalElementType: "closeBracket",
previousLogicalElementId: uuid_childComplex_2,
nextLogicalElementId: null,
},
}
}
- add uuid_childComplex_7 and uuid_logical_6
- AND operator
- previousLogicalElementId = uuid_closeBracket_1
let exampleData = {
objType {
objectType: "product",
serviceTag: "productManager"
},
initialLogicalElementId: uuid_openBracket_1,
logicalElements: {
uuid_openBracket_1: { // level: product
logicalElementType: "openBracket",
previousLogicalElementId: null,
nextLogicalElementId: uuid_childComplex_1,
},
uuid_childComplex_1: { // level: product
objTyp: {
objectType: "product",
serviceTag: "ProductManager"
},
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_openBracket_1,
nextLogicalElementId: uuid_operation_1,
childLogicalElementId: uuid_logical_1,
pathLinkType: {
objTyp: {
objectType: "sellOffer",
serviceTag: "SellOfferManager"
},
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
}
},
uuid_operation_1: { // level: product
logicalElementType: "operation",
previousLogicalElementId: "uuid_childComplex_1",
nextLogicalElementId: "uuid_childComplex_2",
operation: "or"
},
uuid_childComplex_2: { // level: product
objTyp: {
objectType: "product",
serviceTag: "ProductManager"
},
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_operation_1,
nextLogicalElementId: uuid_closeBracket_1,
childLogicalElementId: uuid_logical_2,
pathLinkType: {
objTyp: {
objectType: "sellOffer",
serviceTag: "SellOfferManager"
},
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
}
},
uuid_logical_1: { // level: sellOffer
objType: {
objectType: "sellOffer",
serviceTag: "SellOfferManager"
},
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_1",
nextLogicalElementId: "null",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_logical_2: { // level: sellOffer
objType: {
objectType: "sellOffer",
serviceTag: "SellOfferManager"
},
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_2",
nextLogicalElementId: "uuid_operation_2",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_operation_2: { // level: sellOffer
logicalElementType: "operation",
previousLogicalElementId: "uuid_logical_2",
nextLogicalElementId: "uuid_childComplex_3",
operation: "or"
},
uuid_childComplex_3: { // level: sellOffer
objTyp: {
objectType: "sellOffer",
serviceTag: "SellOfferManager"
},
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_operation_2,
nextLogicalElementId: uuid_operation_4,
childLogicalElementId: uuid_childComplex_4,
pathLinkType: {
objTyp: {
objectType: "sellOfferPlan",
serviceTag: "SellOfferPlan"
},
relType: {
relationshipTag: "hasSellOfferPlan",
serviceTag: "sellOfferPlan"
},
direction: "from"
}
},
uuid_childComplex_4: { // level: sellOfferPlan
objTyp: {
objectType: "sellOfferPlan",
serviceTag: "SellOfferPlan"
},
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_childComplex_3,
nextLogicalElementId: null,
childLogicalElementId: uuid_logical_3,
pathLinkType: {
objTyp: {
objectType: "deliveryMethodLink",
serviceTag: "SellOfferPlan"
},
relType: {
relationshipTag: "hasDeliveryMethodLink",
serviceTag: "deliveryMethodLink"
},
direction: "from"
}
},
uuid_logical_3: { // level: deliveryMethodLink
objTyp: {
objectType: "deliveryMethodLink",
serviceTag: "SellOfferPlan"
},
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_4",
nextLogicalElementId: "uuid_operation_2",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_operation_3: { // level: deliveryMethodLink
logicalElementType: "operation",
previousLogicalElementId: "uuid_logical_3",
nextLogicalElementId: "uuid_logical_4",
operation: "or"
},
uuid_logical_4: { // level: deliveryMethodLink
objTyp: {
objectType: "deliveryMethodLink",
serviceTag: "SellOfferPlan"
},
logicalElementType: "logical",
previousLogicalElementId: "uuid_operation_2",
nextLogicalElementId: "null",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_operation_4: { // level: sellOffer
logicalElementType: "operation",
previousLogicalElementId: "uuid_childComplex_3",
nextLogicalElementId: "uuid_childComplex_5",
operation: "or"
},
uuid_childComplex_5: { // level: sellOffer
objTyp: {
objectType: "sellOffer",
serviceTag: "SellOfferManager"
},
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_operation_4,
nextLogicalElementId: null,
childLogicalElementId: uuid_childComplex_6,
pathLinkType: {
objTyp: {
objectType: "sellOfferPlan",
serviceTag: "SellOfferPlan"
},
relType: {
relationshipTag: "hasSellOfferPlan",
serviceTag: "sellOfferPlan"
},
direction: "from"
}
},
uuid_childComplex_6: { // level: sellOfferPlan
objTyp: {
objectType: "sellOfferPlan",
serviceTag: "SellOfferPlan"
},
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_childComplex_5,
nextLogicalElementId: null,
childLogicalElementId: uuid_logical_5,
pathLinkType: {
objTyp: {
objectType: "deliveryMethodLink",
serviceTag: "SellOfferPlan"
},
relType: {
relationshipTag: "hasDeliveryMethodLink",
serviceTag: "deliveryMethodLink"
},
direction: "from"
}
},
uuid_logical_5: { // level: deliveryMethodLink
objTyp: {
objectType: "deliveryMethodLink",
serviceTag: "SellOfferPlan"
},
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_6",
nextLogicalElementId: null,
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
uuid_closeBracket_1: { // level: product
logicalElementType: "closeBracket",
previousLogicalElementId: uuid_childComplex_2,
nextLogicalElementId: null,
},
uuid_operation_5: { // level: product
logicalElementType: "operation",
previousLogicalElementId: "uuid_closeBracket_1",
nextLogicalElementId: "uuid_childComplex_7",
operation: "or"
},
uuid_childComplex_7: { // level: product
objTyp: {
objectType: "product",
serviceTag: "ProductManager"
},
logicalElementType: "childComplexFilter",
previousLogicalElementId: uuid_operation_5,
nextLogicalElementId: null,
childLogicalElementId: uuid_logical_6,
pathLinkType: {
objTyp: {
objectType: "sellOffer",
serviceTag: "SellOfferManager"
},
relType: {
relationshipTag: "hasSellOffer",
serviceTag: "SellOfferManager"
},
direction: "from"
}
},
uuid_logical_6: { // level: sellOffer
objTyp: {
objectType: "sellOffer",
serviceTag: "SellOfferManager"
},
logicalElementType: "logical",
previousLogicalElementId: "uuid_childComplex_7",
nextLogicalElementId: "null",
fieldName: "fieldx",
comparison: "greaterThan",
defaultValue: 50
},
}
}