<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://izara.io/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Praew</id>
	<title>Izara Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://izara.io/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Praew"/>
	<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php/Special:Contributions/Praew"/>
	<updated>2026-05-02T14:22:23Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-17_-_LinkPath_structure_and_examples&amp;diff=4315</id>
		<title>2025-04-17 - LinkPath structure and examples</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-17_-_LinkPath_structure_and_examples&amp;diff=4315"/>
		<updated>2026-04-30T03:08:54Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= requiredData normalize structure =&lt;br /&gt;
* component =&amp;gt; requiredDataObjects , linkPathObjects, linkPathSteps&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  requiredDataObjects: {&lt;br /&gt;
     hash_requiredDataObjectA: { //* normal requiredData&lt;br /&gt;
       fieldName: &amp;quot;fieldname if main objType or last fieldName for linkPath&amp;quot;,&lt;br /&gt;
     },&lt;br /&gt;
     hash_requiredDataObjectB: { //* has LinkPath&lt;br /&gt;
       fieldName: &amp;quot;fieldname if main objType or last fieldName for linkPath&amp;quot;,&lt;br /&gt;
       linkPathObjectId: &amp;quot;hash_linkPathA&amp;quot;,&lt;br /&gt;
       complexFilterCombinationIds: [ //* has applyCombinations&lt;br /&gt;
         &amp;quot;xxxxx&amp;quot;,&lt;br /&gt;
         &amp;quot;xxxxx&amp;quot;&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
  },&lt;br /&gt;
  linkPathObjects: {&lt;br /&gt;
    hash_linkPathA: {&lt;br /&gt;
      initialObjType: {&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      linkSteps: [&lt;br /&gt;
        &amp;quot;hash_linkStepB_1&amp;quot;,&lt;br /&gt;
        &amp;quot;hash_linkStepB_2&amp;quot;&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
    ref_linkPathObjectC: {&lt;br /&gt;
       initialObjType: {&lt;br /&gt;
        serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      linkSteps: [&lt;br /&gt;
        &amp;quot;hash_linkStepC_1&amp;quot;,&lt;br /&gt;
        &amp;quot;hash_linkStepC_2&amp;quot;&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  linkPathSteps: {&lt;br /&gt;
    hash_linkStepB_1: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         relType: {&lt;br /&gt;
           serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
           relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         direction: &amp;quot;from&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      //------ conditions by link ------// : optional&lt;br /&gt;
      filterObjectId: &amp;quot;ref_filterMainIdA&amp;quot;,&lt;br /&gt;
      aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
      sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
          dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
          sortOrder: 'descending',&lt;br /&gt;
          refFieldNameId: 'ref_fieldNameIdC'&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      requiredDataObjects: {&lt;br /&gt;
        'ref_fieldNameIdC': {&lt;br /&gt;
          fieldName: 'ccc',&lt;br /&gt;
          linkPathObjectId: 'ref_linkPathObjectC'&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
    },&lt;br /&gt;
    hash_linkStepB_2: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         relType: {&lt;br /&gt;
           serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
           relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         direction: &amp;quot;from&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      //------ conditions by link ------//&lt;br /&gt;
      filterObjectId: &amp;quot;ref_filterMainIdA&amp;quot;,&lt;br /&gt;
      aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
      sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
          dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
          sortOrder: 'descending',&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      combine: &amp;quot;true&amp;quot;,&lt;br /&gt;
      comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
      comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
      comparisonSortDataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
      comparisonValue: &amp;quot;50&amp;quot;,&lt;br /&gt;
      requestProperties: {&lt;br /&gt;
        tag_xxxx: &amp;quot;value&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      perParentCombinationIds: [&lt;br /&gt;
        {&lt;br /&gt;
          tag: &amp;quot;tag_xxxxx&amp;quot;,&lt;br /&gt;
          filterMainId: &amp;quot;xxxxx&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      applyCombinations: [&lt;br /&gt;
        {&lt;br /&gt;
          tag: &amp;quot;tag_xxxxx&amp;quot;,&lt;br /&gt;
          filterMainId: &amp;quot;xxxxx&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;hash_linkStepC_1&amp;quot;: {},&lt;br /&gt;
    &amp;quot;hash_linkStepC_2&amp;quot;: {}&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ProcessSearchResultMessage ==&lt;br /&gt;
* Fetch and Sort Product Sizes by Language with Fallback&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Need to fetch all sizes, sorted by language order 'en', 'th'.&lt;br /&gt;
If a translation is missing for any language in sortArray: ['en', 'th'],&lt;br /&gt;
fallback to the defaultTranslationLink of that productAttribute.&lt;br /&gt;
ProductAttributeLabel with labelId = 'Id_X' represents a size.&lt;br /&gt;
identifiersIdArray contains all productAttributeIds linked to ProductAttributeLabel where labelId='Id_X'.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let processSearchResultMessage = {&lt;br /&gt;
  objType: {&lt;br /&gt;
    serviceTag: 'ProductAttribute',&lt;br /&gt;
    objectType: 'productAttribute'&lt;br /&gt;
  },&lt;br /&gt;
  requiredData: [&lt;br /&gt;
    {&lt;br /&gt;
      fieldName: 'text', //all sizes by languageId, where text is the identifiers of the translation objectType, which is the final link step of this requiredData&lt;br /&gt;
      linkPath: [&lt;br /&gt;
        {&lt;br /&gt;
          link: {&lt;br /&gt;
            relType: {&lt;br /&gt;
              serviceTag: 'Translations',&lt;br /&gt;
              relationshipTag: 'hasTranslationLink'&lt;br /&gt;
              // Must use hasTranslationLink because it will be automatically added by inserting a filterElement with logicalType: &amp;quot;translateIds&amp;quot;&lt;br /&gt;
              // where identifiers come from identifiersIdArray (Process-ComplexFilter), along with a filterElement of type: &amp;quot;logicalOperator&amp;quot; and operator: &amp;quot;and&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            objType: {&lt;br /&gt;
              serviceTag: 'Translations',&lt;br /&gt;
              objectType: 'translationLink'&lt;br /&gt;
            },&lt;br /&gt;
            direction: 'from'&lt;br /&gt;
          },&lt;br /&gt;
          aggregate: 'min',   //if 'min' sorts languages in order 'en', 'th', //if max sorts languages in order 'th', 'en&lt;br /&gt;
          sortFields: {&lt;br /&gt;
            fieldName: 'languageId',&lt;br /&gt;
            dataType: 'array',&lt;br /&gt;
            sortArray: ['en', 'th']  // sorts languages according to sortArray&lt;br /&gt;
          },&lt;br /&gt;
          filterElements: [&lt;br /&gt;
            {&lt;br /&gt;
              type: 'group',&lt;br /&gt;
              elements: [&lt;br /&gt;
                {&lt;br /&gt;
                  type: 'traversal',&lt;br /&gt;
                  traversals: [&lt;br /&gt;
                    {&lt;br /&gt;
                      fields: {&lt;br /&gt;
                        languageId: { anyValue: ['en', 'th'] },&lt;br /&gt;
                        textTag: 'productAttributeValue'&lt;br /&gt;
                      },&lt;br /&gt;
                      link: {&lt;br /&gt;
                        relationshipDirection: 'from',&lt;br /&gt;
                        relType: {&lt;br /&gt;
                          serviceTag: 'Translations',&lt;br /&gt;
                          relationshipTag: 'currentTranslationLink'&lt;br /&gt;
                        }&lt;br /&gt;
                      }&lt;br /&gt;
                    },&lt;br /&gt;
                    {&lt;br /&gt;
                      objType: {&lt;br /&gt;
                        serviceTag: 'ProductAttribute',&lt;br /&gt;
                        objectType: 'productAttribute'&lt;br /&gt;
                      }&lt;br /&gt;
                    }&lt;br /&gt;
                  ]&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                  type: 'logicalOperator', operator: 'or'&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                  type: 'traversal',&lt;br /&gt;
                  traversals: [&lt;br /&gt;
                    {&lt;br /&gt;
                      fields: {&lt;br /&gt;
                        textTag: 'productAttributeValue'&lt;br /&gt;
                      },&lt;br /&gt;
                      link: {&lt;br /&gt;
                        relationshipDirection: 'from',&lt;br /&gt;
                        relType: {&lt;br /&gt;
                          serviceTag: 'Translations',&lt;br /&gt;
                          relationshipTag: 'defaultTranslationLink'&lt;br /&gt;
                        }&lt;br /&gt;
                      }&lt;br /&gt;
                    },&lt;br /&gt;
                    {&lt;br /&gt;
                      objType: {&lt;br /&gt;
                        serviceTag: 'ProductAttribute',&lt;br /&gt;
                        objectType: 'productAttribute'&lt;br /&gt;
                      }&lt;br /&gt;
                    }&lt;br /&gt;
                  ]&lt;br /&gt;
                }&lt;br /&gt;
              ]&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          link: {&lt;br /&gt;
            relType: {&lt;br /&gt;
              serviceTag: 'Translations',&lt;br /&gt;
              relationshipTag: 'isTranslation'&lt;br /&gt;
            },&lt;br /&gt;
            objType: {&lt;br /&gt;
              serviceTag: 'Translations',&lt;br /&gt;
              objectType: 'translation'&lt;br /&gt;
            },&lt;br /&gt;
            direction: 'from'&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  filter: {&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: 'ProductAttribute',&lt;br /&gt;
      objectType: 'productAttribute'&lt;br /&gt;
    },&lt;br /&gt;
    elements: [&lt;br /&gt;
      {&lt;br /&gt;
        type: 'complexFilter',&lt;br /&gt;
        complexFilter: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: 'ProductAttribute',&lt;br /&gt;
            objectType: 'ProductAttributeLabel'&lt;br /&gt;
          },&lt;br /&gt;
          relType: {&lt;br /&gt;
            serviceTag: 'ProductAttribute',&lt;br /&gt;
            relationshipTag: 'isProductAttributeLabel'&lt;br /&gt;
          },&lt;br /&gt;
          direction: 'from',&lt;br /&gt;
          elements: [&lt;br /&gt;
            {&lt;br /&gt;
              type: 'logical',&lt;br /&gt;
              fieldName: 'labelId',&lt;br /&gt;
              comparison: 'equals',&lt;br /&gt;
              value: 'Id_X'&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  requestProperties: {},&lt;br /&gt;
  identifiersIdArray: [&lt;br /&gt;
    {&lt;br /&gt;
      identifiersId: 'hashOfIdentifiersObject_1',&lt;br /&gt;
      identifiers: {&lt;br /&gt;
        productAttributeId: 'productAttributeId_uuid_1'&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      identifiersId: 'hashOfIdentifiersObject_2',&lt;br /&gt;
      identifiers: {&lt;br /&gt;
        productAttributeId: 'productAttributeId_uuid_2'&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      identifiersId: 'hashOfIdentifiersObject_3',&lt;br /&gt;
      identifiers: {&lt;br /&gt;
        productAttributeId: 'productAttributeId_uuid_3'&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== example search and sort request ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;objType&amp;quot;:{&lt;br /&gt;
      &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
      &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;searchResultId&amp;quot;:&amp;quot;8e5fecd40a27e47f89cd2743916c0044f0f69bc6&amp;quot;,&lt;br /&gt;
   &amp;quot;searchDetailId&amp;quot;:&amp;quot;3462d3248d3af9406554f1c218b63442d26ac2e5&amp;quot;,&lt;br /&gt;
   &amp;quot;requiredDataObjects&amp;quot;:{&lt;br /&gt;
      &amp;quot;4c8e7879d26e6fa7ab85ded25a79a541754c5a3c&amp;quot;:{&lt;br /&gt;
         &amp;quot;fieldName&amp;quot;:&amp;quot;productId&amp;quot;,&lt;br /&gt;
         &amp;quot;linkPathObjectId&amp;quot;:&amp;quot;1a8a3f9c2c3ea5eaad1f42385362de5dd11cde8a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;c799f11507529f0fb6fa712568596d24b6507d40&amp;quot;:{&lt;br /&gt;
         &amp;quot;fieldName&amp;quot;:&amp;quot;sellOfferHandlerServiceTag&amp;quot;,&lt;br /&gt;
         &amp;quot;linkPathObjectId&amp;quot;:&amp;quot;5909f82f27bd6c1f921e95b88a65b6e4727a6532&amp;quot;,&lt;br /&gt;
         &amp;quot;complexFilterCombinationIds&amp;quot;:[&lt;br /&gt;
            &amp;quot;88d9c5b9ab36d8c3ebf17e8322541b9c64cae25b&amp;quot;,&lt;br /&gt;
            &amp;quot;51509dea0a7ba2746dbd24769b8e777f1411f3ff&amp;quot;,&lt;br /&gt;
            &amp;quot;d7a7f875254e856b4205075826631ec042b4c821&amp;quot;,&lt;br /&gt;
            &amp;quot;b96447ae98c95858694ca5ec407750c559825930&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;searchParams&amp;quot;:{&lt;br /&gt;
      &amp;quot;filterObjectId&amp;quot;:&amp;quot;8e5fecd40a27e47f89cd2743916c0044f0f69bc6&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;filterElements&amp;quot;:{&lt;br /&gt;
      &amp;quot;8e5fecd40a27e47f89cd2743916c0044f0f69bc6&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;sellOfferId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;equals&amp;quot;,&lt;br /&gt;
            &amp;quot;value&amp;quot;:&amp;quot;sellOfferId_001&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;d92ca4f68dc0d474cfdc10a6c702a5c7224a822c&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;rateTable&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;rateTableId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;highLow&amp;quot;,&lt;br /&gt;
            &amp;quot;valueType&amp;quot;:&amp;quot;perParentIdentifier&amp;quot;,&lt;br /&gt;
            &amp;quot;perParentIdentifierFieldname&amp;quot;:&amp;quot;sellOfferId&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;cd378bc32fbc9a46929c9a9d590e7d77243a839c&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;rateTable&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;rateTableId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;lessThanEquals&amp;quot;,&lt;br /&gt;
            &amp;quot;value&amp;quot;:&amp;quot;cccc&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;0c287df25d6ff203be7cc9faa2390f6ab0df3878&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;rateTable&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;operation&amp;quot;,&lt;br /&gt;
            &amp;quot;filterElementLeft&amp;quot;:&amp;quot;d92ca4f68dc0d474cfdc10a6c702a5c7224a822c&amp;quot;,&lt;br /&gt;
            &amp;quot;filterElementRight&amp;quot;:&amp;quot;cd378bc32fbc9a46929c9a9d590e7d77243a839c&amp;quot;,&lt;br /&gt;
            &amp;quot;operator&amp;quot;:&amp;quot;AND&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;e0b8534452e98796f144c83a221764ef32db5ab6&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;Locations&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;locationNode&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
            &amp;quot;childFilterElementId&amp;quot;:&amp;quot;0c287df25d6ff203be7cc9faa2390f6ab0df3878&amp;quot;,&lt;br /&gt;
            &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
               &amp;quot;relType&amp;quot;:{&lt;br /&gt;
                  &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
                  &amp;quot;relationshipTag&amp;quot;:&amp;quot;disabledDeliversTolocationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               &amp;quot;objType&amp;quot;:{&lt;br /&gt;
                  &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
                  &amp;quot;objectType&amp;quot;:&amp;quot;rateTable&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               &amp;quot;direction&amp;quot;:&amp;quot;to&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;requestProperties&amp;quot;:{}&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;88d9c5b9ab36d8c3ebf17e8322541b9c64cae25b&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;currencyId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;lessThan&amp;quot;,&lt;br /&gt;
            &amp;quot;value&amp;quot;:&amp;quot;bbbb&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;51509dea0a7ba2746dbd24769b8e777f1411f3ff&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOfferPlanUserPaymentMethodLink&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;sellOfferPlanUserPaymentMethodLinkId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;lessThan&amp;quot;,&lt;br /&gt;
            &amp;quot;value&amp;quot;:&amp;quot;bbbb&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;a5491ba3deb74e523741c8cfeb845f49db444a9c&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;Locations&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;locationNode&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;locationNodeId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;lessThan&amp;quot;,&lt;br /&gt;
            &amp;quot;value&amp;quot;:&amp;quot;cccc&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;7820aef170ae6c3e723382d6bc81d7b12a674974&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;rateTable&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;rateTableId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;highLow&amp;quot;,&lt;br /&gt;
            &amp;quot;value&amp;quot;:&amp;quot;aaaa&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;554fc368ec36c13a93e3c71c8081951060965bb2&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;Locations&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;locationNode&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
            &amp;quot;childFilterElementId&amp;quot;:&amp;quot;7820aef170ae6c3e723382d6bc81d7b12a674974&amp;quot;,&lt;br /&gt;
            &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
               &amp;quot;relType&amp;quot;:{&lt;br /&gt;
                  &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
                  &amp;quot;relationshipTag&amp;quot;:&amp;quot;deliversToLocationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               &amp;quot;objType&amp;quot;:{&lt;br /&gt;
                  &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
                  &amp;quot;objectType&amp;quot;:&amp;quot;rateTable&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               &amp;quot;direction&amp;quot;:&amp;quot;to&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;requestProperties&amp;quot;:{}&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;d7a7f875254e856b4205075826631ec042b4c821&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;Locations&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;locationNode&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;operation&amp;quot;,&lt;br /&gt;
            &amp;quot;filterElementLeft&amp;quot;:&amp;quot;a5491ba3deb74e523741c8cfeb845f49db444a9c&amp;quot;,&lt;br /&gt;
            &amp;quot;filterElementRight&amp;quot;:&amp;quot;554fc368ec36c13a93e3c71c8081951060965bb2&amp;quot;,&lt;br /&gt;
            &amp;quot;operator&amp;quot;:&amp;quot;OR&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;b96447ae98c95858694ca5ec407750c559825930&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOfferPlanUserPaymentMethodLink&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;operation&amp;quot;,&lt;br /&gt;
            &amp;quot;filterElementLeft&amp;quot;:&amp;quot;5faa4000cfb72e7aa28603a7740c212f6d6db5e0&amp;quot;,&lt;br /&gt;
            &amp;quot;filterElementRight&amp;quot;:&amp;quot;a1aa8d2907f8b6f24e7b66116129838e978bcaee&amp;quot;,&lt;br /&gt;
            &amp;quot;operator&amp;quot;:&amp;quot;OR&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;linkPathObjects&amp;quot;:{&lt;br /&gt;
      &amp;quot;1a8a3f9c2c3ea5eaad1f42385362de5dd11cde8a&amp;quot;:{&lt;br /&gt;
         &amp;quot;initialObjType&amp;quot;:{&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;linkSteps&amp;quot;:[&lt;br /&gt;
            &amp;quot;fa9a637eb09df71d939b3d914eb9ee27ae83048e&amp;quot;,&lt;br /&gt;
            &amp;quot;d3e2d36cab6d9441db10a7c983834cf9196398b3&amp;quot;,&lt;br /&gt;
            &amp;quot;fa9a637eb09df71d939b3d914eb9ee27ae83048e&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;2794814ec253fc93496bfcb50ea18ebfe640bf4d&amp;quot;:{&lt;br /&gt;
         &amp;quot;initialObjType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;linkSteps&amp;quot;:[&lt;br /&gt;
            &amp;quot;fa9a637eb09df71d939b3d914eb9ee27ae83048e&amp;quot;,&lt;br /&gt;
            &amp;quot;11704ae9a828b4709300964e2e0361bad13db5c3&amp;quot;,&lt;br /&gt;
            &amp;quot;964050f23f92b45a1ea573a573c50ae3ca2bae18&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;5909f82f27bd6c1f921e95b88a65b6e4727a6532&amp;quot;:{&lt;br /&gt;
         &amp;quot;initialObjType&amp;quot;:{&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;linkSteps&amp;quot;:[&lt;br /&gt;
            &amp;quot;fa9a637eb09df71d939b3d914eb9ee27ae83048e&amp;quot;,&lt;br /&gt;
            &amp;quot;634dd9295fcb1834de0a6ed1f1ab8a9fa06c4d7f&amp;quot;,&lt;br /&gt;
            &amp;quot;d3fc84fa4444406cef2de49baf53d38ab86cd2e0&amp;quot;,&lt;br /&gt;
            &amp;quot;2b0537fa34ee1d259488fce12204dd549e1c98a3&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;linkPathSteps&amp;quot;:{&lt;br /&gt;
      &amp;quot;fa9a637eb09df71d939b3d914eb9ee27ae83048e&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;product&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;to&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;d3e2d36cab6d9441db10a7c983834cf9196398b3&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;from&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;comparison&amp;quot;:&amp;quot;lessThan&amp;quot;,&lt;br /&gt;
         &amp;quot;comparisonSortField&amp;quot;:&amp;quot;productId&amp;quot;,&lt;br /&gt;
         &amp;quot;comparisonSortDataType&amp;quot;:&amp;quot;string&amp;quot;,&lt;br /&gt;
         &amp;quot;comparisonValue&amp;quot;:&amp;quot;eeee&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;634dd9295fcb1834de0a6ed1f1ab8a9fa06c4d7f&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;from&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;aggregate&amp;quot;:&amp;quot;min&amp;quot;,&lt;br /&gt;
         &amp;quot;sortFields&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;fieldName&amp;quot;:&amp;quot;SellOfferManager_CalCombinedPricingUniqueRequestId&amp;quot;,&lt;br /&gt;
               &amp;quot;dataType&amp;quot;:&amp;quot;string&amp;quot;,&lt;br /&gt;
               &amp;quot;sortOrder&amp;quot;: 'descending',&lt;br /&gt;
               &amp;quot;refFieldNameId&amp;quot;: &amp;quot;ref_hash_SellOfferManager_CalCombinedPricingUniqueRequestId&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;requiredDataObjects&amp;quot;:{&lt;br /&gt;
            &amp;quot;ref_hash_SellOfferManager_CalCombinedPricingUniqueRequestId&amp;quot;: {&lt;br /&gt;
               &amp;quot;fieldName&amp;quot;:&amp;quot;SellOfferManager_CalCombinedPricingUniqueRequestId&amp;quot;,&lt;br /&gt;
               &amp;quot;linkPathObjectId&amp;quot;:&amp;quot;2794814ec253fc93496bfcb50ea18ebfe640bf4d&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;d3fc84fa4444406cef2de49baf53d38ab86cd2e0&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;orderPrice&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;from&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;requestProperties&amp;quot;:{&lt;br /&gt;
            &amp;quot;tag_sellOfferPlan&amp;quot;:&amp;quot;bbbb&amp;quot;,&lt;br /&gt;
            &amp;quot;tag_sellOfferPlanDeliveryMethodLink&amp;quot;:&amp;quot;bbbb&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;perParentCombinationIds&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;tag&amp;quot;:&amp;quot;tag_deliverTo&amp;quot;,&lt;br /&gt;
               &amp;quot;filterMainId&amp;quot;:&amp;quot;e0b8534452e98796f144c83a221764ef32db5ab6&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;applyCombinations&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;tag&amp;quot;:&amp;quot;tag_sellOfferPlanUserPaymentMethodLink&amp;quot;,&lt;br /&gt;
               &amp;quot;filterMainId&amp;quot;:&amp;quot;51509dea0a7ba2746dbd24769b8e777f1411f3ff&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;2b0537fa34ee1d259488fce12204dd549e1c98a3&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;to&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;requestProperties&amp;quot;:{&lt;br /&gt;
            &amp;quot;tag_deliverTo&amp;quot;:&amp;quot;aaaa&amp;quot;,&lt;br /&gt;
            &amp;quot;tag_sellOfferPlanDeliveryMethodLink&amp;quot;:&amp;quot;bbbb&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;applyCombinations&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;tag&amp;quot;:&amp;quot;tag_sellOfferPlan&amp;quot;,&lt;br /&gt;
               &amp;quot;filterMainId&amp;quot;:&amp;quot;88d9c5b9ab36d8c3ebf17e8322541b9c64cae25b&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;tag&amp;quot;:&amp;quot;tag_sellOfferPlanUserPaymentMethodLink&amp;quot;,&lt;br /&gt;
               &amp;quot;filterMainId&amp;quot;:&amp;quot;51509dea0a7ba2746dbd24769b8e777f1411f3ff&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;11704ae9a828b4709300964e2e0361bad13db5c3&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;from&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;aggregate&amp;quot;:&amp;quot;average&amp;quot;,&lt;br /&gt;
         &amp;quot;sortFields&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;fieldName&amp;quot;:&amp;quot;sellOfferHandlerServiceTag&amp;quot;,&lt;br /&gt;
               &amp;quot;dataType&amp;quot;:&amp;quot;string&amp;quot;,&lt;br /&gt;
               &amp;quot;sortOrder&amp;quot;: 'descending',&lt;br /&gt;
            }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;combine&amp;quot;:true&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;964050f23f92b45a1ea573a573c50ae3ca2bae18&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;orderPrice&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;from&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;requestProperties&amp;quot;:{&lt;br /&gt;
            &amp;quot;tag_sellOfferPlan&amp;quot;:&amp;quot;aaaa&amp;quot;,&lt;br /&gt;
            &amp;quot;tag_sellOfferPlanDeliveryMethodLink&amp;quot;:&amp;quot;bbbb&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;applyCombinations&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;tag&amp;quot;:&amp;quot;tag_deliverTo&amp;quot;,&lt;br /&gt;
               &amp;quot;filterMainId&amp;quot;:&amp;quot;d7a7f875254e856b4205075826631ec042b4c821&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;tag&amp;quot;:&amp;quot;tag_sellOfferPlanUserPaymentMethodLink&amp;quot;,&lt;br /&gt;
               &amp;quot;filterMainId&amp;quot;:&amp;quot;b96447ae98c95858694ca5ec407750c559825930&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;comparison&amp;quot;:&amp;quot;highLow&amp;quot;,&lt;br /&gt;
         &amp;quot;comparisonSortField&amp;quot;:&amp;quot;sellOfferHandlerServiceTag&amp;quot;,&lt;br /&gt;
		 &amp;quot;comparisonSortDataType&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
         &amp;quot;comparisonValue&amp;quot;:&amp;quot;aaaa&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;sortFields&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;fieldName&amp;quot;:&amp;quot;productId&amp;quot;,&lt;br /&gt;
         &amp;quot;dataType&amp;quot;:&amp;quot;string&amp;quot;,&lt;br /&gt;
         &amp;quot;sortOrder&amp;quot;: 'descending',&lt;br /&gt;
         // refFieldNameId: '2fece71f6bb34f0163610caaec63981c8dfa9de8'&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;fieldName&amp;quot;:&amp;quot;productId&amp;quot;,&lt;br /&gt;
         &amp;quot;dataType&amp;quot;:&amp;quot;array&amp;quot;,&lt;br /&gt;
         &amp;quot;sortOrder&amp;quot;: 'descending',&lt;br /&gt;
         &amp;quot;sortArray&amp;quot;:[&lt;br /&gt;
            &amp;quot;ffff&amp;quot;,&lt;br /&gt;
            &amp;quot;eeee&amp;quot;&lt;br /&gt;
         ],&lt;br /&gt;
         // refFieldNameId: '2fece71f6bb34f0163610caaec63981c8dfa9de8'&lt;br /&gt;
      }&lt;br /&gt;
   ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-17]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-17]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=Service_-_Search_Results&amp;diff=4307</id>
		<title>Service - Search Results</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=Service_-_Search_Results&amp;diff=4307"/>
		<updated>2026-04-22T05:11:59Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
Service that handles search result requests, feeding work to [[Service - Search Result (handlers)]]. Takes results from Complex Filter service which are identifier ids only and adds additional fields of information ready for display to end consumer, either directly if no sorting required, or via Sort Result service.&lt;br /&gt;
&lt;br /&gt;
Functions as a cache of Search Result data, so if subsequent matching requests come in they do not need to pass on to Complex Filter or find required data.&lt;br /&gt;
&lt;br /&gt;
= Repository =&lt;br /&gt;
&lt;br /&gt;
https://bitbucket.org/izara-core-search/izara-core-search-search-results/src/master/&lt;br /&gt;
&lt;br /&gt;
= DynamoDB tables =&lt;br /&gt;
&lt;br /&gt;
== [[Standard Config Table Per Service]] ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration tags ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;SearchType&amp;quot;,&lt;br /&gt;
	configTag: &amp;quot;xx&amp;quot; // {eg: sellOffer/Product/VariantProduct etc..}&lt;br /&gt;
	configValue: {&lt;br /&gt;
		complexFilterServiceName: &amp;quot;xx&amp;quot; // {service name of complex filter that handles this type}&lt;br /&gt;
		complexFilterType: &amp;quot;xx&amp;quot; // optional, if complexFilterType is different to searchType&lt;br /&gt;
		dataHandlerServiceName: &amp;quot;xx&amp;quot; {service name used to create function/queue names for finding data results, often a Manager service for the object}&lt;br /&gt;
		requireRequestProperties: {&lt;br /&gt;
			{requiredData fieldName}: [ // dependant on what requiredData requested&lt;br /&gt;
				&amp;quot;xx&amp;quot;,&lt;br /&gt;
				// .. {properties that must be received in the request for this searchType to process correctly}&lt;br /&gt;
			]&lt;br /&gt;
		},&lt;br /&gt;
		parentDataIdentifierFields: [&lt;br /&gt;
			&amp;quot;xx&amp;quot;, // these are always found with any request for this SearchType to add into ParentDataId table for each found data&lt;br /&gt;
		],&lt;br /&gt;
		childSearchResults: {&lt;br /&gt;
			{childSearchType}: { // searchType of child searchResult, matches filterType for building child complex filter&lt;br /&gt;
				searchResultsServiceName: &amp;quot;xx&amp;quot;, // allows for results to be saved by different deployed services&lt;br /&gt;
				requiredData: { // requiredData we request from the child searchType depending on what requiredData fields are set in the parent's request&lt;br /&gt;
					{parent requiredData fieldName}: [&lt;br /&gt;
						&amp;quot;xx&amp;quot;, // list of child requiredData fields to add&lt;br /&gt;
						// ..&lt;br /&gt;
					],&lt;br /&gt;
					// ..&lt;br /&gt;
				},&lt;br /&gt;
				passOnRequestProperties: [ // parent requestProperties to pass on to the child searchResult request, if not received in parent request will error&lt;br /&gt;
					&amp;quot;xx&amp;quot;, &lt;br /&gt;
					// .. &lt;br /&gt;
				]&lt;br /&gt;
			},&lt;br /&gt;
			// ..&lt;br /&gt;
		}&lt;br /&gt;
		hookBeforeFindDataServiceName: &amp;quot;xx&amp;quot;, // if set will send async request to external service before finding data&lt;br /&gt;
		hookAfterFindDataServiceName: &amp;quot;xx&amp;quot;, // if set will send async request to external service before finding data&lt;br /&gt;
	}&lt;br /&gt;
},&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SearchResultMain ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	searchResultId: &amp;quot;xx&amp;quot; // main element for one set of search results&lt;br /&gt;
	searchDetailId: &amp;quot;xx&amp;quot; // hashes of other values that affect result data&lt;br /&gt;
	searchResultMainStatus: &amp;quot;processing&amp;quot;,&lt;br /&gt;
	requiredData: {} // same as request&lt;br /&gt;
	childSearchIds: {&lt;br /&gt;
		{childSearchType}: [{array of childSearchIds}], // array of childSearchIds for this parent searchResultMain, split out by childSearchType&lt;br /&gt;
		// ..&lt;br /&gt;
	}&lt;br /&gt;
	createTime: currentTime.getTime(),&lt;br /&gt;
	expiryTime: expiryTime.getTime(),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: searchResultId&lt;br /&gt;
* sort key: searchDetailId&lt;br /&gt;
* searchResultId: for standard single filter searches is {searchType}_{filterMainId}&lt;br /&gt;
* searchDetailId: for standard single filter searches is {requestPropertiesHash}_{requiredDataHash}&lt;br /&gt;
* searchResultId: for combined search results is {searchType}_{searchParamsHash}&lt;br /&gt;
* searchDetailId: for combined search results is {requiredDataHash}&lt;br /&gt;
&lt;br /&gt;
== SearchResultParents ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	childSearchId: &amp;quot;xx&amp;quot;, // {searchResultId}_{searchDetailId}&lt;br /&gt;
	parentSearchId: &amp;quot;xx&amp;quot; // {searchResultId}_{searchDetailId}&lt;br /&gt;
	searchResultParentStatus: &amp;quot;processing&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: childSearchId&lt;br /&gt;
* sort key: parentSearchId&lt;br /&gt;
* when a SearchResultMain is finished it checks this table to see if any parents need to be processed&lt;br /&gt;
&lt;br /&gt;
== SearchResultData ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	searchId: &amp;quot;xx&amp;quot;, // {searchResultId}_{searchDetailId}&lt;br /&gt;
	dataId: &amp;quot;xx&amp;quot;, // id of element (sellOfferId/productId/variantProduct(type and id))&lt;br /&gt;
	// reconsider this field, does not scale: childData: {}, // only used when childId set in SearchResultMain, saves requiredData results for all matching child records&lt;br /&gt;
	searchResultDataStatus: &amp;quot;processing&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: searchId&lt;br /&gt;
* sort key: dataId&lt;br /&gt;
&lt;br /&gt;
== RequiredData ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	requiredDataId: &amp;quot;xx&amp;quot;, // {searchType}_{dataId}_{requestPropertiesHash} OR maybe hash of object of these values?&lt;br /&gt;
	fieldName: &amp;quot;xx&amp;quot;,&lt;br /&gt;
	requiredDataValue: &amp;quot;xx&amp;quot;, // value found for this reqdata field&lt;br /&gt;
	requiredDataStatus: &amp;quot;xx&amp;quot;, // waitingExternalData | complete | invalid&lt;br /&gt;
    createTime: currentTime.getTime(),&lt;br /&gt;
    expiryTime: expiryTime.getTime(),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: requiredDataId &lt;br /&gt;
* sort key: fieldName&lt;br /&gt;
* one record is one result we can calculate from external services, this can be shared by multiple SearchResultData records&lt;br /&gt;
* requiredDataId includes identifiers that can affect the data's value&lt;br /&gt;
* if keys too long for Dynamo we could hash an object containing all required fields and can add the values of each into the item separately, if needed&lt;br /&gt;
* primary key can be used when result comes back from external service, so that message must include all values needed to make requiredDataId&lt;br /&gt;
* can probably add fields during processing to store extra data for processing this SearchResultData record&lt;br /&gt;
* if we want to find all records for one SearchResultData we could search for just the partition key, but it might return additonal fields used by other searches with different requiredData&lt;br /&gt;
&lt;br /&gt;
== RequiredDataSearchResultData ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	requiredDataId_fieldName: &amp;quot;xx&amp;quot;, // {requiredDataId}_{fieldName}&lt;br /&gt;
	searchId: &amp;quot;xx&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: requiredDataId_fieldName&lt;br /&gt;
* sort key: searchId&lt;br /&gt;
* can extract dataId from requiredDataId_fieldName to find primary key for SearchResultData&lt;br /&gt;
* used to create links between RequiredData results and all SearchResultData that need it&lt;br /&gt;
&lt;br /&gt;
== ParentDataId ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	parentId: &amp;quot;xx&amp;quot;, // {parent searchType}_{parent dataId}_{child searchResultId (searchType and filterMainId)}_{requestPropertiesHash}&lt;br /&gt;
	childDataId: &amp;quot;xx&amp;quot; // {child dataId}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: parentId, identifies one parent dataId matching to a specific childSearchResult, excluding requiredData which is unimportant in this context, only need to specify child searchType/filterMainId/requestPropertiesHash to identify what matching one unique set of parent dataIds&lt;br /&gt;
* sort key: childDataId&lt;br /&gt;
* child filterMainId is required because we will have different ranges of childIds stored depending on what filter was used to find them&lt;br /&gt;
&lt;br /&gt;
= requestProperties =&lt;br /&gt;
&lt;br /&gt;
These are properties that are added to a Search Result request that affect the data found, they may be required or optional. Because these properties can affect the value of data they must be added to SearchResultMain identifiers to differentiate batches of results.&lt;br /&gt;
&lt;br /&gt;
= requireRequestProperties =&lt;br /&gt;
&lt;br /&gt;
Some requiredData fields will need additional properties to be received in the initial request.&lt;br /&gt;
* example: variant/product/sellOffer pricing fields will require locationNodeId/s and browseQuantity&lt;br /&gt;
* example: all translations require language/s&lt;br /&gt;
&lt;br /&gt;
= Moving child SearchResult data to parent = &lt;br /&gt;
* eg: product searchType has sellOffer child searchType data&lt;br /&gt;
* eg: variantProduct searchType has product child searchType data&lt;br /&gt;
* parent must wait for child FindData to complete before can process parents FindData&lt;br /&gt;
* child SearchResult might already have completed before the parent request was received (ie by a different request), need to account for this&lt;br /&gt;
* (old design - can still use if have to, but would be best to separate results so can scale, eg if want to show details about child products, that could pass as a separate Search/Sort set of results including pagination) aggregate multiple child data into the parents data values, but also keep a record of all children in the parents data record&lt;br /&gt;
&lt;br /&gt;
= Multiple Search Results services =&lt;br /&gt;
&lt;br /&gt;
* design to allow for different implementations, eg catalogs can choose which Search Results service it uses&lt;br /&gt;
* could achieve this be having a setting in Catalog handlers or Catalog Manager that records which Search Result service the Catalog uses&lt;br /&gt;
&lt;br /&gt;
= browseQuantity for calculating prices =&lt;br /&gt;
&lt;br /&gt;
* when browsing, a user can define browseQuantity they want to buy (default 1), this would be injected into price calculation to obtain available price for each sellOffer&lt;br /&gt;
* different to filters, eg availableQuantity, which determines which sellOffers are returned. (we might have a method/hook that validates or updates the complex filter so these settings don't conflict, but not needed)&lt;br /&gt;
* added to requestProperties in request&lt;br /&gt;
* I think if we request prices for a SellOffer in a quantity it cannot handle, eg browseQuantity is 100 but selloffer only has 20 remaining, the pricing function should return an error, could then remove (or mark as not enough quantity available) such sellOffers, so they might still exist in search results and maybe sort results but show quantity not/available.&lt;br /&gt;
&lt;br /&gt;
= Notes = &lt;br /&gt;
&lt;br /&gt;
* Consider requests find all possible needed data, even if the current request does not use it, that way subsequent requests can feed off the same processed data, ie standardize requiredData at request level to use cache more often&lt;br /&gt;
* there might be a special case where we find all results with an empty filter, eg for a child Search Result request which is filtered only by the adult results and wants to not filter child results in any way, that would create a record for every item in the child request and include links to all parent dataIds, that data set could be used by any other request that matches searchType/requestPropertiesHash/requiredDataHash. Maybe work that in in the future as a separate check when processing parent requests so not need to send child request, or intentionally maintain that result set. Might be able to find other shared efficient results as well, however having cached results in RequiredData will also reduce a lot of work and maybe mitigate the need for this&lt;br /&gt;
* maybe could optimise querying data even further by copying final data for each RequiredData record into SearchResultData record, so not need to query RequiredData table, but maybe not needed as most consumer queries will point to SortResult&lt;br /&gt;
&lt;br /&gt;
= Normalize Structure SearchResult Request =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    searchResultId: &amp;quot;hash_filter_main&amp;quot;,&lt;br /&gt;
    searchDetailId: &amp;quot;hash_requiredData_main_all&amp;quot;,&lt;br /&gt;
    requiredDataObjects: {&lt;br /&gt;
      hash_fieldNameObject_A: {&lt;br /&gt;
        fieldName: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hash_fieldNameObject_B: {&lt;br /&gt;
        fieldName: &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
        linkPathObjectId: &amp;quot;hash_linkPathObject_A&amp;quot;,&lt;br /&gt;
        complexFilterCombinationIds: [ //* optional&lt;br /&gt;
          &amp;quot;hash_filter_of_use_for_combination&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      hash_fieldNameObject_B: {&lt;br /&gt;
        requiredDataType: 'variantAndOrProductReqData',&lt;br /&gt;
        xxxxRequiredData: 'hash_requiredData_of_xxxx',&lt;br /&gt;
        yyyyRequiredData: 'hash_requirdData_of_yyyy'&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    searchParams: {&lt;br /&gt;
      //* case this request use filter main&lt;br /&gt;
      filterObjectId: &amp;quot;hash_filter_main&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      //* case this request send identifiers and not send request to ComplexFilter Service&lt;br /&gt;
      identifiersIds: [&lt;br /&gt;
        {&lt;br /&gt;
          xxId: &amp;quot;xxxx_1&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          xxId: &amp;quot;xxxx_2&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
      ],&lt;br /&gt;
&lt;br /&gt;
      //* case searchResult generated&lt;br /&gt;
      searchResultGeneratedParam: { //* front end cannot create searchParams --&amp;gt; searchResultGeneratedParam&lt;br /&gt;
        xxxx: { //* sort request of each objType&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;XXXX&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          searchResultId: &amp;quot;11111&amp;quot;,&lt;br /&gt;
          searchDetailId: &amp;quot;22222&amp;quot;,&lt;br /&gt;
          requiredDataObject: {&lt;br /&gt;
            hash_requiredData_of_xxxx: {&lt;br /&gt;
              fieldName: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          searchParams: {&lt;br /&gt;
            filterObjectId: &amp;quot;11111&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          filterElements: {&lt;br /&gt;
            11111: {&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;XXXX&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              filterElement: {&lt;br /&gt;
                filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                partitionKeyValues: {&lt;br /&gt;
                  xxxxId: {&lt;br /&gt;
                    value: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
                  }&lt;br /&gt;
                }&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          linkPathObjects: {},&lt;br /&gt;
          linkPathSteps: {},&lt;br /&gt;
          sortFields: [&lt;br /&gt;
            {&lt;br /&gt;
              fieldName: &amp;quot;yyyy&amp;quot;,&lt;br /&gt;
              dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
              sortOrder: &amp;quot;descending&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        },&lt;br /&gt;
        yyyy: { //* sort request of each objType&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;YYYY&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;yyyy&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          searchResultId: &amp;quot;33333&amp;quot;,&lt;br /&gt;
          searchDetailId: &amp;quot;44444&amp;quot;,&lt;br /&gt;
          requiredDataObject: {&lt;br /&gt;
            hash_requirdData_of_yyyy: {&lt;br /&gt;
              fieldName: &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
              linkPathObjectId: &amp;quot;hash_LinkPathObject_B&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          searchParams: {&lt;br /&gt;
            filterObjectId: &amp;quot;33333&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          filterElements: {&lt;br /&gt;
            33333: {&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;YYYY&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;yyyy&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              filterElement: {&lt;br /&gt;
                filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                partitionKeyValues: {&lt;br /&gt;
                  yyyyId: {&lt;br /&gt;
                    value: &amp;quot;yyyy&amp;quot;&lt;br /&gt;
                  }&lt;br /&gt;
                }&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          linkPathObjects: {&lt;br /&gt;
            hash_LinkPathObject_B: {&lt;br /&gt;
              initialObjType: {&lt;br /&gt;
                serviceTag: &amp;quot;YYYY&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;yyyy&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              linkSteps: [&lt;br /&gt;
                &amp;quot;linkStep_B_1&amp;quot;,&lt;br /&gt;
                &amp;quot;linkStep_B_2&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          linkPathSteps: {&lt;br /&gt;
            linkStep_B_1: {&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;x&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasX&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;from&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              //* setting of links&lt;br /&gt;
            },&lt;br /&gt;
            linkStep_B_2: {&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;x&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasX&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;from&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              //* setting of links&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          sortFields: [&lt;br /&gt;
            {&lt;br /&gt;
              fieldName: &amp;quot;yyyy&amp;quot;,&lt;br /&gt;
              dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
              sortOrder: &amp;quot;descending&amp;quot;,&lt;br /&gt;
              refFieldNameId: &amp;quot;hash_requirdData_of_yyyy&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    filterElements: { //* other type can see in structure_complexFilter&lt;br /&gt;
      hash_filter_main: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        filterElement: {&lt;br /&gt;
          filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
          partitionKeyValues: {&lt;br /&gt;
            xxId: {&lt;br /&gt;
              value: &amp;quot;xxx&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      hash_filter_of_use_for_combination: {&lt;br /&gt;
        //* same filter element&lt;br /&gt;
      },&lt;br /&gt;
      hash_filter_of_use_for_perParent: {&lt;br /&gt;
        //* has filter element special&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        filterElement: {&lt;br /&gt;
          filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
          partitionKeyValues: {&lt;br /&gt;
            xxId: {&lt;br /&gt;
              valueType: &amp;quot;perParentIdentifiers&amp;quot;, //* special for perParent to add parent identifiers of link from IntemediateIdentifiers table&lt;br /&gt;
              perParentIdentifierFieldname: &amp;quot;xxId&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      ref_filterMainIdA: {&lt;br /&gt;
        //* same filter element&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    linkPathObjects: {&lt;br /&gt;
      hash_linkPathObject_A: {&lt;br /&gt;
        initialObjType: {&lt;br /&gt;
          serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        linkSteps: [&lt;br /&gt;
          &amp;quot;linkStep_A_1&amp;quot;,&lt;br /&gt;
          &amp;quot;linkStep_A_2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      tttt: {&lt;br /&gt;
        //* same linkPathObject&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    linkPathSteps: {&lt;br /&gt;
      linkStep_A_1: {&lt;br /&gt;
        pathLinkType: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;x&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          relType: {&lt;br /&gt;
            serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
            relationshipTag: &amp;quot;hasX&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          direction: &amp;quot;from&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        //* setting of links&lt;br /&gt;
        requestProperties: {&lt;br /&gt;
          tag_xxx: &amp;quot;cccc&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        filterObjectId: &amp;quot;ref_filterMainIdA&amp;quot;,&lt;br /&gt;
        aggregate: 'max',&lt;br /&gt;
        sortFields: [&lt;br /&gt;
          {&lt;br /&gt;
            fieldName: 'xxxx',&lt;br /&gt;
            dataType: 'string',&lt;br /&gt;
            sortOrder: 'descending',&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            fieldName: 'tttt',&lt;br /&gt;
            dataType: 'string',&lt;br /&gt;
            sortOrder: 'descending',&lt;br /&gt;
            refFieldNameId: &amp;quot;d1b376c689a2de1370e30f7629edc0cefc8d29f0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        combine: &amp;quot;true&amp;quot;,&lt;br /&gt;
        requiredDataObjects: { //* use for linkPath has linkPath&lt;br /&gt;
          d1b376c689a2de1370e30f7629edc0cefc8d29f0: {&lt;br /&gt;
            fieldName: 'tttt',&lt;br /&gt;
            linkPathObjectId: &amp;quot;tttt&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        perParentCombinationIds: [&lt;br /&gt;
          {&lt;br /&gt;
            tag: 'tag_yyyy',&lt;br /&gt;
            filterMainId: 'hash_filter_of_use_for_perParent'&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        applyCombinations: [&lt;br /&gt;
          {&lt;br /&gt;
            tag: 'tag_xxxx',&lt;br /&gt;
            filterMainId: 'hash_filter_of_use_for_combination'&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
        comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
        comparisonSortDataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
        comparisonValue: 20,&lt;br /&gt;
      },&lt;br /&gt;
      linkStep_A_2: {&lt;br /&gt;
        pathLinkType: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;x&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          relType: {&lt;br /&gt;
            serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
            relationshipTag: &amp;quot;hasX&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          direction: &amp;quot;from&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        //* setting of links&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= hash linkPath =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
searchDetailId = 'all_requiredDataHash'&lt;br /&gt;
&lt;br /&gt;
all_requiredDataHash = hash(&lt;br /&gt;
  {&lt;br /&gt;
    requiredDataObjects: { all_fieldNameObjects },&lt;br /&gt;
    linkPathObjects: { all_linkPathObjects }, //*if not have, set default = {}&lt;br /&gt;
    linkPathSteps: { all_linkPathSteps } //*if not have, set default = {}&lt;br /&gt;
  }&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
requiredDataObjects = {&lt;br /&gt;
  hash_fieldNameObject: {&lt;br /&gt;
    fieldName: &amp;quot;A_fieldName&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  hash_fieldNameObject2: {&lt;br /&gt;
    fieldName: &amp;quot;C_fieldName&amp;quot;,&lt;br /&gt;
    linkPathObjectId: &amp;quot;hash_linkPathObject&amp;quot;,&lt;br /&gt;
    complexFilterCombinationIds: [&lt;br /&gt;
      &amp;quot;hash_filter_element_for_complexFilterCombination&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
hash_fieldNameObject = hash({&lt;br /&gt;
  fieldName: {&lt;br /&gt;
    fieldName: &amp;quot;fieldName&amp;quot;,&lt;br /&gt;
    linkPathObjectId: &amp;quot;hash_linkPathObject&amp;quot;, //optional, if requiredData has linkPath&lt;br /&gt;
    complexFilterCombinationIds: [&lt;br /&gt;
      &amp;quot;hash_filter_element_for_complexFilterCombination&amp;quot;&lt;br /&gt;
    ] //optional, if requiredData has combination complexFilter&lt;br /&gt;
  },&lt;br /&gt;
  linkPathObjects: {&lt;br /&gt;
    hash_linkPathObject: {&lt;br /&gt;
      initialObjType: { A },&lt;br /&gt;
      linkSteps: [&amp;quot;hash_linkStep1&amp;quot;, &amp;quot;hash_linkStep2&amp;quot;]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  linkPathSteps: {&lt;br /&gt;
    hash_linkStep1: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: { B },&lt;br /&gt;
        relType: { hasB },&lt;br /&gt;
        direction: &amp;quot;&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      //* other settings of each link //* optional&lt;br /&gt;
      filterObjectId: &amp;quot;&amp;quot;,&lt;br /&gt;
      requestProperties: {},&lt;br /&gt;
      aggregate: &amp;quot;&amp;quot;,&lt;br /&gt;
      sortFields: [],&lt;br /&gt;
      requiredDataObjects: {},&lt;br /&gt;
      combine: true | false,&lt;br /&gt;
      perParentCombinationIds: [],&lt;br /&gt;
      applyCombinations: [],&lt;br /&gt;
      comparison: &amp;quot;&amp;quot;,&lt;br /&gt;
      comparisonSortField: &amp;quot;&amp;quot;,&lt;br /&gt;
      comparisonSortDataType: &amp;quot;&amp;quot;,&lt;br /&gt;
      comparisonValue: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    hash_linkStep2: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: { C },&lt;br /&gt;
        relType: { hasC },&lt;br /&gt;
        direction: &amp;quot;&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      //* other settings of each link //* optional&lt;br /&gt;
      filterObjectId: &amp;quot;&amp;quot;,&lt;br /&gt;
      requestProperties: {},&lt;br /&gt;
      aggregate: &amp;quot;&amp;quot;,&lt;br /&gt;
      sortFields: [],&lt;br /&gt;
      requiredDataObjects: {},&lt;br /&gt;
      combine: true | false,&lt;br /&gt;
      perParentCombinationIds: [],&lt;br /&gt;
      applyCombinations: [],&lt;br /&gt;
      comparison: &amp;quot;&amp;quot;,&lt;br /&gt;
      comparisonSortField: &amp;quot;&amp;quot;,&lt;br /&gt;
      comparisonSortDataType: &amp;quot;&amp;quot;,&lt;br /&gt;
      comparisonValue: &amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
linkPathObjects = {&lt;br /&gt;
  hash_fieldNameObject2: {&lt;br /&gt;
    initialObjType: {},&lt;br /&gt;
    linkSteps: [&amp;quot;hash_linkStep1&amp;quot;, &amp;quot;hash_linkStep2&amp;quot;]&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
hash_fieldNameObject2 = hash({&lt;br /&gt;
  initialObjType: { A },&lt;br /&gt;
  linkSteps: [&amp;quot;hash_linkStep1&amp;quot;, &amp;quot;hash_linkStep2&amp;quot;]&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
linkPathSteps = {&lt;br /&gt;
  hash_linkStep1: {&lt;br /&gt;
    pathLinkType: {&lt;br /&gt;
      objType: { B },&lt;br /&gt;
      relType: { hasB },&lt;br /&gt;
      direction: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    //* other settings of each link //* optional&lt;br /&gt;
    filterObjectId: &amp;quot;&amp;quot;,&lt;br /&gt;
    requestProperties: {},&lt;br /&gt;
    aggregate: &amp;quot;&amp;quot;,&lt;br /&gt;
    sortFields: [],&lt;br /&gt;
    requiredDataObjects: {},&lt;br /&gt;
    combine: true | false,&lt;br /&gt;
    perParentCombinationIds: [],&lt;br /&gt;
    applyCombinations: [],&lt;br /&gt;
    comparison: &amp;quot;&amp;quot;,&lt;br /&gt;
    comparisonSortField: &amp;quot;&amp;quot;,&lt;br /&gt;
    comparisonSortDataType: &amp;quot;&amp;quot;,&lt;br /&gt;
    comparisonValue: &amp;quot;&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  hash_linkStep2: {&lt;br /&gt;
    pathLinkType: {&lt;br /&gt;
      objType: { C },&lt;br /&gt;
      relType: { hasC },&lt;br /&gt;
      direction: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    //* other settings of each link //* optional&lt;br /&gt;
    filterObjectId: &amp;quot;&amp;quot;,&lt;br /&gt;
    requestProperties: {},&lt;br /&gt;
    aggregate: &amp;quot;&amp;quot;,&lt;br /&gt;
    sortFields: [],&lt;br /&gt;
    requiredDataObjects: {},&lt;br /&gt;
    combine: true | false,&lt;br /&gt;
    perParentCombinationIds: [],&lt;br /&gt;
    applyCombinations: [],&lt;br /&gt;
    comparison: &amp;quot;&amp;quot;,&lt;br /&gt;
    comparisonSortField: &amp;quot;&amp;quot;,&lt;br /&gt;
    comparisonSortDataType: &amp;quot;&amp;quot;,&lt;br /&gt;
    comparisonValue: &amp;quot;&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
hash_linkStep1 = hash({&lt;br /&gt;
  pathLinkType: {&lt;br /&gt;
    objType: { B },&lt;br /&gt;
    relType: { hasB },&lt;br /&gt;
    direction: &amp;quot;&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  //* other settings of each link //* optional&lt;br /&gt;
  filterObjectId: &amp;quot;&amp;quot;,&lt;br /&gt;
  requestProperties: {},&lt;br /&gt;
  aggregate: &amp;quot;&amp;quot;,&lt;br /&gt;
  sortFields: [],&lt;br /&gt;
  requiredDataObjects: {},&lt;br /&gt;
  combine: true | false,&lt;br /&gt;
  perParentCombinationIds: [],&lt;br /&gt;
  applyCombinations: [],&lt;br /&gt;
  comparison: &amp;quot;&amp;quot;,&lt;br /&gt;
  comparisonSortField: &amp;quot;&amp;quot;,&lt;br /&gt;
  comparisonSortDataType: &amp;quot;&amp;quot;,&lt;br /&gt;
  comparisonValue: &amp;quot;&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Working documents =&lt;br /&gt;
&lt;br /&gt;
[[:Category:Working_documents - Search Results|Working_documents - Search Results]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Backend services| Search Results]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4306</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4306"/>
		<updated>2026-04-22T03:54:52Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as params sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
	// header/footer filterDataField elements reference valueUserTag&lt;br /&gt;
&lt;br /&gt;
	&amp;quot;elements&amp;quot;: {&lt;br /&gt;
		// shared types&lt;br /&gt;
		&amp;quot;elementId12&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;freetext&amp;quot;,&lt;br /&gt;
			&amp;quot;value&amp;quot;: &amp;quot;aa&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// headerFooter types&lt;br /&gt;
		&amp;quot;elementId1&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;valueUserTag&amp;quot;: &amp;quot;userTag_9&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot; // || &amp;quot;select&amp;quot; || &amp;quot;checkbox&amp;quot; || &amp;quot;radio&amp;quot; ,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId2&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;select&amp;quot;,&lt;br /&gt;
			&amp;quot;options&amp;quot;: [&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option1&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
              },&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option2&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
			],&lt;br /&gt;
		},&lt;br /&gt;
        &amp;quot;elementId21&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;checkbox&amp;quot;,&lt;br /&gt;
			&amp;quot;onSetting:{&lt;br /&gt;
               optionText:&amp;quot;on&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
             &amp;quot;offSetting&amp;quot;:{&lt;br /&gt;
               optionText:&amp;quot;off&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
		   &lt;br /&gt;
           &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId3&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;sort&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;downArrow&amp;quot;, // || upArrow&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
			&amp;quot;dataType&amp;quot;: &amp;quot;number&amp;quot;, // &amp;quot;number&amp;quot; | &amp;quot;string&amp;quot;&lt;br /&gt;
			&amp;quot;sortOrder&amp;quot;: &amp;quot;ascending&amp;quot; // &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot; (default ascending)&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId4&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;numberOfRows&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot; // || &amp;quot;select&amp;quot; || &amp;quot;checkbox&amp;quot; || &amp;quot;radio&amp;quot; ,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId5&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;:&amp;quot;numberOfRows&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;select&amp;quot;,&lt;br /&gt;
			&amp;quot;options&amp;quot;: [&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;page5&amp;quot;,&lt;br /&gt;
               value:5&lt;br /&gt;
             },&lt;br /&gt;
	       	 {&lt;br /&gt;
               optionText:&amp;quot;page7&amp;quot;,&lt;br /&gt;
               value:7&lt;br /&gt;
             },&lt;br /&gt;
			],&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId6&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;submit&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;submit&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: [&amp;quot;sort&amp;quot;, &amp;quot;numberOfRows&amp;quot;, &amp;quot;filter&amp;quot;] &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId7&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;reset&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;reset rows&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: [&amp;quot;sort&amp;quot;, &amp;quot;numberOfRows&amp;quot;, &amp;quot;filter&amp;quot;] &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId9&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;totalDatafield&amp;quot;,&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
			&amp;quot;showIfNotAllRowsLoaded&amp;quot;: true // || false&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId11&amp;quot;:{&lt;br /&gt;
			// will need to link to per record check box&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkAction&amp;quot;,&lt;br /&gt;
			&amp;quot;action&amp;quot;: &amp;quot;on&amp;quot; // on | off | switch&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;, // have normalized list of bulkActionTags, with list of &amp;quot;bulkAction&amp;quot; and &amp;quot;bulkActionCheckBox&amp;quot; elements linked to it&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId8&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;pageNumbers&amp;quot;,&lt;br /&gt;
			&amp;quot;linksAfter&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToLastPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenLastPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;gt;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;linksBefore&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToFirstPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenFirstPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;showPagesAfter&amp;quot;: 3,&lt;br /&gt;
			&amp;quot;showPagesBefore&amp;quot;: 3&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		// records types    &lt;br /&gt;
		&amp;quot;elementId5&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;requiredDataLinkStepObject&amp;quot;, // in record&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementIdxx&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkActionCheckBox&amp;quot;,&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	valueUserTags: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
            valueSource: 'perParentIdentifier',&lt;br /&gt;
            perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	bulkActionUserTags: {&lt;br /&gt;
		tagA:{&lt;br /&gt;
			bulkActions: [&lt;br /&gt;
                &amp;quot;elementId11&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
            bulkActionCheckBoxes: [&lt;br /&gt;
                &amp;quot;elementIdxx&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
		},&lt;br /&gt;
        // ...&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
  objType: { //* main objType&lt;br /&gt;
    serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
    objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  initialLogicalElementId: &amp;quot;uuid_openBracket_1&amp;quot;,&lt;br /&gt;
  logicalElements: {&lt;br /&gt;
    uuid_openBracket_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: null,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    uuid_logical_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_openBracket_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_operation_1&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      partitionKeyValueUserTags: {&lt;br /&gt;
        productId: &amp;quot;valueUserTag_1&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      // sortKeyValueUserTags: {&lt;br /&gt;
      //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
      // },&lt;br /&gt;
      // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
      // conditionalFieldValues: [&lt;br /&gt;
      //  {&lt;br /&gt;
      //    fieldName: &amp;quot;language&amp;quot;,&lt;br /&gt;
      //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
      //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
      //  }&lt;br /&gt;
      // ]&lt;br /&gt;
    },&lt;br /&gt;
    uuid_operation_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_childComplexFilter_1&amp;quot;,&lt;br /&gt;
      operation: &amp;quot;OR&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    uuid_childComplexFilter_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_operation_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_closeBracket_1&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      childLogicalElementId: &amp;quot;uuid_logical_2&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    uuid_logical_2: {&lt;br /&gt;
      logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_childComplexFilter_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      partitionKeyValueUserTags: {&lt;br /&gt;
        sellOfferId: &amp;quot;valueUserTag_2&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      // sortKeyValueUserTags: {&lt;br /&gt;
      //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
      // },&lt;br /&gt;
      // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
      // conditionalFieldValues: [&lt;br /&gt;
      //  {&lt;br /&gt;
      //    fieldName: &amp;quot;language&amp;quot;,&lt;br /&gt;
      //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
      //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
      //  }&lt;br /&gt;
      // ]&lt;br /&gt;
    },&lt;br /&gt;
    uuid_closeBracket_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;closeBracket&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_childComplexFilter_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    uuid_operation_2: {&lt;br /&gt;
      logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_closeBracket_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_translateIds_1&amp;quot;,&lt;br /&gt;
      operation: &amp;quot;AND&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    uuid_translateIds_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;translateIds&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_operation_3&amp;quot;,&lt;br /&gt;
      objType: {&lt;br /&gt;
        objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      requestProperties: {&lt;br /&gt;
        tag_xxxx: &amp;quot;valueUserTag_5&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      childIdentifiers: [&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferId: &amp;quot;valueUserTag_3&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferId: &amp;quot;valueUserTag_4&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
    uuid_operation_3: {&lt;br /&gt;
      logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_translateIds_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_traversal_1&amp;quot;,&lt;br /&gt;
      operation: &amp;quot;AND&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    uuid_traversal_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_operation_3&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
      objType: {&lt;br /&gt;
        objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      traversalSteps: [&lt;br /&gt;
        &amp;quot;hash_traversal_1&amp;quot;,&lt;br /&gt;
        &amp;quot;hash_traversal_2&amp;quot;,&lt;br /&gt;
        &amp;quot;hash_traversal_3&amp;quot;,&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  traversalSteps: {&lt;br /&gt;
    hash_traversal_1: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      //* setting of traversal step&lt;br /&gt;
      fieldValueUserTags: [&lt;br /&gt;
        {&lt;br /&gt;
          productId: &amp;quot;valueUserTag_6&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
      ],  //optional, if this step is not last step&lt;br /&gt;
      relationshipProperties: {&lt;br /&gt;
        // timestamp: 1231456 //or will ref value???? ====&amp;gt; not sure?&lt;br /&gt;
        timestamp: &amp;quot;valueUserTag_7&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hopsPassObjType: true, //optional //* สามารถ hops ได้ทุก step ยกเว้น step สุดท้าย = traversal_5&lt;br /&gt;
      hopsStart: 1, //optional default: 1&lt;br /&gt;
      hopsEnd: 10, //optional&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_2: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      fieldValueUserTags: [&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferId: &amp;quot;valueUserTag_8&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
      ],//optional&lt;br /&gt;
      //* traversal before last traversal cannot set hopsPassObjType = true&lt;br /&gt;
      hopsEnd: 10, //optional&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_3: {&lt;br /&gt;
      fieldValueUserTags: [&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferPlanId: &amp;quot;valueUserTag_9&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          currencyId: &amp;quot;valueUserTag_10&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferPlanId: &amp;quot;valueUserTag_11&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_combinationComplexFilter_1: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;localtionLink&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasLocationLink&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      //* setting of traversal step&lt;br /&gt;
      hopsPassObjType: true, //optional //* สามารถ hops ได้ทุก step ยกเว้น step สุดท้าย = traversal_5&lt;br /&gt;
      hopsStart: 1, //optional default: 1&lt;br /&gt;
      hopsEnd: 10, //optional&lt;br /&gt;
&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_combinationComplexFilter_2: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;isLocationNode&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hopsEnd: 10, //optional&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_combinationComplexFilter_3: {&lt;br /&gt;
      fieldValueUserTags: [&lt;br /&gt;
        {&lt;br /&gt;
          locationNodeId: &amp;quot;valueUserTag_21&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          locationNodeId: &amp;quot;valueUserTag_22&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
    // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
    &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
    &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
  ],&lt;br /&gt;
  complexFilterCombinations: {&lt;br /&gt;
    hash_complexFilterCombinationA: {&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      initialLogicalElementId: &amp;quot;hash_traversal_combinationComplexFilter&amp;quot;,&lt;br /&gt;
      logicalElements: {&lt;br /&gt;
        //*traversal&lt;br /&gt;
        hash_traversal_combinationComplexFilter: {&lt;br /&gt;
          logicalElementType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
          previousLogicalElementId: null,&lt;br /&gt;
          nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
          objType: {&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;,&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
          traversalSteps: [&lt;br /&gt;
            &amp;quot;hash_traversal_combinationComplexFilter_1&amp;quot;,&lt;br /&gt;
            &amp;quot;hash_traversal_combinationComplexFilter_2&amp;quot;,&lt;br /&gt;
            &amp;quot;hash_traversal_combinationComplexFilter_3&amp;quot;,&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
    },&lt;br /&gt;
  },&lt;br /&gt;
  perParentCombinations: {&lt;br /&gt;
    hash_perParentCombinationA: {&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
      logicalElements: {&lt;br /&gt;
        child_complexFilter_1: {&lt;br /&gt;
          logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
          previousLogicalElementId: null,&lt;br /&gt;
          nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
          childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
            objType: {&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
              objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            relType: {&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
              relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            direction: &amp;quot;to&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_orderQuantity: &amp;quot;valueUserTag_13&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        logical_sellOffer: {&lt;br /&gt;
          logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
          previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          partitionKeyValueUserTags: {&lt;br /&gt;
            sellOfferId: &amp;quot;valueUserTag_14&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
          // sortKeyValueUserTags: {&lt;br /&gt;
          //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
          // },&lt;br /&gt;
          // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
          // conditionalFieldValues: [&lt;br /&gt;
          //  {&lt;br /&gt;
          //    fieldName: &amp;quot;language&amp;quot;,&lt;br /&gt;
          //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
          //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
          //  }&lt;br /&gt;
          // ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
  },&lt;br /&gt;
  requiredDataLinkStepObjects: {&lt;br /&gt;
    userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
      initialObjType: { //* main objType&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
    },&lt;br /&gt;
    userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
      initialObjType: { //* main objType&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
    }&lt;br /&gt;
    // userTag_LinkStepObjectC&lt;br /&gt;
    // userTag_LinkStepObjectD&lt;br /&gt;
  },&lt;br /&gt;
  requiredDataLinkSteps: {&lt;br /&gt;
    hash_linkStepA_1: {&lt;br /&gt;
      fieldName: &amp;quot;xxx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    hash_linkStepB_1: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      addFilterMain: true, //default: false =&amp;gt; need to add filterMain set = true&lt;br /&gt;
      filterElements: { //* filter in linkPath&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
        logicalElements: {&lt;br /&gt;
          logical_sellOffer_in_link: {&lt;br /&gt;
            logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
            previousLogicalElementId: null,&lt;br /&gt;
            nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
            objType: {&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
              objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            partitionKeyValueUserTags: {&lt;br /&gt;
              sellOfferId: &amp;quot;valueUserTag_14&amp;quot;,&lt;br /&gt;
            },&lt;br /&gt;
            // sortKeyValueUserTags: {&lt;br /&gt;
            //    productId: &amp;quot;valueUserTag_1&amp;quot;,&lt;br /&gt;
            // },&lt;br /&gt;
            // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
            conditionalFieldValues: [&lt;br /&gt;
              {&lt;br /&gt;
                fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                includeValueUserTags: [&amp;quot;valueUserTag_15&amp;quot;], //&lt;br /&gt;
                // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
              }&lt;br /&gt;
            ]&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
    },&lt;br /&gt;
    hash_linkStepB_2: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      requestProperties: {&lt;br /&gt;
        tag_deliverTo: &amp;quot;valueUserTag_16&amp;quot;,&lt;br /&gt;
        tag_sellOfferPlan: &amp;quot;valueUserTag_17&amp;quot;,&lt;br /&gt;
        // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;valueUserTag_18&amp;quot;,&lt;br /&gt;
        // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;valueUserTag_19&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
      sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
          requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
          dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
          sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
          dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
          sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
          dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
          sortByValueUserTags: [&amp;quot;valueUserTag_1&amp;quot;, &amp;quot;valueUserTag_2&amp;quot;],&lt;br /&gt;
          sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
      comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
      comparisonSortDataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
      comparisonValue: &amp;quot;valueUserTag_20&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    hash_linkStepB_3: {&lt;br /&gt;
      fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  sortFields: [&lt;br /&gt;
    {&lt;br /&gt;
      requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
      dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
      sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
      dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
      sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
      dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
      sortByValueUserTags: [&amp;quot;valueUserTag_1&amp;quot;, &amp;quot;valueUserTag_2&amp;quot;],&lt;br /&gt;
      sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  valueUserTags: {&lt;br /&gt;
    valueUserTag_1: {&lt;br /&gt;
      value: &amp;quot;1111&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_2: {&lt;br /&gt;
      value: &amp;quot;2222&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_3: {&lt;br /&gt;
      value: &amp;quot;3333&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_4: {&lt;br /&gt;
      value: &amp;quot;4444&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_5: {&lt;br /&gt;
      value: &amp;quot;5555&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_6: {&lt;br /&gt;
      value: &amp;quot;6666&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_7: {&lt;br /&gt;
      value: &amp;quot;7777&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_8: {&lt;br /&gt;
      value: &amp;quot;8888&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_9: {&lt;br /&gt;
      value: &amp;quot;9999&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_10: {&lt;br /&gt;
      value: &amp;quot;1010&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_11: {&lt;br /&gt;
      value: &amp;quot;1110&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_12: {&lt;br /&gt;
      value: &amp;quot;1212&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_13: {&lt;br /&gt;
      value: &amp;quot;1313&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_14: {&lt;br /&gt;
      valueSource: 'perParentIdentifier',&lt;br /&gt;
      perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_15: {&lt;br /&gt;
      value: &amp;quot;praewDev&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_16: {&lt;br /&gt;
      valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
      complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_17: {&lt;br /&gt;
      valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
      perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_20: {&lt;br /&gt;
      value: 50&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_21: {&lt;br /&gt;
      value: &amp;quot;2121&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_22: {&lt;br /&gt;
      value: &amp;quot;2221&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Future Ideas =&lt;br /&gt;
* requestProperties has tag_traversalType&lt;br /&gt;
* searchResult (backend) in searchParams that have identifiersIds. still not have in frontend.&lt;br /&gt;
* searchResult (backend) in searchParams that have searchResultGenerated. still not have in frontend  (ex. variantProduct) //* will add requiredDataType in requiredDataObject, too. &lt;br /&gt;
* for logicalElementsType: traversal has many fieldValueUserTags that use in traversal (backend). still not have in frontend &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//* in traversal type for fields in backend idea&lt;br /&gt;
&lt;br /&gt;
fields: { //* backend idea&lt;br /&gt;
  feildName: &amp;quot;value&amp;quot;,&lt;br /&gt;
  status: {&lt;br /&gt;
    anyValue: [&amp;quot;ACTIVE&amp;quot;, &amp;quot;PENDING&amp;quot;]&lt;br /&gt;
  },&lt;br /&gt;
  price: { //* not have&lt;br /&gt;
    comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
    value: 100&lt;br /&gt;
  },&lt;br /&gt;
  quantity: { //* not have&lt;br /&gt;
    comparison: &amp;quot;between&amp;quot;,&lt;br /&gt;
    valueBetweenStart: 10,&lt;br /&gt;
    valueBetweenEnd: 50&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4257</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4257"/>
		<updated>2026-04-09T01:50:43Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as params sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
	// header/footer filterDataField elements reference valueUserTag&lt;br /&gt;
&lt;br /&gt;
	&amp;quot;elements&amp;quot;: {&lt;br /&gt;
		// shared types&lt;br /&gt;
		&amp;quot;elementId12&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;freetext&amp;quot;,&lt;br /&gt;
			&amp;quot;value&amp;quot;: &amp;quot;aa&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// headerFooter types&lt;br /&gt;
		&amp;quot;elementId1&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;valueUserTag&amp;quot;: &amp;quot;userTag_9&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot; // || &amp;quot;select&amp;quot; || &amp;quot;checkbox&amp;quot; || &amp;quot;radio&amp;quot; ,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId2&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;select&amp;quot;,&lt;br /&gt;
			&amp;quot;options&amp;quot;: [&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option1&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
              },&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option2&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
			],&lt;br /&gt;
		},&lt;br /&gt;
        &amp;quot;elementId21&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;checkbox&amp;quot;,&lt;br /&gt;
			&amp;quot;onSetting:{&lt;br /&gt;
               optionText:&amp;quot;on&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
             &amp;quot;offSetting&amp;quot;:{&lt;br /&gt;
               optionText:&amp;quot;off&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
		   &lt;br /&gt;
           &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId3&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;sort&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;downArrow&amp;quot;, // || upArrow&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
			&amp;quot;dataType&amp;quot;: &amp;quot;number&amp;quot;, // &amp;quot;number&amp;quot; | &amp;quot;string&amp;quot;&lt;br /&gt;
			&amp;quot;sortOrder&amp;quot;: &amp;quot;ascending&amp;quot; // &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot; (default ascending)&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId4&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;numberOfRows&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot; // || &amp;quot;select&amp;quot; || &amp;quot;checkbox&amp;quot; || &amp;quot;radio&amp;quot; ,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId5&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;:&amp;quot;numberOfRows&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;select&amp;quot;,&lt;br /&gt;
			&amp;quot;options&amp;quot;: [&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;page5&amp;quot;,&lt;br /&gt;
               value:5&lt;br /&gt;
             },&lt;br /&gt;
	       	 {&lt;br /&gt;
               optionText:&amp;quot;page7&amp;quot;,&lt;br /&gt;
               value:7&lt;br /&gt;
             },&lt;br /&gt;
			],&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId6&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;submit&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;submit&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: [&amp;quot;sort&amp;quot;, &amp;quot;numberOfRows&amp;quot;, &amp;quot;filter&amp;quot;] &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId7&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;reset&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;reset rows&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: [&amp;quot;sort&amp;quot;, &amp;quot;numberOfRows&amp;quot;, &amp;quot;filter&amp;quot;] &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId9&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;totalDatafield&amp;quot;,&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
			&amp;quot;showIfNotAllRowsLoaded&amp;quot;: true // || false&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId11&amp;quot;:{&lt;br /&gt;
			// will need to link to per record check box&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkAction&amp;quot;,&lt;br /&gt;
			&amp;quot;action&amp;quot;: &amp;quot;on&amp;quot; // on | off | switch&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;, // have normalized list of bulkActionTags, with list of &amp;quot;bulkAction&amp;quot; and &amp;quot;bulkActionCheckBox&amp;quot; elements linked to it&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId8&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;pageNumbers&amp;quot;,&lt;br /&gt;
			&amp;quot;linksAfter&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToLastPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenLastPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;gt;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;linksBefore&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToFirstPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenFirstPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;showPagesAfter&amp;quot;: 3,&lt;br /&gt;
			&amp;quot;showPagesBefore&amp;quot;: 3&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		// records types    &lt;br /&gt;
		&amp;quot;elementId5&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;requiredDataLinkStepObject&amp;quot;, // in record&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementIdxx&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkActionCheckBox&amp;quot;,&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	valueUserTags: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
            valueSource: 'perParentIdentifier',&lt;br /&gt;
            perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	bulkActionUserTags: {&lt;br /&gt;
		tagA:{&lt;br /&gt;
			bulkActions: [&lt;br /&gt;
                &amp;quot;elementId11&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
            bulkActionCheckBoxes: [&lt;br /&gt;
                &amp;quot;elementIdxx&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
		},&lt;br /&gt;
        // ...&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
  objType: { //* main objType&lt;br /&gt;
    serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
    objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  initialLogicalElementId: &amp;quot;uuid_openBracket_1&amp;quot;,&lt;br /&gt;
  logicalElements: {&lt;br /&gt;
    uuid_openBracket_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: null,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    uuid_logical_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_openBracket_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_operation_1&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      partitionKeyValueUserTags: {&lt;br /&gt;
        productId: &amp;quot;valueUserTag_1&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      // sortKeyValueUserTags: {&lt;br /&gt;
      //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
      // },&lt;br /&gt;
      // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
      // conditionalFieldValues: [&lt;br /&gt;
      //  {&lt;br /&gt;
      //    fieldName: &amp;quot;language&amp;quot;,&lt;br /&gt;
      //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
      //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
      //  }&lt;br /&gt;
      // ]&lt;br /&gt;
    },&lt;br /&gt;
    uuid_operation_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_childComplexFilter_1&amp;quot;,&lt;br /&gt;
      operation: &amp;quot;OR&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    uuid_childComplexFilter_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_operation_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_closeBracket_1&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      childLogicalElementId: &amp;quot;uuid_logical_2&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    uuid_logical_2: {&lt;br /&gt;
      logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_childComplexFilter_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      partitionKeyValueUserTags: {&lt;br /&gt;
        sellOfferId: &amp;quot;valueUserTag_2&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      // sortKeyValueUserTags: {&lt;br /&gt;
      //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
      // },&lt;br /&gt;
      // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
      // conditionalFieldValues: [&lt;br /&gt;
      //  {&lt;br /&gt;
      //    fieldName: &amp;quot;language&amp;quot;,&lt;br /&gt;
      //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
      //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
      //  }&lt;br /&gt;
      // ]&lt;br /&gt;
    },&lt;br /&gt;
    uuid_closeBracket_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;closeBracket&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_childComplexFilter_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    uuid_operation_2: {&lt;br /&gt;
      logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_closeBracket_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_translateIds_1&amp;quot;,&lt;br /&gt;
      operation: &amp;quot;AND&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    uuid_translateIds_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;translateIds&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_operation_3&amp;quot;,&lt;br /&gt;
      objType: {&lt;br /&gt;
        objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      requestProperties: {&lt;br /&gt;
        tag_xxxx: &amp;quot;valueUserTag_5&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      childIdentifiers: [&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferId: &amp;quot;valueUserTag_3&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferId: &amp;quot;valueUserTag_4&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
    uuid_operation_3: {&lt;br /&gt;
      logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_translateIds_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_traversal_1&amp;quot;,&lt;br /&gt;
      operation: &amp;quot;AND&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    uuid_traversal_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_operation_3&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
      objType: {&lt;br /&gt;
        objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      traversalSteps: [&lt;br /&gt;
        &amp;quot;hash_traversal_1&amp;quot;,&lt;br /&gt;
        &amp;quot;hash_traversal_2&amp;quot;,&lt;br /&gt;
        &amp;quot;hash_traversal_3&amp;quot;,&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  traversalSteps: {&lt;br /&gt;
    hash_traversal_1: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      //* setting of traversal step&lt;br /&gt;
      fieldValueUserTags: [&lt;br /&gt;
        {&lt;br /&gt;
          productId: &amp;quot;valueUserTag_6&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
      ],  //optional, if this step is not last step&lt;br /&gt;
      relationshipProperties: {&lt;br /&gt;
        // timestamp: 1231456 //or will ref value???? ====&amp;gt; not sure?&lt;br /&gt;
        timestamp: &amp;quot;valueUserTag_7&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hopsPassObjType: true, //optional //* สามารถ hops ได้ทุก step ยกเว้น step สุดท้าย = traversal_5&lt;br /&gt;
      hopsStart: 1, //optional default: 1&lt;br /&gt;
      hopsEnd: 10, //optional&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_2: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      fieldValueUserTags: [&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferId: &amp;quot;valueUserTag_8&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
      ],//optional&lt;br /&gt;
      //* traversal before last traversal cannot set hopsPassObjType = true&lt;br /&gt;
      hopsEnd: 10, //optional&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_3: {&lt;br /&gt;
      fieldValueUserTags: [&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferPlanId: &amp;quot;valueUserTag_9&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          currencyId: &amp;quot;valueUserTag_10&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferPlanId: &amp;quot;valueUserTag_11&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_combinationComplexFilter_1: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;localtionLink&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasLocationLink&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      //* setting of traversal step&lt;br /&gt;
      hopsPassObjType: true, //optional //* สามารถ hops ได้ทุก step ยกเว้น step สุดท้าย = traversal_5&lt;br /&gt;
      hopsStart: 1, //optional default: 1&lt;br /&gt;
      hopsEnd: 10, //optional&lt;br /&gt;
&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_combinationComplexFilter_2: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;isLocationNode&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hopsEnd: 10, //optional&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_combinationComplexFilter_3: {&lt;br /&gt;
      fieldValueUserTags: [&lt;br /&gt;
        {&lt;br /&gt;
          locationNodeId: &amp;quot;valueUserTag_21&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          locationNodeId: &amp;quot;valueUserTag_22&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
    // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
    &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
    &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
  ],&lt;br /&gt;
  complexFilterCombinations: {&lt;br /&gt;
    hash_complexFilterCombinationA: {&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      initialLogicalElementId: &amp;quot;hash_traversal_combinationComplexFilter&amp;quot;,&lt;br /&gt;
      logicalElements: {&lt;br /&gt;
        //*traversal&lt;br /&gt;
        hash_traversal_combinationComplexFilter: {&lt;br /&gt;
          logicalElementType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
          previousLogicalElementId: null,&lt;br /&gt;
          nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
          objType: {&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;,&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
          traversalSteps: [&lt;br /&gt;
            &amp;quot;hash_traversal_combinationComplexFilter_1&amp;quot;,&lt;br /&gt;
            &amp;quot;hash_traversal_combinationComplexFilter_2&amp;quot;,&lt;br /&gt;
            &amp;quot;hash_traversal_combinationComplexFilter_3&amp;quot;,&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
    },&lt;br /&gt;
  },&lt;br /&gt;
  perParentCombinations: {&lt;br /&gt;
    hash_perParentCombinationA: {&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
      logicalElements: {&lt;br /&gt;
        child_complexFilter_1: {&lt;br /&gt;
          logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
          previousLogicalElementId: null,&lt;br /&gt;
          nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
          childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
            objType: {&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
              objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            relType: {&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
              relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            direction: &amp;quot;to&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_orderQuantity: &amp;quot;valueUserTag_13&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        logical_sellOffer: {&lt;br /&gt;
          logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
          previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          partitionKeyValueUserTags: {&lt;br /&gt;
            sellOfferId: &amp;quot;valueUserTag_14&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
          // sortKeyValueUserTags: {&lt;br /&gt;
          //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
          // },&lt;br /&gt;
          // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
          // conditionalFieldValues: [&lt;br /&gt;
          //  {&lt;br /&gt;
          //    fieldName: &amp;quot;language&amp;quot;,&lt;br /&gt;
          //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
          //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
          //  }&lt;br /&gt;
          // ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
  },&lt;br /&gt;
  requiredDataLinkStepObjects: {&lt;br /&gt;
    userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
      initialObjType: { //* main objType&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
    },&lt;br /&gt;
    userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
      initialObjType: { //* main objType&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
    }&lt;br /&gt;
    // userTag_LinkStepObjectC&lt;br /&gt;
    // userTag_LinkStepObjectD&lt;br /&gt;
  },&lt;br /&gt;
  requiredDataLinkSteps: {&lt;br /&gt;
    hash_linkStepA_1: {&lt;br /&gt;
      fieldName: &amp;quot;xxx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    hash_linkStepB_1: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      addFilterMain: true, //default: false =&amp;gt; need to add filterMain set = true&lt;br /&gt;
      filterElements: { //* filter in linkPath&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
        logicalElements: {&lt;br /&gt;
          logical_sellOffer_in_link: {&lt;br /&gt;
            logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
            previousLogicalElementId: null,&lt;br /&gt;
            nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
            objType: {&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
              objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            partitionKeyValueUserTags: {&lt;br /&gt;
              sellOfferId: &amp;quot;valueUserTag_14&amp;quot;,&lt;br /&gt;
            },&lt;br /&gt;
            // sortKeyValueUserTags: {&lt;br /&gt;
            //    productId: &amp;quot;valueUserTag_1&amp;quot;,&lt;br /&gt;
            // },&lt;br /&gt;
            // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
            conditionalFieldValues: [&lt;br /&gt;
              {&lt;br /&gt;
                fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                includeValueUserTags: [&amp;quot;valueUserTag_15&amp;quot;], //&lt;br /&gt;
                // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
              }&lt;br /&gt;
            ]&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
    },&lt;br /&gt;
    hash_linkStepB_2: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      requestProperties: {&lt;br /&gt;
        tag_deliverTo: &amp;quot;valueUserTag_16&amp;quot;,&lt;br /&gt;
        tag_sellOfferPlan: &amp;quot;valueUserTag_17&amp;quot;,&lt;br /&gt;
        // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;valueUserTag_18&amp;quot;,&lt;br /&gt;
        // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;valueUserTag_19&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
      sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
          requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
          dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
          sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
          dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
          sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
          dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
          sortByValueUserTags: [&amp;quot;valueUserTag_1&amp;quot;, &amp;quot;valueUserTag_2&amp;quot;],&lt;br /&gt;
          sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
      comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
      comparisonSortDataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
      comparisonValue: &amp;quot;valueUserTag_20&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    hash_linkStepB_3: {&lt;br /&gt;
      fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  sortFields: [&lt;br /&gt;
    {&lt;br /&gt;
      requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
      dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
      sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
      dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
      sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
      dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
      sortByValueUserTags: [&amp;quot;valueUserTag_1&amp;quot;, &amp;quot;valueUserTag_2&amp;quot;],&lt;br /&gt;
      sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  valueUserTags: {&lt;br /&gt;
    valueUserTag_1: {&lt;br /&gt;
      value: &amp;quot;1111&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_2: {&lt;br /&gt;
      value: &amp;quot;2222&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_3: {&lt;br /&gt;
      value: &amp;quot;3333&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_4: {&lt;br /&gt;
      value: &amp;quot;4444&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_5: {&lt;br /&gt;
      value: &amp;quot;5555&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_6: {&lt;br /&gt;
      value: &amp;quot;6666&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_7: {&lt;br /&gt;
      value: &amp;quot;7777&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_8: {&lt;br /&gt;
      value: &amp;quot;8888&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_9: {&lt;br /&gt;
      value: &amp;quot;9999&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_10: {&lt;br /&gt;
      value: &amp;quot;1010&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_11: {&lt;br /&gt;
      value: &amp;quot;1110&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_12: {&lt;br /&gt;
      value: &amp;quot;1212&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_13: {&lt;br /&gt;
      value: &amp;quot;1313&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_14: {&lt;br /&gt;
      valueSource: 'perParentIdentifier',&lt;br /&gt;
      perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_15: {&lt;br /&gt;
      value: &amp;quot;praewDev&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_16: {&lt;br /&gt;
      valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
      complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_17: {&lt;br /&gt;
      valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
      perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_20: {&lt;br /&gt;
      value: 50&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_21: {&lt;br /&gt;
      value: &amp;quot;2121&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_22: {&lt;br /&gt;
      value: &amp;quot;2221&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4256</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4256"/>
		<updated>2026-04-08T06:08:28Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as params sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
	// header/footer filterDataField elements reference valueUserTag&lt;br /&gt;
&lt;br /&gt;
	&amp;quot;elements&amp;quot;: {&lt;br /&gt;
		// shared types&lt;br /&gt;
		&amp;quot;elementId12&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;freetext&amp;quot;,&lt;br /&gt;
			&amp;quot;value&amp;quot;: &amp;quot;aa&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// headerFooter types&lt;br /&gt;
		&amp;quot;elementId1&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;valueUserTag&amp;quot;: &amp;quot;userTag_9&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot; // || &amp;quot;select&amp;quot; || &amp;quot;checkbox&amp;quot; || &amp;quot;radio&amp;quot; ,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId2&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;select&amp;quot;,&lt;br /&gt;
			&amp;quot;options&amp;quot;: [&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option1&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
              },&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option2&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
			],&lt;br /&gt;
		},&lt;br /&gt;
        &amp;quot;elementId21&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;checkbox&amp;quot;,&lt;br /&gt;
			&amp;quot;onSetting:{&lt;br /&gt;
               optionText:&amp;quot;on&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
             &amp;quot;offSetting&amp;quot;:{&lt;br /&gt;
               optionText:&amp;quot;off&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
		   &lt;br /&gt;
           &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId3&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;sort&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;downArrow&amp;quot;, // || upArrow&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
			&amp;quot;dataType&amp;quot;: &amp;quot;number&amp;quot;, // &amp;quot;number&amp;quot; | &amp;quot;string&amp;quot;&lt;br /&gt;
			&amp;quot;sortOrder&amp;quot;: &amp;quot;ascending&amp;quot; // &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot; (default ascending)&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId4&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;numberOfRows&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot; // || &amp;quot;select&amp;quot; || &amp;quot;checkbox&amp;quot; || &amp;quot;radio&amp;quot; ,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId5&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;:&amp;quot;numberOfRows&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;select&amp;quot;,&lt;br /&gt;
			&amp;quot;options&amp;quot;: [&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;page5&amp;quot;,&lt;br /&gt;
               value:5&lt;br /&gt;
             },&lt;br /&gt;
	       	 {&lt;br /&gt;
               optionText:&amp;quot;page7&amp;quot;,&lt;br /&gt;
               value:7&lt;br /&gt;
             },&lt;br /&gt;
			],&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId6&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;submit&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;submit&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: [&amp;quot;sort&amp;quot;, &amp;quot;numberOfRows&amp;quot;, &amp;quot;filter&amp;quot;] &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId7&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;reset&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;reset rows&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: [&amp;quot;sort&amp;quot;, &amp;quot;numberOfRows&amp;quot;, &amp;quot;filter&amp;quot;] &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId9&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;totalDatafield&amp;quot;,&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
			&amp;quot;showIfNotAllRowsLoaded&amp;quot;: true // || false&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId11&amp;quot;:{&lt;br /&gt;
			// will need to link to per record check box&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkAction&amp;quot;,&lt;br /&gt;
			&amp;quot;action&amp;quot;: &amp;quot;on&amp;quot; // on | off | switch&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;, // have normalized list of bulkActionTags, with list of &amp;quot;bulkAction&amp;quot; and &amp;quot;bulkActionCheckBox&amp;quot; elements linked to it&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId8&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;pageNumbers&amp;quot;,&lt;br /&gt;
			&amp;quot;linksAfter&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToLastPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenLastPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;gt;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;linksBefore&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToFirstPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenFirstPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;showPagesAfter&amp;quot;: 3,&lt;br /&gt;
			&amp;quot;showPagesBefore&amp;quot;: 3&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		// records types    &lt;br /&gt;
		&amp;quot;elementId5&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;requiredDataLinkStepObject&amp;quot;, // in record&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementIdxx&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkActionCheckBox&amp;quot;,&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	valueUserTags: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
            valueSource: 'perParentIdentifier',&lt;br /&gt;
            perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	bulkActionUserTags: {&lt;br /&gt;
		tagA:{&lt;br /&gt;
			bulkActions: [&lt;br /&gt;
                &amp;quot;elementId11&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
            bulkActionCheckBoxes: [&lt;br /&gt;
                &amp;quot;elementIdxx&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
		},&lt;br /&gt;
        // ...&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
  objType: { //* main objType&lt;br /&gt;
    serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
    objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  initialLogicalElementId: &amp;quot;uuid_openBracket_1&amp;quot;,&lt;br /&gt;
  logicalElements: {&lt;br /&gt;
    uuid_openBracket_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: null,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    uuid_logical_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_openBracket_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_operation_1&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      partitionKeyValueUserTags: {&lt;br /&gt;
        productId: &amp;quot;valueUserTag_1&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      // sortKeyValueUserTags: {&lt;br /&gt;
      //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
      // },&lt;br /&gt;
      // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
      // conditionalFieldValues: [&lt;br /&gt;
      //  {&lt;br /&gt;
      //    fieldName: &amp;quot;language&amp;quot;,&lt;br /&gt;
      //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
      //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
      //  }&lt;br /&gt;
      // ]&lt;br /&gt;
    },&lt;br /&gt;
    uuid_operation_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_childComplexFilter_1&amp;quot;,&lt;br /&gt;
      operation: &amp;quot;OR&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    uuid_childComplexFilter_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_operation_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_closeBracket_1&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      childLogicalElementId: &amp;quot;uuid_logical_2&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    uuid_logical_2: {&lt;br /&gt;
      logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_childComplexFilter_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      partitionKeyValueUserTags: {&lt;br /&gt;
        sellOfferId: &amp;quot;valueUserTag_2&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      // sortKeyValueUserTags: {&lt;br /&gt;
      //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
      // },&lt;br /&gt;
      // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
      // conditionalFieldValues: [&lt;br /&gt;
      //  {&lt;br /&gt;
      //    fieldName: &amp;quot;language&amp;quot;,&lt;br /&gt;
      //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
      //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
      //  }&lt;br /&gt;
      // ]&lt;br /&gt;
    },&lt;br /&gt;
    uuid_closeBracket_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;closeBracket&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_childComplexFilter_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    uuid_operation_2: {&lt;br /&gt;
      logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_closeBracket_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_translateIds_1&amp;quot;,&lt;br /&gt;
      operation: &amp;quot;AND&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    uuid_translateIds_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;translateIds&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_operation_3&amp;quot;,&lt;br /&gt;
      objType: {&lt;br /&gt;
        objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      requestProperties: {&lt;br /&gt;
        tag_xxxx: &amp;quot;valueUserTag_5&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      childIdentifiers: [&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferId: &amp;quot;valueUserTag_3&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferId: &amp;quot;valueUserTag_4&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
    uuid_operation_3: {&lt;br /&gt;
      logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_translateIds_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_traversal_1&amp;quot;,&lt;br /&gt;
      operation: &amp;quot;AND&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    uuid_traversal_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_operation_3&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
      objType: {&lt;br /&gt;
        objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      traversalSteps: [&lt;br /&gt;
        &amp;quot;hash_traversal_1&amp;quot;,&lt;br /&gt;
        &amp;quot;hash_traversal_2&amp;quot;,&lt;br /&gt;
        &amp;quot;hash_traversal_3&amp;quot;,&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  traversalSteps: {&lt;br /&gt;
    hash_traversal_1: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      //* setting of traversal step&lt;br /&gt;
      fieldValueUserTags: [&lt;br /&gt;
        {&lt;br /&gt;
          productId: &amp;quot;valueUserTag_6&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
      ],  //optional, if this step is not last step&lt;br /&gt;
      relationshipProperties: {&lt;br /&gt;
        // timestamp: 1231456 //or will ref value???? ====&amp;gt; not sure?&lt;br /&gt;
        timestamp: &amp;quot;valueUserTag_7&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hopsPassObjType: true, //optional //* สามารถ hops ได้ทุก step ยกเว้น step สุดท้าย = traversal_5&lt;br /&gt;
      hopsStart: 1, //optional default: 1&lt;br /&gt;
      hopsEnd: 10, //optional&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_2: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      fieldValueUserTags: [&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferId: &amp;quot;valueUserTag_8&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
      ],//optional&lt;br /&gt;
      //* traversal before last traversal cannot set hopsPassObjType = true&lt;br /&gt;
      hopsEnd: 10, //optional&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_3: {&lt;br /&gt;
      fieldValueUserTags: [&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferPlanId: &amp;quot;valueUserTag_9&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          currencyId: &amp;quot;valueUserTag_10&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferPlanId: &amp;quot;valueUserTag_11&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_combinationComplexFilter_1: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;localtionLink&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasLocationLink&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      //* setting of traversal step&lt;br /&gt;
      hopsPassObjType: true, //optional //* สามารถ hops ได้ทุก step ยกเว้น step สุดท้าย = traversal_5&lt;br /&gt;
      hopsStart: 1, //optional default: 1&lt;br /&gt;
      hopsEnd: 10, //optional&lt;br /&gt;
&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_combinationComplexFilter_2: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;isLocationNode&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hopsEnd: 10, //optional&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_combinationComplexFilter_3: {&lt;br /&gt;
      fieldValueUserTags: [&lt;br /&gt;
        {&lt;br /&gt;
          locationNodeId: &amp;quot;valueUserTag_21&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          locationNodeId: &amp;quot;valueUserTag_22&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
    // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
    &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
    &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
  ],&lt;br /&gt;
  complexFilterCombinations: {&lt;br /&gt;
    hash_complexFilterCombinationA: {&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      initialLogicalElementId: &amp;quot;hash_traversal_combinationComplexFilter&amp;quot;,&lt;br /&gt;
      logicalElements: {&lt;br /&gt;
        //*traversal&lt;br /&gt;
        hash_traversal_combinationComplexFilter: {&lt;br /&gt;
          logicalElementType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
          previousLogicalElementId: null,&lt;br /&gt;
          nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
          objType: {&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;,&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
          traversalSteps: [&lt;br /&gt;
            &amp;quot;hash_traversal_combinationComplexFilter_1&amp;quot;,&lt;br /&gt;
            &amp;quot;hash_traversal_combinationComplexFilter_2&amp;quot;,&lt;br /&gt;
            &amp;quot;hash_traversal_combinationComplexFilter_3&amp;quot;,&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
    },&lt;br /&gt;
  },&lt;br /&gt;
  perParentCombinations: {&lt;br /&gt;
    hash_perParentCombinationA: {&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
      logicalElements: {&lt;br /&gt;
        child_complexFilter_1: {&lt;br /&gt;
          logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
          previousLogicalElementId: null,&lt;br /&gt;
          nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
          childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
            objType: {&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
              objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            relType: {&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
              relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            direction: &amp;quot;to&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_orderQuantity: &amp;quot;valueUserTag_13&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        logical_sellOffer: {&lt;br /&gt;
          logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
          previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          partitionKeyValueUserTags: {&lt;br /&gt;
            sellOfferId: &amp;quot;valueUserTag_14&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
          // sortKeyValueUserTags: {&lt;br /&gt;
          //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
          // },&lt;br /&gt;
          // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
          // conditionalFieldValues: [&lt;br /&gt;
          //  {&lt;br /&gt;
          //    fieldName: &amp;quot;language&amp;quot;,&lt;br /&gt;
          //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
          //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
          //  }&lt;br /&gt;
          // ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
  },&lt;br /&gt;
  requiredDataLinkStepObjects: {&lt;br /&gt;
    userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
      initialObjType: { //* main objType&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
    },&lt;br /&gt;
    userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
      initialObjType: { //* main objType&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
    }&lt;br /&gt;
    // userTag_LinkStepObjectC&lt;br /&gt;
    // userTag_LinkStepObjectD&lt;br /&gt;
  },&lt;br /&gt;
  requiredDataLinkSteps: {&lt;br /&gt;
    hash_linkStepA_1: {&lt;br /&gt;
      fieldName: &amp;quot;xxx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    hash_linkStepB_1: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      addFilterMain: true, //default: false =&amp;gt; need to add filterMain set = true&lt;br /&gt;
      filterElements: { //* filter in linkPath&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
        logicalElements: {&lt;br /&gt;
          logical_sellOffer_in_link: {&lt;br /&gt;
            logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
            previousLogicalElementId: null,&lt;br /&gt;
            nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
            objType: {&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
              objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            partitionKeyValueUserTags: {&lt;br /&gt;
              sellOfferId: &amp;quot;valueUserTag_14&amp;quot;,&lt;br /&gt;
            },&lt;br /&gt;
            // sortKeyValueUserTags: {&lt;br /&gt;
            //    productId: &amp;quot;valueUserTag_1&amp;quot;,&lt;br /&gt;
            // },&lt;br /&gt;
            // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
            conditionalFieldValues: [&lt;br /&gt;
              {&lt;br /&gt;
                fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                includeValueUserTags: [&amp;quot;valueUserTag_15&amp;quot;], //&lt;br /&gt;
                // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
              }&lt;br /&gt;
            ]&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
    },&lt;br /&gt;
    hash_linkStepB_2: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      requestProperties: {&lt;br /&gt;
        tag_deliverTo: &amp;quot;valueUserTag_16&amp;quot;,&lt;br /&gt;
        tag_sellOfferPlan: &amp;quot;valueUserTag_17&amp;quot;,&lt;br /&gt;
        // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;valueUserTag_18&amp;quot;,&lt;br /&gt;
        // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;valueUserTag_19&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
      sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
          requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
          dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
          sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
          dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
          sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
          dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
          sortByValueUserTags: [&amp;quot;valueUserTag_1&amp;quot;, &amp;quot;valueUserTag_2&amp;quot;],&lt;br /&gt;
          sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
      comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
      comparisonSortDataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
      comparisonValue: &amp;quot;valueUserTag_20&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    hash_linkStepB_3: {&lt;br /&gt;
      fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  sortFields: [&lt;br /&gt;
    {&lt;br /&gt;
      requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
      dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
      sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
      dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
      sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
      dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
      sortByValueUserTags: [&amp;quot;valueUserTag_1&amp;quot;, &amp;quot;valueUserTag_2&amp;quot;],&lt;br /&gt;
      sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  valueUserTags: {&lt;br /&gt;
    valueUserTag_1: {&lt;br /&gt;
      value: &amp;quot;1111&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_2: {&lt;br /&gt;
      value: &amp;quot;2222&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_3: {&lt;br /&gt;
      value: &amp;quot;3333&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_4: {&lt;br /&gt;
      value: &amp;quot;4444&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_5: {&lt;br /&gt;
      value: &amp;quot;5555&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_6: {&lt;br /&gt;
      value: &amp;quot;6666&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_7: {&lt;br /&gt;
      value: &amp;quot;7777&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_8: {&lt;br /&gt;
      value: &amp;quot;8888&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_9: {&lt;br /&gt;
      value: &amp;quot;9999&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_10: {&lt;br /&gt;
      value: &amp;quot;1010&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_11: {&lt;br /&gt;
      value: &amp;quot;1110&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_12: {&lt;br /&gt;
      value: &amp;quot;1212&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_13: {&lt;br /&gt;
      value: &amp;quot;1313&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_14: {&lt;br /&gt;
      valueSource: 'perParentIdentifier',&lt;br /&gt;
      perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_15: {&lt;br /&gt;
      value: &amp;quot;praewDev&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_16: {&lt;br /&gt;
      valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
      complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_17: {&lt;br /&gt;
      valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
      perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_20: {&lt;br /&gt;
      value: 50&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_21: {&lt;br /&gt;
      value: &amp;quot;2121&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_22: {&lt;br /&gt;
      value: &amp;quot;2221&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4255</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4255"/>
		<updated>2026-04-08T06:06:59Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as params sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
	// header/footer filterDataField elements reference valueUserTag&lt;br /&gt;
&lt;br /&gt;
	&amp;quot;elements&amp;quot;: {&lt;br /&gt;
		// shared types&lt;br /&gt;
		&amp;quot;elementId12&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;freetext&amp;quot;,&lt;br /&gt;
			&amp;quot;value&amp;quot;: &amp;quot;aa&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// headerFooter types&lt;br /&gt;
		&amp;quot;elementId1&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;valueUserTag&amp;quot;: &amp;quot;userTag_9&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot; // || &amp;quot;select&amp;quot; || &amp;quot;checkbox&amp;quot; || &amp;quot;radio&amp;quot; ,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId2&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;select&amp;quot;,&lt;br /&gt;
			&amp;quot;options&amp;quot;: [&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option1&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
              },&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option2&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
			],&lt;br /&gt;
		},&lt;br /&gt;
        &amp;quot;elementId21&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;checkbox&amp;quot;,&lt;br /&gt;
			&amp;quot;onSetting:{&lt;br /&gt;
               optionText:&amp;quot;on&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
             &amp;quot;offSetting&amp;quot;:{&lt;br /&gt;
               optionText:&amp;quot;off&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
		   &lt;br /&gt;
           &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId3&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;sort&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;downArrow&amp;quot;, // || upArrow&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
			&amp;quot;dataType&amp;quot;: &amp;quot;number&amp;quot;, // &amp;quot;number&amp;quot; | &amp;quot;string&amp;quot;&lt;br /&gt;
			&amp;quot;sortOrder&amp;quot;: &amp;quot;ascending&amp;quot; // &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot; (default ascending)&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId4&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;numberOfRows&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot; // || &amp;quot;select&amp;quot; || &amp;quot;checkbox&amp;quot; || &amp;quot;radio&amp;quot; ,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId5&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;:&amp;quot;numberOfRows&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;select&amp;quot;,&lt;br /&gt;
			&amp;quot;options&amp;quot;: [&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;page5&amp;quot;,&lt;br /&gt;
               value:5&lt;br /&gt;
             },&lt;br /&gt;
	       	 {&lt;br /&gt;
               optionText:&amp;quot;page7&amp;quot;,&lt;br /&gt;
               value:7&lt;br /&gt;
             },&lt;br /&gt;
			],&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId6&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;submit&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;submit&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: [&amp;quot;sort&amp;quot;, &amp;quot;numberOfRows&amp;quot;, &amp;quot;filter&amp;quot;] &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId7&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;reset&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;reset rows&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: [&amp;quot;sort&amp;quot;, &amp;quot;numberOfRows&amp;quot;, &amp;quot;filter&amp;quot;] &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId9&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;totalDatafield&amp;quot;,&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
			&amp;quot;showIfNotAllRowsLoaded&amp;quot;: true // || false&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId11&amp;quot;:{&lt;br /&gt;
			// will need to link to per record check box&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkAction&amp;quot;,&lt;br /&gt;
			&amp;quot;action&amp;quot;: &amp;quot;on&amp;quot; // on | off | switch&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;, // have normalized list of bulkActionTags, with list of &amp;quot;bulkAction&amp;quot; and &amp;quot;bulkActionCheckBox&amp;quot; elements linked to it&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId8&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;pageNumbers&amp;quot;,&lt;br /&gt;
			&amp;quot;linksAfter&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToLastPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenLastPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;gt;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;linksBefore&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToFirstPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenFirstPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;showPagesAfter&amp;quot;: 3,&lt;br /&gt;
			&amp;quot;showPagesBefore&amp;quot;: 3&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		// records types    &lt;br /&gt;
		&amp;quot;elementId5&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;requiredDataLinkStepObject&amp;quot;, // in record&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementIdxx&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkActionCheckBox&amp;quot;,&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	valueUserTags: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
            valueSource: 'perParentIdentifier',&lt;br /&gt;
            perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	bulkActionUserTags: {&lt;br /&gt;
		tagA:{&lt;br /&gt;
			bulkActions: [&lt;br /&gt;
                &amp;quot;elementId11&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
            bulkActionCheckBoxes: [&lt;br /&gt;
                &amp;quot;elementIdxx&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
		},&lt;br /&gt;
        // ...&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
  objType: { //* main objType&lt;br /&gt;
    serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
    objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  initialLogicalElementId: &amp;quot;uuid_openBracket_1&amp;quot;,&lt;br /&gt;
  logicalElements: {&lt;br /&gt;
    uuid_openBracket_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: null,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    uuid_logical_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_openBracket_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_operation_1&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      partitionKeyValueUserTags: {&lt;br /&gt;
        productId: &amp;quot;valueUserTag_1&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      // sortKeyValueUserTags: {&lt;br /&gt;
      //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
      // },&lt;br /&gt;
      // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
      // conditionalFieldValues: [&lt;br /&gt;
      //  {&lt;br /&gt;
      //    fieldName: &amp;quot;language&amp;quot;,&lt;br /&gt;
      //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
      //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
      //  }&lt;br /&gt;
      // ]&lt;br /&gt;
    },&lt;br /&gt;
    uuid_operation_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_childComplexFilter_1&amp;quot;,&lt;br /&gt;
      operation: &amp;quot;OR&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    uuid_childComplexFilter_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_operation_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_closeBracket_1&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      childLogicalElementId: &amp;quot;uuid_logical_2&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    uuid_logical_2: {&lt;br /&gt;
      logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_childComplexFilter_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      partitionKeyValueUserTags: {&lt;br /&gt;
        sellOfferId: &amp;quot;valueUserTag_2&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      // sortKeyValueUserTags: {&lt;br /&gt;
      //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
      // },&lt;br /&gt;
      // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
      // conditionalFieldValues: [&lt;br /&gt;
      //  {&lt;br /&gt;
      //    fieldName: &amp;quot;language&amp;quot;,&lt;br /&gt;
      //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
      //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
      //  }&lt;br /&gt;
      // ]&lt;br /&gt;
    },&lt;br /&gt;
    uuid_closeBracket_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;closeBracket&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_childComplexFilter_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    uuid_operation_2: {&lt;br /&gt;
      logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_closeBracket_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_translateIds_1&amp;quot;,&lt;br /&gt;
      operation: &amp;quot;AND&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    uuid_translateIds_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;translateIds&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_operation_3&amp;quot;,&lt;br /&gt;
      objType: {&lt;br /&gt;
        objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      requestProperties: {&lt;br /&gt;
        tag_xxxx: &amp;quot;valueUserTag_5&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      childIdentifiers: [&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferId: &amp;quot;valueUserTag_3&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferId: &amp;quot;valueUserTag_4&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
    uuid_operation_3: {&lt;br /&gt;
      logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_translateIds_1&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: &amp;quot;uuid_traversal_1&amp;quot;,&lt;br /&gt;
      operation: &amp;quot;AND&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    uuid_traversal_1: {&lt;br /&gt;
      logicalElementType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
      previousLogicalElementId: &amp;quot;uuid_operation_3&amp;quot;,&lt;br /&gt;
      nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
      objType: {&lt;br /&gt;
        objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      traversalSteps: [&lt;br /&gt;
        &amp;quot;hash_traversal_1&amp;quot;,&lt;br /&gt;
        &amp;quot;hash_traversal_2&amp;quot;,&lt;br /&gt;
        &amp;quot;hash_traversal_3&amp;quot;,&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  traversalSteps: {&lt;br /&gt;
    hash_traversal_1: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      //* setting of traversal step&lt;br /&gt;
      fieldValueUserTags: [&lt;br /&gt;
        {&lt;br /&gt;
          productId: &amp;quot;valueUserTag_6&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
      ],  //optional, if this step is not last step&lt;br /&gt;
      relationshipProperties: {&lt;br /&gt;
        // timestamp: 1231456 //or will ref value???? ====&amp;gt; not sure?&lt;br /&gt;
        timestamp: &amp;quot;valueUserTag_7&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hopsPassObjType: true, //optional //* สามารถ hops ได้ทุก step ยกเว้น step สุดท้าย = traversal_5&lt;br /&gt;
      hopsStart: 1, //optional default: 1&lt;br /&gt;
      hopsEnd: 10, //optional&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_2: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      fieldValueUserTags: [&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferId: &amp;quot;valueUserTag_8&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
      ],//optional&lt;br /&gt;
      //* traversal before last traversal cannot set hopsPassObjType = true&lt;br /&gt;
      hopsEnd: 10, //optional&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_3: {&lt;br /&gt;
      fieldValueUserTags: [&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferPlanId: &amp;quot;valueUserTag_9&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          currencyId: &amp;quot;valueUserTag_10&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          sellOfferPlanId: &amp;quot;valueUserTag_11&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_combinationComplexFilter_1: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;localtionLink&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasLocationLink&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      //* setting of traversal step&lt;br /&gt;
      hopsPassObjType: true, //optional //* สามารถ hops ได้ทุก step ยกเว้น step สุดท้าย = traversal_5&lt;br /&gt;
      hopsStart: 1, //optional default: 1&lt;br /&gt;
      hopsEnd: 10, //optional&lt;br /&gt;
&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_combinationComplexFilter_2: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;isLocationNode&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hopsEnd: 10, //optional&lt;br /&gt;
    },&lt;br /&gt;
    hash_traversal_combinationComplexFilter_3: {&lt;br /&gt;
      fieldValueUserTags: [&lt;br /&gt;
        {&lt;br /&gt;
          locationNodeId: &amp;quot;valueUserTag_21&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          locationNodeId: &amp;quot;valueUserTag_22&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
    // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
    &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
    &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
  ],&lt;br /&gt;
  complexFilterCombinations: {&lt;br /&gt;
    hash_complexFilterCombinationA: {&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      initialLogicalElementId: &amp;quot;hash_traversal_combinationComplexFilter&amp;quot;,&lt;br /&gt;
      logicalElements: {&lt;br /&gt;
        //*traversal&lt;br /&gt;
        hash_traversal_combinationComplexFilter: {&lt;br /&gt;
          logicalElementType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
          previousLogicalElementId: null,&lt;br /&gt;
          nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
          objType: {&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;,&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
          traversalSteps: [&lt;br /&gt;
            &amp;quot;hash_traversal_combinationComplexFilter_1&amp;quot;,&lt;br /&gt;
            &amp;quot;hash_traversal_combinationComplexFilter_2&amp;quot;,&lt;br /&gt;
            &amp;quot;hash_traversal_combinationComplexFilter_3&amp;quot;,&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
    },&lt;br /&gt;
  },&lt;br /&gt;
  perParentCombinations: {&lt;br /&gt;
    hash_perParentCombinationA: {&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
      logicalElements: {&lt;br /&gt;
        child_complexFilter_1: {&lt;br /&gt;
          logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
          previousLogicalElementId: null,&lt;br /&gt;
          nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
          childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
            objType: {&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
              objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            relType: {&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
              relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            direction: &amp;quot;to&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_orderQuantity: &amp;quot;valueUserTag_13&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        logical_sellOffer: {&lt;br /&gt;
          logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
          previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          partitionKeyValueUserTags: {&lt;br /&gt;
            sellOfferId: &amp;quot;valueUserTag_14&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
          // sortKeyValueUserTags: {&lt;br /&gt;
          //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
          // },&lt;br /&gt;
          // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
          // conditionalFieldValues: [&lt;br /&gt;
          //  {&lt;br /&gt;
          //    fieldName: &amp;quot;language&amp;quot;,&lt;br /&gt;
          //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
          //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
          //  }&lt;br /&gt;
          // ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
  },&lt;br /&gt;
  requiredDataLinkStepObjects: {&lt;br /&gt;
    userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
      initialObjType: { //* main objType&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
    },&lt;br /&gt;
    userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
      initialObjType: { //* main objType&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
    }&lt;br /&gt;
    // userTag_LinkStepObjectC&lt;br /&gt;
    // userTag_LinkStepObjectD&lt;br /&gt;
  },&lt;br /&gt;
  requiredDataLinkSteps: {&lt;br /&gt;
    hash_linkStepA_1: {&lt;br /&gt;
      fieldName: &amp;quot;xxx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    hash_linkStepB_1: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      addFilterMain: true, //default: false =&amp;gt; need to add filterMain set = true&lt;br /&gt;
      filterElements: { //* filter in linkPath&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
        logicalElements: {&lt;br /&gt;
          logical_sellOffer_in_link: {&lt;br /&gt;
            logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
            previousLogicalElementId: null,&lt;br /&gt;
            nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
            objType: {&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
              objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            partitionKeyValueUserTags: {&lt;br /&gt;
              sellOfferId: &amp;quot;valueUserTag_14&amp;quot;,&lt;br /&gt;
            },&lt;br /&gt;
            // sortKeyValueUserTags: {&lt;br /&gt;
            //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
            // },&lt;br /&gt;
            // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
            conditionalFieldValues: [&lt;br /&gt;
              {&lt;br /&gt;
                fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                includeValueUserTags: [&amp;quot;valueUserTag_15&amp;quot;], //&lt;br /&gt;
                // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
              }&lt;br /&gt;
            ]&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
    },&lt;br /&gt;
    hash_linkStepB_2: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        relType: {&lt;br /&gt;
          serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
          relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      requestProperties: {&lt;br /&gt;
        tag_deliverTo: &amp;quot;valueUserTag_16&amp;quot;,&lt;br /&gt;
        tag_sellOfferPlan: &amp;quot;valueUserTag_17&amp;quot;,&lt;br /&gt;
        // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;valueUserTag_18&amp;quot;,&lt;br /&gt;
        // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;valueUserTag_19&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
      sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
          requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
          dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
          sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
          dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
          sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
          dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
          sortByValueUserTags: [&amp;quot;valueUserTag_1&amp;quot;, &amp;quot;valueUserTag_2&amp;quot;],&lt;br /&gt;
          sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
      comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
      comparisonSortDataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
      comparisonValue: &amp;quot;valueUserTag_20&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    hash_linkStepB_3: {&lt;br /&gt;
      fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  sortFields: [&lt;br /&gt;
    {&lt;br /&gt;
      requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
      dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
      sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
      dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
      sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
      dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
      sortByValueUserTags: [&amp;quot;userTag_1&amp;quot;, &amp;quot;userTag_2&amp;quot;],&lt;br /&gt;
      sortOrder: &amp;quot;ascending&amp;quot; | &amp;quot;descending&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  valueUserTags: {&lt;br /&gt;
    valueUserTag_1: {&lt;br /&gt;
      value: &amp;quot;1111&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_2: {&lt;br /&gt;
      value: &amp;quot;2222&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_3: {&lt;br /&gt;
      value: &amp;quot;3333&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_4: {&lt;br /&gt;
      value: &amp;quot;4444&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_5: {&lt;br /&gt;
      value: &amp;quot;5555&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_6: {&lt;br /&gt;
      value: &amp;quot;6666&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_7: {&lt;br /&gt;
      value: &amp;quot;7777&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_8: {&lt;br /&gt;
      value: &amp;quot;8888&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_9: {&lt;br /&gt;
      value: &amp;quot;9999&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_10: {&lt;br /&gt;
      value: &amp;quot;1010&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_11: {&lt;br /&gt;
      value: &amp;quot;1110&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_12: {&lt;br /&gt;
      value: &amp;quot;1212&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_13: {&lt;br /&gt;
      value: &amp;quot;1313&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_14: {&lt;br /&gt;
      valueSource: 'perParentIdentifier',&lt;br /&gt;
      perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_15: {&lt;br /&gt;
      value: &amp;quot;praewDev&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_16: {&lt;br /&gt;
      valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
      complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_17: {&lt;br /&gt;
      valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
      perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_20: {&lt;br /&gt;
      value: 50&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_21: {&lt;br /&gt;
      value: &amp;quot;2121&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    valueUserTag_22: {&lt;br /&gt;
      value: &amp;quot;2221&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=Service_-_Catalog_Standard&amp;diff=4254</id>
		<title>Service - Catalog Standard</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=Service_-_Catalog_Standard&amp;diff=4254"/>
		<updated>2026-04-07T01:56:00Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
Handler service for the standard catalog type.&lt;br /&gt;
&lt;br /&gt;
= Repository =&lt;br /&gt;
&lt;br /&gt;
https://bitbucket.org/izara-market-services/izara-market-catalogs-catalog-standard&lt;br /&gt;
&lt;br /&gt;
= DynamoDB tables =&lt;br /&gt;
&lt;br /&gt;
== [[Standard Config Table Per Service]] ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration tags ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;CatalogServiceNameTag&amp;quot;&lt;br /&gt;
	configKey: &amp;quot;CatalogServiceNameTag&amp;quot;&lt;br /&gt;
	configValue: xxx // this own services CatalogServiceTag, eg &amp;quot;CatalogStandard&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;CatalogGraphServiceName&amp;quot;&lt;br /&gt;
	configKey: &amp;quot;CatalogGraphServiceName&amp;quot;&lt;br /&gt;
	configValue: xxx // eg: &amp;quot;CatalogGraph&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;CatalogManagerServiceName&amp;quot;&lt;br /&gt;
	configKey: &amp;quot;CatalogManagerServiceName&amp;quot;&lt;br /&gt;
	configValue: xxx // eg: &amp;quot;CatalogManager&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;TranslationsServiceName&amp;quot;&lt;br /&gt;
	configKey: &amp;quot;TranslationsServiceName&amp;quot;&lt;br /&gt;
	configValue: xxx // eg: &amp;quot;Translations&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;CategoryTreeService&amp;quot;&lt;br /&gt;
	configKey: xxx // categoryTreeServiceNameTag, eg: &amp;quot;CategoryTreeStandard&amp;quot;, this is what is saved in each catalog record&lt;br /&gt;
	configValue: {&lt;br /&gt;
		serviceName: xxx // eg: &amp;quot;CategoryTreeStandard&amp;quot;, this is the actual deployed service name}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Graph database = &lt;br /&gt;
&lt;br /&gt;
== [[Service - Catalog Graph]]==&lt;br /&gt;
&lt;br /&gt;
=== Nodes ===&lt;br /&gt;
&lt;br /&gt;
==== catalog ====&lt;br /&gt;
&lt;br /&gt;
Is an origin/home/top-level node, one per catalog, allows for top level categories in that catalog to be point to a single origin node.&lt;br /&gt;
&lt;br /&gt;
* NodeIdentifierLabels: catalog&lt;br /&gt;
* NodeIdentifierProperties: catalogId (random uuid)&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
&lt;br /&gt;
# searchType: sellOffer|product|variantProduct, will match the setting in the catalog service&lt;br /&gt;
# filter: full filter for the catalog, will combine all child categoryNode filters with the setting in the catalog service&lt;br /&gt;
# requiredData: full requiredData for this catalog, will match the setting in the catalog service&lt;br /&gt;
&lt;br /&gt;
==== catalogSettings ====&lt;br /&gt;
&lt;br /&gt;
Versioned data Holding the editable settings for a catalog.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
&lt;br /&gt;
# searchType: product|variant|variantProduct&lt;br /&gt;
# filter: stringified object containing default search result filter&lt;br /&gt;
# requiredData: stringified object containing default search result requiredData&lt;br /&gt;
# categoryTreeServiceName: eg: &amp;quot;CategoryTreeStandard&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== [[Service - Translations Graph]] ==&lt;br /&gt;
&lt;br /&gt;
=== Nodes ===&lt;br /&gt;
&lt;br /&gt;
==== CatalogName ====&lt;br /&gt;
&lt;br /&gt;
* NodeIdentifierLabels: catalogName&lt;br /&gt;
* NodeIdentifierProperties: catalogId&lt;br /&gt;
&lt;br /&gt;
= Ideas =&lt;br /&gt;
&lt;br /&gt;
* One filter that will normally be on, but could be removed, is to only show items that have available quantity, this will tie into the locationtreenodeid.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Structure from Normalize FrontEnd =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
//in versionedData&lt;br /&gt;
versionedData = {&lt;br /&gt;
  objTypeSetting: {&lt;br /&gt;
    serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
    objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  filterSetting: {&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    initialLogicalElementId: &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
      xxxx: {&lt;br /&gt;
        logicalElementType: &amp;quot;logical&amp;quot; | &amp;quot;childComplexFilter&amp;quot; | etc,&lt;br /&gt;
        previousLogicalElmentId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
        nextLogicalElementId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
        // other params depend on logicalElementType&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  requiredDataSetting: {&lt;br /&gt;
    fieldName: &amp;quot;xxx&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  //* add more new ideas&lt;br /&gt;
  //* traversalsStepSetting: {},&lt;br /&gt;
  //* valueUserTagsSetting: {}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//* in properties of node&lt;br /&gt;
properties = {&lt;br /&gt;
  objType: {&lt;br /&gt;
    serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
    objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  requiredData: [&lt;br /&gt;
    {&lt;br /&gt;
      fieldName: &amp;quot;xxx&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  filterAwaiting: {&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    initialLogicalElementId: &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
      xxxx: {&lt;br /&gt;
        logicalElementType: &amp;quot;logical&amp;quot; | &amp;quot;childComplexFilter&amp;quot; | etc,&lt;br /&gt;
        previousLogicalElmentId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
        nextLogicalElementId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
        // other params depend on logicalElementType&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  filters: {&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    initialLogicalElementId: &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
      xxxx: {&lt;br /&gt;
        logicalElementType: &amp;quot;logical&amp;quot; | &amp;quot;childComplexFilter&amp;quot; | etc,&lt;br /&gt;
        previousLogicalElmentId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
        nextLogicalElementId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
        // other params depend on logicalElementType&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  //* add more new ideas&lt;br /&gt;
  // traversalSteps: { //* maybe add more in this properties --&amp;gt; ref for type traversal&lt;br /&gt;
  //   111: {&lt;br /&gt;
  //     pathLinkType: {&lt;br /&gt;
  //       objType: {&lt;br /&gt;
  //         serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
  //         objectType: &amp;quot;yy&amp;quot;&lt;br /&gt;
  //       },&lt;br /&gt;
  //       relType: {&lt;br /&gt;
  //         serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
  //         relationshipTag: &amp;quot;hasYY&amp;quot;&lt;br /&gt;
  //       },&lt;br /&gt;
  //       direction: &amp;quot;from&amp;quot;&lt;br /&gt;
  //     },&lt;br /&gt;
&lt;br /&gt;
  //     //* other setting of traversal&lt;br /&gt;
  //   }&lt;br /&gt;
  // },&lt;br /&gt;
  // valueUserTags: { //* maybe add more in this properties&lt;br /&gt;
  //   ref_valueUserTag: {&lt;br /&gt;
  //     value: &amp;quot;cccc&amp;quot;&lt;br /&gt;
  //   }&lt;br /&gt;
  // }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Working documents =&lt;br /&gt;
&lt;br /&gt;
[[:Category:Working_documents - Catalog Standard|Catalog Standard]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Backend services| Catalog Standard]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=Service_-_Catalog_Standard&amp;diff=4253</id>
		<title>Service - Catalog Standard</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=Service_-_Catalog_Standard&amp;diff=4253"/>
		<updated>2026-04-07T01:54:52Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
Handler service for the standard catalog type.&lt;br /&gt;
&lt;br /&gt;
= Repository =&lt;br /&gt;
&lt;br /&gt;
https://bitbucket.org/izara-market-services/izara-market-catalogs-catalog-standard&lt;br /&gt;
&lt;br /&gt;
= DynamoDB tables =&lt;br /&gt;
&lt;br /&gt;
== [[Standard Config Table Per Service]] ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration tags ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;CatalogServiceNameTag&amp;quot;&lt;br /&gt;
	configKey: &amp;quot;CatalogServiceNameTag&amp;quot;&lt;br /&gt;
	configValue: xxx // this own services CatalogServiceTag, eg &amp;quot;CatalogStandard&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;CatalogGraphServiceName&amp;quot;&lt;br /&gt;
	configKey: &amp;quot;CatalogGraphServiceName&amp;quot;&lt;br /&gt;
	configValue: xxx // eg: &amp;quot;CatalogGraph&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;CatalogManagerServiceName&amp;quot;&lt;br /&gt;
	configKey: &amp;quot;CatalogManagerServiceName&amp;quot;&lt;br /&gt;
	configValue: xxx // eg: &amp;quot;CatalogManager&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;TranslationsServiceName&amp;quot;&lt;br /&gt;
	configKey: &amp;quot;TranslationsServiceName&amp;quot;&lt;br /&gt;
	configValue: xxx // eg: &amp;quot;Translations&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;CategoryTreeService&amp;quot;&lt;br /&gt;
	configKey: xxx // categoryTreeServiceNameTag, eg: &amp;quot;CategoryTreeStandard&amp;quot;, this is what is saved in each catalog record&lt;br /&gt;
	configValue: {&lt;br /&gt;
		serviceName: xxx // eg: &amp;quot;CategoryTreeStandard&amp;quot;, this is the actual deployed service name}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Graph database = &lt;br /&gt;
&lt;br /&gt;
== [[Service - Catalog Graph]]==&lt;br /&gt;
&lt;br /&gt;
=== Nodes ===&lt;br /&gt;
&lt;br /&gt;
==== catalog ====&lt;br /&gt;
&lt;br /&gt;
Is an origin/home/top-level node, one per catalog, allows for top level categories in that catalog to be point to a single origin node.&lt;br /&gt;
&lt;br /&gt;
* NodeIdentifierLabels: catalog&lt;br /&gt;
* NodeIdentifierProperties: catalogId (random uuid)&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
&lt;br /&gt;
# searchType: sellOffer|product|variantProduct, will match the setting in the catalog service&lt;br /&gt;
# filter: full filter for the catalog, will combine all child categoryNode filters with the setting in the catalog service&lt;br /&gt;
# requiredData: full requiredData for this catalog, will match the setting in the catalog service&lt;br /&gt;
&lt;br /&gt;
==== catalogSettings ====&lt;br /&gt;
&lt;br /&gt;
Versioned data Holding the editable settings for a catalog.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
&lt;br /&gt;
# searchType: product|variant|variantProduct&lt;br /&gt;
# filter: stringified object containing default search result filter&lt;br /&gt;
# requiredData: stringified object containing default search result requiredData&lt;br /&gt;
# categoryTreeServiceName: eg: &amp;quot;CategoryTreeStandard&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== [[Service - Translations Graph]] ==&lt;br /&gt;
&lt;br /&gt;
=== Nodes ===&lt;br /&gt;
&lt;br /&gt;
==== CatalogName ====&lt;br /&gt;
&lt;br /&gt;
* NodeIdentifierLabels: catalogName&lt;br /&gt;
* NodeIdentifierProperties: catalogId&lt;br /&gt;
&lt;br /&gt;
= Ideas =&lt;br /&gt;
&lt;br /&gt;
* One filter that will normally be on, but could be removed, is to only show items that have available quantity, this will tie into the locationtreenodeid.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Structure from Normalize FrontEnd =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
//in versionedData&lt;br /&gt;
versionedData = {&lt;br /&gt;
  objTypeSetting: {&lt;br /&gt;
    serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
    objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  objTypeSettingMatchParent: true | false,&lt;br /&gt;
  filterSetting: {&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    initialLogicalElementId: &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
      xxxx: {&lt;br /&gt;
        logicalElementType: &amp;quot;logical&amp;quot; | &amp;quot;childComplexFilter&amp;quot; | etc,&lt;br /&gt;
        previousLogicalElmentId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
        nextLogicalElementId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
        // other params depend on logicalElementType&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  filterSettingMatchParent: &amp;quot;none&amp;quot; | &amp;quot;match&amp;quot; | &amp;quot;append&amp;quot;,&lt;br /&gt;
  requiredDataSetting: {&lt;br /&gt;
    fieldName: &amp;quot;xxx&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  requiredDataSettingMAtchParent: &amp;quot;none&amp;quot; | &amp;quot;match&amp;quot; | &amp;quot;append&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  //* add more new ideas&lt;br /&gt;
  //* traversalsStepSetting: {},&lt;br /&gt;
  //* valueUserTagsSetting: {}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//* in properties of node&lt;br /&gt;
properties = {&lt;br /&gt;
  objType: {&lt;br /&gt;
    serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
    objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  requiredData: [&lt;br /&gt;
    {&lt;br /&gt;
      fieldName: &amp;quot;xxx&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  filterAwaiting: {&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    initialLogicalElementId: &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
      xxxx: {&lt;br /&gt;
        logicalElementType: &amp;quot;logical&amp;quot; | &amp;quot;childComplexFilter&amp;quot; | etc,&lt;br /&gt;
        previousLogicalElmentId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
        nextLogicalElementId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
        // other params depend on logicalElementType&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  filters: {&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    initialLogicalElementId: &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
      xxxx: {&lt;br /&gt;
        logicalElementType: &amp;quot;logical&amp;quot; | &amp;quot;childComplexFilter&amp;quot; | etc,&lt;br /&gt;
        previousLogicalElmentId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
        nextLogicalElementId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
        // other params depend on logicalElementType&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  //* add more new ideas&lt;br /&gt;
  // traversalSteps: { //* maybe add more in this properties --&amp;gt; ref for type traversal&lt;br /&gt;
  //   111: {&lt;br /&gt;
  //     pathLinkType: {&lt;br /&gt;
  //       objType: {&lt;br /&gt;
  //         serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
  //         objectType: &amp;quot;yy&amp;quot;&lt;br /&gt;
  //       },&lt;br /&gt;
  //       relType: {&lt;br /&gt;
  //         serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
  //         relationshipTag: &amp;quot;hasYY&amp;quot;&lt;br /&gt;
  //       },&lt;br /&gt;
  //       direction: &amp;quot;from&amp;quot;&lt;br /&gt;
  //     },&lt;br /&gt;
&lt;br /&gt;
  //     //* other setting of traversal&lt;br /&gt;
  //   }&lt;br /&gt;
  // },&lt;br /&gt;
  // valueUserTags: { //* maybe add more in this properties&lt;br /&gt;
  //   ref_valueUserTag: {&lt;br /&gt;
  //     value: &amp;quot;cccc&amp;quot;&lt;br /&gt;
  //   }&lt;br /&gt;
  // }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Working documents =&lt;br /&gt;
&lt;br /&gt;
[[:Category:Working_documents - Catalog Standard|Catalog Standard]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Backend services| Catalog Standard]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=Service_-_Category_Tree_Standard&amp;diff=4252</id>
		<title>Service - Category Tree Standard</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=Service_-_Category_Tree_Standard&amp;diff=4252"/>
		<updated>2026-04-06T23:47:49Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
Handler service for the standard category tree type.&lt;br /&gt;
&lt;br /&gt;
= Repository =&lt;br /&gt;
&lt;br /&gt;
https://bitbucket.org/izara-market-services/izara-market-catalogs-category-tree-standard&lt;br /&gt;
&lt;br /&gt;
= DynamoDB tables =&lt;br /&gt;
&lt;br /&gt;
== [[Standard Config Table Per Service]] ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration tags ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;CategoryTreeServiceNameTag&amp;quot;&lt;br /&gt;
	configKey: &amp;quot;CategoryTreeServiceNameTag&amp;quot;&lt;br /&gt;
	configValue: xxx // this own services CategoryTreeServiceNameTag, eg &amp;quot;CategoryTreeStandard&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;CatalogGraphServiceName&amp;quot;&lt;br /&gt;
	configKey: &amp;quot;CatalogGraphServiceName&amp;quot;&lt;br /&gt;
	configValue: xxx // eg: &amp;quot;CatalogGraph&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;CategoryTreeService&amp;quot;&lt;br /&gt;
	configKey: xxx // categoryTreeServiceNameTag, eg: &amp;quot;CategoryTreeStandard&amp;quot;, this is what is saved in each catalog record&lt;br /&gt;
	configValue: {&lt;br /&gt;
		serviceName: xxx // eg: &amp;quot;CategoryTreeStandard&amp;quot;, this is the actual deployed service name}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;defaultValue&amp;quot;&lt;br /&gt;
	configKey: &amp;quot;locationTreeAreaNodeId&amp;quot;&lt;br /&gt;
	configValue: {eg: id for USA, or international?}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;defaultValue&amp;quot;&lt;br /&gt;
	configKey: &amp;quot;browseQuantity&amp;quot;&lt;br /&gt;
	configValue: {eg: 1}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Graph database = &lt;br /&gt;
&lt;br /&gt;
== [[Service - Catalog Graph]] == &lt;br /&gt;
&lt;br /&gt;
* Structure allows for one category to be found at the same level of the graph (same parent) multiple times, but eg with different filters&lt;br /&gt;
* Structure keeps a record of all changes, so can be rolled back eg if a user makes changes incorrectly&lt;br /&gt;
&lt;br /&gt;
=== Nodes ===&lt;br /&gt;
&lt;br /&gt;
==== catalogNode ====&lt;br /&gt;
&lt;br /&gt;
[[Service - Catalog Standard#catalogNode]]&lt;br /&gt;
&lt;br /&gt;
==== categoryNode ====&lt;br /&gt;
&lt;br /&gt;
Represents one parent-child relationship in the graph, is never edited or removed from the graph. One category can have any number of categoryNodes&lt;br /&gt;
&lt;br /&gt;
* NodeIdentifierLabels: categoryNode&lt;br /&gt;
* NodeIdentifierProperties: categoryNodeId - random uuid&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
&lt;br /&gt;
# catalogId (maybe not needed but maybe more efficient if have)&lt;br /&gt;
# categoryId (maybe not needed but maybe more efficient if have)&lt;br /&gt;
# searchType: sellOffer|product|variantProduct, will often match catalog's default unless specifically set not to, is the current generated setting and can change regularly&lt;br /&gt;
# filter: full filter for this node, will often match catalog's default unless specifically set not to, is the current generated setting and can change regularly&lt;br /&gt;
# requiredData: full requiredData for this node, will often match catalog's default unless specifically set not to, is the current generated setting and can change regularly&lt;br /&gt;
&lt;br /&gt;
==== categoryNodeSettings ====&lt;br /&gt;
&lt;br /&gt;
Versioned data Holding the editable settings for a categoryNode.&lt;br /&gt;
&lt;br /&gt;
see [[2021-02-22 - Maintaining change history using graph database#Situation 2: Editable settings]]&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
&lt;br /&gt;
# searchType: sellOffer|product|variantProduct&lt;br /&gt;
# searchTypeMatchParent: boolean, if true will be updated to always match the parent node's searchType setting, if false must manually update&lt;br /&gt;
# filter: full or additional filter set for this node, will be empty if matching parent categoryNode's filter&lt;br /&gt;
# filterMatchParent: none|match|append, if none does not update when parent updates, if match will always match parent, if append will add this node's filter to the parent's&lt;br /&gt;
# requiredData&lt;br /&gt;
# requiredDataMatchParent: none|match|append, if none does not update when parent updates, if match will always match parent, if append will add this node's requiredData to the parent's&lt;br /&gt;
&lt;br /&gt;
==== user ====&lt;br /&gt;
&lt;br /&gt;
One userId, is never edited or removed from the graph.&lt;br /&gt;
&lt;br /&gt;
* NodeIdentifierLabels: user&lt;br /&gt;
* NodeIdentifierProperties: userId&lt;br /&gt;
&lt;br /&gt;
==== category ====&lt;br /&gt;
&lt;br /&gt;
[[Service - Category Standard#category]]&lt;br /&gt;
&lt;br /&gt;
=== Relationships ===&lt;br /&gt;
&lt;br /&gt;
==== hasChildCategoryNode / hasDisabledChildCategoryNode ====&lt;br /&gt;
&lt;br /&gt;
Creates a link between two categoryNode vertices or catalogNode &amp;gt; categoryNode vertices, relationship can be enabled or disabled, one of these relationships will always exist linking the same parent to the same child.&lt;br /&gt;
&lt;br /&gt;
One categoryNode can have multiple child categoryNodes but only one parent categoryNode, traversing up the parents will reach the final catalog node.&lt;br /&gt;
&lt;br /&gt;
==== changedBy ====&lt;br /&gt;
&lt;br /&gt;
Creates a link between categoryNode &amp;gt; user nodes, is never edited or removed from the graph. Each time a categoryNode is disabled or enabled a new relationship is created linking the userId and saving the date, so have record of changes&lt;br /&gt;
&lt;br /&gt;
Handled automatically in [[2021-02-16 - Graph Handler - Functions#Relationship/ChangeRelationshipType]]&lt;br /&gt;
&lt;br /&gt;
==== isCategory ====&lt;br /&gt;
&lt;br /&gt;
Creates a link between categoryNode &amp;gt; category nodes, is never edited or removed from the graph.&lt;br /&gt;
&lt;br /&gt;
= calculating categoryNode's requiredData and searchType =&lt;br /&gt;
&lt;br /&gt;
* In most cases all categoryNodes will share the same settings as the catalog's requiredData and searchType, but we allow for per categoryNode settings.&lt;br /&gt;
* Each categoryNode maintains it's own final setting so can be efficiently pulled when browsing&lt;br /&gt;
* If a categoryNode sets {setting}MatchParent = match it inherits the parent categoryNode's setting, if traversing up the tree to the catalog node all parents inherit, then any changes to the catalog's setting will propagate down to all categoryNodes&lt;br /&gt;
&lt;br /&gt;
== Initial settings ==&lt;br /&gt;
&lt;br /&gt;
* searchType can only be match or not match (no append)&lt;br /&gt;
* If {setting}MatchParent = none: the setting cannot be empty, and is saved in both the categoryNodeSettings and categoryNode nodes&lt;br /&gt;
* If {setting}MatchParent = match: no requiredData data is saved in categoryNodeSettings and the parent categoryNode's settings value is saved in this categoryNode node&lt;br /&gt;
* If {setting}MatchParent = append: the requiredData cannot be empty and is saved into the categoryNodeSettings node, then appended to the parent's setting and saved in the categoryNode node&lt;br /&gt;
* If the parent is a catalog node the same rules apply but the catalog's filter is used&lt;br /&gt;
&lt;br /&gt;
= calculating categoryNode's filter =&lt;br /&gt;
&lt;br /&gt;
The categoryNode's stored/active filter uses MatchParent the same as requiredData above, however child categories might include products that are not part of a parent category, when browsing the parent category we want to show all results from the parent's filter as well as all children's combined.&lt;br /&gt;
&lt;br /&gt;
If child categoryNode's match parent then we not need to add them into the parents final filter. If not we can chaing them using ''or'' statements to create the parent's final filter.&lt;br /&gt;
&lt;br /&gt;
Processing these large filters can be efficient due to cached results.&lt;br /&gt;
&lt;br /&gt;
== When a categoryNode's filter changes ==&lt;br /&gt;
&lt;br /&gt;
If a categoryNode or catalog's filter changes, just like requiredData we need to traverse down the tree checking for any filterMatchParent = match|append and rebuild the child node's filter setting accordingly, whenever a categoryNode is found that has no child nodes with filterMatchParent = match|append we can stop traversing down, but need to re-trace back up the tree recalculating the final combined filter that adds in all children filters.&lt;br /&gt;
&lt;br /&gt;
=== When creating a new categoryNode ===&lt;br /&gt;
&lt;br /&gt;
A new categoryNode also needs to traverse up the tree recalculating the filter for all parents&lt;br /&gt;
&lt;br /&gt;
= Adding client submitted settings =&lt;br /&gt;
&lt;br /&gt;
* client (or requesting service) can overwrite or adjust these settings&lt;br /&gt;
&lt;br /&gt;
== searchType ==&lt;br /&gt;
&lt;br /&gt;
* client submitted setting overwrites categoryNode's&lt;br /&gt;
&lt;br /&gt;
== filter ==&lt;br /&gt;
&lt;br /&gt;
* would get added as an ''and'' grouped filter&lt;br /&gt;
&lt;br /&gt;
== requiredData ==&lt;br /&gt;
&lt;br /&gt;
* client setting overwrites categoryNode's if set&lt;br /&gt;
&lt;br /&gt;
= Top level results = &lt;br /&gt;
&lt;br /&gt;
* Each catalog has a top level record saved into CategoryNode table, categoryId = 0, this will be a combination of catalog filter, and all child categoryIds&lt;br /&gt;
&lt;br /&gt;
= Ideas = &lt;br /&gt;
&lt;br /&gt;
* This service could hold a list of Products for each category and do things like record popularity etc.. partial lists would be OK, anything we want to add. For features like popularity might not want to remove products when they no longer match the catagory, might want to maintain their details in case get added again. This type of idea might be served through the graph database.&lt;br /&gt;
&lt;br /&gt;
= Structure from Normalize FrontEnd =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
//in versionedData&lt;br /&gt;
versionedData = {&lt;br /&gt;
  objTypeSetting: {&lt;br /&gt;
    serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
    objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  objTypeSettingMatchParent: true | false,&lt;br /&gt;
  filterSetting: {&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    initialLogicalElementId: &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
      xxxx: {&lt;br /&gt;
        logicalElementType: &amp;quot;logical&amp;quot; | &amp;quot;childComplexFilter&amp;quot; | etc,&lt;br /&gt;
        previousLogicalElmentId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
        nextLogicalElementId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
        // other params depend on logicalElementType&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  filterSettingMatchParent: &amp;quot;none&amp;quot; | &amp;quot;match&amp;quot; | &amp;quot;append&amp;quot;,&lt;br /&gt;
  requiredDataSetting: {&lt;br /&gt;
    fieldName: &amp;quot;xxx&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  requiredDataSettingMAtchParent: &amp;quot;none&amp;quot; | &amp;quot;match&amp;quot; | &amp;quot;append&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  //* add more new ideas&lt;br /&gt;
  //* traversalsStepSetting: {},&lt;br /&gt;
  //* valueUserTagsSetting: {}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//* in properties of node&lt;br /&gt;
properties = {&lt;br /&gt;
  objType: {&lt;br /&gt;
    serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
    objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  requiredData: [&lt;br /&gt;
    {&lt;br /&gt;
      fieldName: &amp;quot;xxx&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  filterAwaiting: {&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    initialLogicalElementId: &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
      xxxx: {&lt;br /&gt;
        logicalElementType: &amp;quot;logical&amp;quot; | &amp;quot;childComplexFilter&amp;quot; | etc,&lt;br /&gt;
        previousLogicalElmentId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
        nextLogicalElementId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
        // other params depend on logicalElementType&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  filters: {&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    initialLogicalElementId: &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
      xxxx: {&lt;br /&gt;
        logicalElementType: &amp;quot;logical&amp;quot; | &amp;quot;childComplexFilter&amp;quot; | etc,&lt;br /&gt;
        previousLogicalElmentId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
        nextLogicalElementId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
        // other params depend on logicalElementType&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  //* add more new ideas&lt;br /&gt;
  // traversalSteps: { //* maybe add more in this properties --&amp;gt; ref for type traversal&lt;br /&gt;
  //   111: {&lt;br /&gt;
  //     pathLinkType: {&lt;br /&gt;
  //       objType: {&lt;br /&gt;
  //         serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
  //         objectType: &amp;quot;yy&amp;quot;&lt;br /&gt;
  //       },&lt;br /&gt;
  //       relType: {&lt;br /&gt;
  //         serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
  //         relationshipTag: &amp;quot;hasYY&amp;quot;&lt;br /&gt;
  //       },&lt;br /&gt;
  //       direction: &amp;quot;from&amp;quot;&lt;br /&gt;
  //     },&lt;br /&gt;
&lt;br /&gt;
  //     //* other setting of traversal&lt;br /&gt;
  //   }&lt;br /&gt;
  // },&lt;br /&gt;
  // valueUserTags: { //* maybe add more in this properties&lt;br /&gt;
  //   ref_valueUserTag: {&lt;br /&gt;
  //     value: &amp;quot;cccc&amp;quot;&lt;br /&gt;
  //   }&lt;br /&gt;
  // }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Working documents =&lt;br /&gt;
&lt;br /&gt;
[[:Category:Working_documents - Category Tree Standard|Category Tree Standard]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Backend services| Category Tree Standard]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=Service_-_Category_Tree_Standard&amp;diff=4251</id>
		<title>Service - Category Tree Standard</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=Service_-_Category_Tree_Standard&amp;diff=4251"/>
		<updated>2026-04-06T01:07:41Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
Handler service for the standard category tree type.&lt;br /&gt;
&lt;br /&gt;
= Repository =&lt;br /&gt;
&lt;br /&gt;
https://bitbucket.org/izara-market-services/izara-market-catalogs-category-tree-standard&lt;br /&gt;
&lt;br /&gt;
= DynamoDB tables =&lt;br /&gt;
&lt;br /&gt;
== [[Standard Config Table Per Service]] ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration tags ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;CategoryTreeServiceNameTag&amp;quot;&lt;br /&gt;
	configKey: &amp;quot;CategoryTreeServiceNameTag&amp;quot;&lt;br /&gt;
	configValue: xxx // this own services CategoryTreeServiceNameTag, eg &amp;quot;CategoryTreeStandard&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;CatalogGraphServiceName&amp;quot;&lt;br /&gt;
	configKey: &amp;quot;CatalogGraphServiceName&amp;quot;&lt;br /&gt;
	configValue: xxx // eg: &amp;quot;CatalogGraph&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;CategoryTreeService&amp;quot;&lt;br /&gt;
	configKey: xxx // categoryTreeServiceNameTag, eg: &amp;quot;CategoryTreeStandard&amp;quot;, this is what is saved in each catalog record&lt;br /&gt;
	configValue: {&lt;br /&gt;
		serviceName: xxx // eg: &amp;quot;CategoryTreeStandard&amp;quot;, this is the actual deployed service name}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;defaultValue&amp;quot;&lt;br /&gt;
	configKey: &amp;quot;locationTreeAreaNodeId&amp;quot;&lt;br /&gt;
	configValue: {eg: id for USA, or international?}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configTag: &amp;quot;defaultValue&amp;quot;&lt;br /&gt;
	configKey: &amp;quot;browseQuantity&amp;quot;&lt;br /&gt;
	configValue: {eg: 1}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Graph database = &lt;br /&gt;
&lt;br /&gt;
== [[Service - Catalog Graph]] == &lt;br /&gt;
&lt;br /&gt;
* Structure allows for one category to be found at the same level of the graph (same parent) multiple times, but eg with different filters&lt;br /&gt;
* Structure keeps a record of all changes, so can be rolled back eg if a user makes changes incorrectly&lt;br /&gt;
&lt;br /&gt;
=== Nodes ===&lt;br /&gt;
&lt;br /&gt;
==== catalogNode ====&lt;br /&gt;
&lt;br /&gt;
[[Service - Catalog Standard#catalogNode]]&lt;br /&gt;
&lt;br /&gt;
==== categoryNode ====&lt;br /&gt;
&lt;br /&gt;
Represents one parent-child relationship in the graph, is never edited or removed from the graph. One category can have any number of categoryNodes&lt;br /&gt;
&lt;br /&gt;
* NodeIdentifierLabels: categoryNode&lt;br /&gt;
* NodeIdentifierProperties: categoryNodeId - random uuid&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
&lt;br /&gt;
# catalogId (maybe not needed but maybe more efficient if have)&lt;br /&gt;
# categoryId (maybe not needed but maybe more efficient if have)&lt;br /&gt;
# searchType: sellOffer|product|variantProduct, will often match catalog's default unless specifically set not to, is the current generated setting and can change regularly&lt;br /&gt;
# filter: full filter for this node, will often match catalog's default unless specifically set not to, is the current generated setting and can change regularly&lt;br /&gt;
# requiredData: full requiredData for this node, will often match catalog's default unless specifically set not to, is the current generated setting and can change regularly&lt;br /&gt;
&lt;br /&gt;
==== categoryNodeSettings ====&lt;br /&gt;
&lt;br /&gt;
Versioned data Holding the editable settings for a categoryNode.&lt;br /&gt;
&lt;br /&gt;
see [[2021-02-22 - Maintaining change history using graph database#Situation 2: Editable settings]]&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
&lt;br /&gt;
# searchType: sellOffer|product|variantProduct&lt;br /&gt;
# searchTypeMatchParent: boolean, if true will be updated to always match the parent node's searchType setting, if false must manually update&lt;br /&gt;
# filter: full or additional filter set for this node, will be empty if matching parent categoryNode's filter&lt;br /&gt;
# filterMatchParent: none|match|append, if none does not update when parent updates, if match will always match parent, if append will add this node's filter to the parent's&lt;br /&gt;
# requiredData&lt;br /&gt;
# requiredDataMatchParent: none|match|append, if none does not update when parent updates, if match will always match parent, if append will add this node's requiredData to the parent's&lt;br /&gt;
&lt;br /&gt;
==== user ====&lt;br /&gt;
&lt;br /&gt;
One userId, is never edited or removed from the graph.&lt;br /&gt;
&lt;br /&gt;
* NodeIdentifierLabels: user&lt;br /&gt;
* NodeIdentifierProperties: userId&lt;br /&gt;
&lt;br /&gt;
==== category ====&lt;br /&gt;
&lt;br /&gt;
[[Service - Category Standard#category]]&lt;br /&gt;
&lt;br /&gt;
=== Relationships ===&lt;br /&gt;
&lt;br /&gt;
==== hasChildCategoryNode / hasDisabledChildCategoryNode ====&lt;br /&gt;
&lt;br /&gt;
Creates a link between two categoryNode vertices or catalogNode &amp;gt; categoryNode vertices, relationship can be enabled or disabled, one of these relationships will always exist linking the same parent to the same child.&lt;br /&gt;
&lt;br /&gt;
One categoryNode can have multiple child categoryNodes but only one parent categoryNode, traversing up the parents will reach the final catalog node.&lt;br /&gt;
&lt;br /&gt;
==== changedBy ====&lt;br /&gt;
&lt;br /&gt;
Creates a link between categoryNode &amp;gt; user nodes, is never edited or removed from the graph. Each time a categoryNode is disabled or enabled a new relationship is created linking the userId and saving the date, so have record of changes&lt;br /&gt;
&lt;br /&gt;
Handled automatically in [[2021-02-16 - Graph Handler - Functions#Relationship/ChangeRelationshipType]]&lt;br /&gt;
&lt;br /&gt;
==== isCategory ====&lt;br /&gt;
&lt;br /&gt;
Creates a link between categoryNode &amp;gt; category nodes, is never edited or removed from the graph.&lt;br /&gt;
&lt;br /&gt;
= calculating categoryNode's requiredData and searchType =&lt;br /&gt;
&lt;br /&gt;
* In most cases all categoryNodes will share the same settings as the catalog's requiredData and searchType, but we allow for per categoryNode settings.&lt;br /&gt;
* Each categoryNode maintains it's own final setting so can be efficiently pulled when browsing&lt;br /&gt;
* If a categoryNode sets {setting}MatchParent = match it inherits the parent categoryNode's setting, if traversing up the tree to the catalog node all parents inherit, then any changes to the catalog's setting will propagate down to all categoryNodes&lt;br /&gt;
&lt;br /&gt;
== Initial settings ==&lt;br /&gt;
&lt;br /&gt;
* searchType can only be match or not match (no append)&lt;br /&gt;
* If {setting}MatchParent = none: the setting cannot be empty, and is saved in both the categoryNodeSettings and categoryNode nodes&lt;br /&gt;
* If {setting}MatchParent = match: no requiredData data is saved in categoryNodeSettings and the parent categoryNode's settings value is saved in this categoryNode node&lt;br /&gt;
* If {setting}MatchParent = append: the requiredData cannot be empty and is saved into the categoryNodeSettings node, then appended to the parent's setting and saved in the categoryNode node&lt;br /&gt;
* If the parent is a catalog node the same rules apply but the catalog's filter is used&lt;br /&gt;
&lt;br /&gt;
= calculating categoryNode's filter =&lt;br /&gt;
&lt;br /&gt;
The categoryNode's stored/active filter uses MatchParent the same as requiredData above, however child categories might include products that are not part of a parent category, when browsing the parent category we want to show all results from the parent's filter as well as all children's combined.&lt;br /&gt;
&lt;br /&gt;
If child categoryNode's match parent then we not need to add them into the parents final filter. If not we can chaing them using ''or'' statements to create the parent's final filter.&lt;br /&gt;
&lt;br /&gt;
Processing these large filters can be efficient due to cached results.&lt;br /&gt;
&lt;br /&gt;
== When a categoryNode's filter changes ==&lt;br /&gt;
&lt;br /&gt;
If a categoryNode or catalog's filter changes, just like requiredData we need to traverse down the tree checking for any filterMatchParent = match|append and rebuild the child node's filter setting accordingly, whenever a categoryNode is found that has no child nodes with filterMatchParent = match|append we can stop traversing down, but need to re-trace back up the tree recalculating the final combined filter that adds in all children filters.&lt;br /&gt;
&lt;br /&gt;
=== When creating a new categoryNode ===&lt;br /&gt;
&lt;br /&gt;
A new categoryNode also needs to traverse up the tree recalculating the filter for all parents&lt;br /&gt;
&lt;br /&gt;
= Adding client submitted settings =&lt;br /&gt;
&lt;br /&gt;
* client (or requesting service) can overwrite or adjust these settings&lt;br /&gt;
&lt;br /&gt;
== searchType ==&lt;br /&gt;
&lt;br /&gt;
* client submitted setting overwrites categoryNode's&lt;br /&gt;
&lt;br /&gt;
== filter ==&lt;br /&gt;
&lt;br /&gt;
* would get added as an ''and'' grouped filter&lt;br /&gt;
&lt;br /&gt;
== requiredData ==&lt;br /&gt;
&lt;br /&gt;
* client setting overwrites categoryNode's if set&lt;br /&gt;
&lt;br /&gt;
= Top level results = &lt;br /&gt;
&lt;br /&gt;
* Each catalog has a top level record saved into CategoryNode table, categoryId = 0, this will be a combination of catalog filter, and all child categoryIds&lt;br /&gt;
&lt;br /&gt;
= Ideas = &lt;br /&gt;
&lt;br /&gt;
* This service could hold a list of Products for each category and do things like record popularity etc.. partial lists would be OK, anything we want to add. For features like popularity might not want to remove products when they no longer match the catagory, might want to maintain their details in case get added again. This type of idea might be served through the graph database.&lt;br /&gt;
&lt;br /&gt;
= Structure from Normalize FrontEnd =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
//in versionedData&lt;br /&gt;
versionedData = {&lt;br /&gt;
  objTypeSetting: {&lt;br /&gt;
    serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
    objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  objTypeSettingMatchParent: true | false,&lt;br /&gt;
  filterSetting: {&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    initialLogicalElementId: &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
      xxxx: {&lt;br /&gt;
        logicalElementType: &amp;quot;logical&amp;quot; | &amp;quot;childComplexFilter&amp;quot; | etc,&lt;br /&gt;
        previousLogicalElmentId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
        nextLogicalElementId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
        // other params depend on logicalElementType&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  filterSettingMatchParent: &amp;quot;none&amp;quot; | &amp;quot;match&amp;quot; | &amp;quot;append&amp;quot;,&lt;br /&gt;
  requiredDataSetting: {&lt;br /&gt;
    fieldName: &amp;quot;xxx&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  requiredDataSettingMAtchParent: &amp;quot;none&amp;quot; | &amp;quot;match&amp;quot; | &amp;quot;append&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  //* add more new ideas&lt;br /&gt;
  //* traversalsStepSetting: {},&lt;br /&gt;
  //* valueUserTagsSetting: {}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
properties = {&lt;br /&gt;
  objType: {&lt;br /&gt;
    serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
    objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  requiredData: [&lt;br /&gt;
    {&lt;br /&gt;
      fieldName: &amp;quot;xxx&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  filterAwaiting: {&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    initialLogicalElementId: &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
      xxxx: {&lt;br /&gt;
        logicalElementType: &amp;quot;logical&amp;quot; | &amp;quot;childComplexFilter&amp;quot; | etc,&lt;br /&gt;
        previousLogicalElmentId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
        nextLogicalElementId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
        // other params depend on logicalElementType&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  filters: {&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    initialLogicalElementId: &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
      xxxx: {&lt;br /&gt;
        logicalElementType: &amp;quot;logical&amp;quot; | &amp;quot;childComplexFilter&amp;quot; | etc,&lt;br /&gt;
        previousLogicalElmentId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
        nextLogicalElementId: null | &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
        // other params depend on logicalElementType&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  //* add more new ideas&lt;br /&gt;
  // traversalSteps: { //* maybe add more in this properties --&amp;gt; ref for type traversal&lt;br /&gt;
  //   111: {&lt;br /&gt;
  //     pathLinkType: {&lt;br /&gt;
  //       objType: {&lt;br /&gt;
  //         serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
  //         objectType: &amp;quot;yy&amp;quot;&lt;br /&gt;
  //       },&lt;br /&gt;
  //       relType: {&lt;br /&gt;
  //         serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
  //         relationshipTag: &amp;quot;hasYY&amp;quot;&lt;br /&gt;
  //       },&lt;br /&gt;
  //       direction: &amp;quot;from&amp;quot;&lt;br /&gt;
  //     },&lt;br /&gt;
&lt;br /&gt;
  //     //* other setting of traversal&lt;br /&gt;
  //   }&lt;br /&gt;
  // },&lt;br /&gt;
  // valueUserTags: { //* maybe add more in this properties&lt;br /&gt;
  //   ref_valueUserTag: {&lt;br /&gt;
  //     value: &amp;quot;cccc&amp;quot;&lt;br /&gt;
  //   }&lt;br /&gt;
  // }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Working documents =&lt;br /&gt;
&lt;br /&gt;
[[:Category:Working_documents - Category Tree Standard|Category Tree Standard]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Backend services| Category Tree Standard]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=Service_-_Sort_Result&amp;diff=4186</id>
		<title>Service - Sort Result</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=Service_-_Sort_Result&amp;diff=4186"/>
		<updated>2026-03-18T04:15:55Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
Service that handles sorted results that come from the [[Service - Search Result]] service. Sorted results are stored/cached so subsequent requests do not need to generate the sorted results again.&lt;br /&gt;
&lt;br /&gt;
= Repository =&lt;br /&gt;
&lt;br /&gt;
https://bitbucket.org/stb_vit/sortresult_main/src/master/&lt;br /&gt;
&lt;br /&gt;
= DynamoDB tables =&lt;br /&gt;
&lt;br /&gt;
== [[Standard Config Table Per Service]] ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration tags ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;SearchType&amp;quot;,&lt;br /&gt;
	configTag: &amp;quot;xx&amp;quot; // {eg: sellOffer/Product/VariantProduct etc..}&lt;br /&gt;
	configValue: {&lt;br /&gt;
		searchResultServiceName: &amp;quot;xx&amp;quot; // {service name of searchResult service that handles this type}&lt;br /&gt;
	}&lt;br /&gt;
},&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Standard WebSocketTask Per Service]] ==&lt;br /&gt;
&lt;br /&gt;
== SortResultMain ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	sortResultId: &amp;quot;xx&amp;quot;, // main element for one set of search results, comes from {searchType}_{filterMainId}&lt;br /&gt;
	requiredData: {}, // same as request&lt;br /&gt;
	sortFields: [], // same as request&lt;br /&gt;
	requestProperties: {}, // same as request&lt;br /&gt;
	createTime: currentTime.getTime(),&lt;br /&gt;
	expiryTime: expiryTime.getTime(),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: sortResultId&lt;br /&gt;
* sort key: {none}&lt;br /&gt;
* sortResultId: searchId + &amp;quot;_&amp;quot; + sortFieldsHash&lt;br /&gt;
* sortFieldsHash: Strip out any sortFields elements after a random element is found, as they are unused. can have multiple sort fields, so we hash them to create the sortFieldsHash unique key&lt;br /&gt;
&lt;br /&gt;
== SortResultData ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	sortResultId: &amp;quot;xx&amp;quot;, &lt;br /&gt;
	sortId: ##, // numeric increment for sorting&lt;br /&gt;
	dataId: &amp;quot;xx&amp;quot;, unique id for the data record, from Search Result service&lt;br /&gt;
	data: {}, // all required data from Search Result service&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: sortResultId&lt;br /&gt;
* sort key: sortId&lt;br /&gt;
&lt;br /&gt;
== TempStringSort ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	sortResultIdLevelOrd: &amp;quot;xx&amp;quot;, &lt;br /&gt;
	value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: sortResultIdLevelOrd&lt;br /&gt;
* sort key: value&lt;br /&gt;
* sortResultIdLevelOrd: is {sortResultId}_{sortLevel}_{previous sort levels order}&lt;br /&gt;
&lt;br /&gt;
== TempNumericSort ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	sortResultIdLevelOrd: &amp;quot;xx&amp;quot;, &lt;br /&gt;
	value: &amp;quot;xx&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: sortResultIdLevelOrd&lt;br /&gt;
* sort key: value&lt;br /&gt;
* sortResultIdLevelOrd: is {sortResultId}_{sortLevel}_{previous sort levels order}&lt;br /&gt;
&lt;br /&gt;
== TempSortDataId ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	sortResultIdLevelOrdValue: &amp;quot;xx&amp;quot;, &lt;br /&gt;
	dataId: &amp;quot;xx&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: sortResultIdLevelOrdValue&lt;br /&gt;
* sort key: dataId&lt;br /&gt;
* sortResultIdLevelOrdValue: is {sortResultIdLevelOrd}_{value}&lt;br /&gt;
* links multiple dataIds with the same value to their sorted record in TempStringSort/TempNumericSort&lt;br /&gt;
&lt;br /&gt;
= Sorting Data That Has a Currency =&lt;br /&gt;
&lt;br /&gt;
* We want sortResult service to be able to sort by a converted amount, so client cannot perform conversions&lt;br /&gt;
* Have a find data field that returns the base value and currency, another findData that returns conversion to a set currency, this will allow for sorting etc&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
&lt;br /&gt;
* The data stored here should include everything the client request might need to render results to the user, so no additional calls are needed (eg all possible media that might be shown as a thumbnail, and how likely that thumbnail would be shown)(eg pricing info min price/max price/most common sold price/etc)&lt;br /&gt;
* Client uses sortResultId to pull results, can also request ascending or descending&lt;br /&gt;
* This service handles pagination of results&lt;br /&gt;
* ComplexFilter stores unique ids only for a filter, [[Service - Search Result]] takes results from ComplexFilter and adds all data client might need. Sort Result service copies the data from Search Result and structures it for sorted results&lt;br /&gt;
&lt;br /&gt;
= Ideas =&lt;br /&gt;
&lt;br /&gt;
* date is an interesting sort field, not really used in browse results but would be used a lot in other datasets, it is a filter so could be placed in the complexfilter, but is also something that might change regularly and is based on ordered results, so might be more efficient applied as a sort field in the SortResults, and could filter it there -&amp;gt; my thinking is just treat as a filter and sort separately, could limit changes in filters using date fields so not too many sets of data get generated, eg by fixing requests to set day timestamps.&lt;br /&gt;
* There is some large scale put into DynamoDB commands in this service, might be improved using BatchWriteItem, or improving async code.&lt;br /&gt;
* SortResults defines its own expiry date (might not match ComplexFilter/Search Result expiry dates), so Search Result service must query Sort Result to see if have active results, if expired Sort Result removes its data, Search Result then checks its data/expiry. More fancy: Sort Result returns date expired but does not delete data until Search Result finishes its tasks, if Search Result fails could return Sort Result's old data, and/or push back Sort Result's expiry date.&lt;br /&gt;
&lt;br /&gt;
= Normalize Structure SortResult Request =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    searchResultId: &amp;quot;hash_filters_main&amp;quot;, //* hash filter element of main&lt;br /&gt;
    searchDetailId: &amp;quot;hash_requiredData_main_all&amp;quot;,&lt;br /&gt;
    requiredDataObjects: { //* keep all requiredData that need to find fieldName that required&lt;br /&gt;
    },&lt;br /&gt;
    searchParams: {},&lt;br /&gt;
    filterElements: { //* other type can see in back_end_structure_complexFilter&lt;br /&gt;
    },&lt;br /&gt;
    linkPathObjects: {},&lt;br /&gt;
    linkPathSteps: {},&lt;br /&gt;
    sortFields: [&lt;br /&gt;
      {&lt;br /&gt;
        fieldName: &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
        dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
        sortOrder: &amp;quot;descending&amp;quot;,  &lt;br /&gt;
        refFieldNameId: &amp;quot;hash_linkPathObject_A&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* https://www.reddit.com/r/aws/comments/7ugukg/dynamodb_not_a_great_option_for_sorting/ - Efficient sorting DynamoDB structure&lt;br /&gt;
&lt;br /&gt;
= Working documents =&lt;br /&gt;
&lt;br /&gt;
[[:Category:Working_documents - Sort Result|Working_documents - Sort Result]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Backend services| Sort Result]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=Service_-_Search_Results&amp;diff=4185</id>
		<title>Service - Search Results</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=Service_-_Search_Results&amp;diff=4185"/>
		<updated>2026-03-18T02:33:34Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
Service that handles search result requests, feeding work to [[Service - Search Result (handlers)]]. Takes results from Complex Filter service which are identifier ids only and adds additional fields of information ready for display to end consumer, either directly if no sorting required, or via Sort Result service.&lt;br /&gt;
&lt;br /&gt;
Functions as a cache of Search Result data, so if subsequent matching requests come in they do not need to pass on to Complex Filter or find required data.&lt;br /&gt;
&lt;br /&gt;
= Repository =&lt;br /&gt;
&lt;br /&gt;
https://bitbucket.org/izara-core-search/izara-core-search-search-results/src/master/&lt;br /&gt;
&lt;br /&gt;
= DynamoDB tables =&lt;br /&gt;
&lt;br /&gt;
== [[Standard Config Table Per Service]] ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration tags ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;SearchType&amp;quot;,&lt;br /&gt;
	configTag: &amp;quot;xx&amp;quot; // {eg: sellOffer/Product/VariantProduct etc..}&lt;br /&gt;
	configValue: {&lt;br /&gt;
		complexFilterServiceName: &amp;quot;xx&amp;quot; // {service name of complex filter that handles this type}&lt;br /&gt;
		complexFilterType: &amp;quot;xx&amp;quot; // optional, if complexFilterType is different to searchType&lt;br /&gt;
		dataHandlerServiceName: &amp;quot;xx&amp;quot; {service name used to create function/queue names for finding data results, often a Manager service for the object}&lt;br /&gt;
		requireRequestProperties: {&lt;br /&gt;
			{requiredData fieldName}: [ // dependant on what requiredData requested&lt;br /&gt;
				&amp;quot;xx&amp;quot;,&lt;br /&gt;
				// .. {properties that must be received in the request for this searchType to process correctly}&lt;br /&gt;
			]&lt;br /&gt;
		},&lt;br /&gt;
		parentDataIdentifierFields: [&lt;br /&gt;
			&amp;quot;xx&amp;quot;, // these are always found with any request for this SearchType to add into ParentDataId table for each found data&lt;br /&gt;
		],&lt;br /&gt;
		childSearchResults: {&lt;br /&gt;
			{childSearchType}: { // searchType of child searchResult, matches filterType for building child complex filter&lt;br /&gt;
				searchResultsServiceName: &amp;quot;xx&amp;quot;, // allows for results to be saved by different deployed services&lt;br /&gt;
				requiredData: { // requiredData we request from the child searchType depending on what requiredData fields are set in the parent's request&lt;br /&gt;
					{parent requiredData fieldName}: [&lt;br /&gt;
						&amp;quot;xx&amp;quot;, // list of child requiredData fields to add&lt;br /&gt;
						// ..&lt;br /&gt;
					],&lt;br /&gt;
					// ..&lt;br /&gt;
				},&lt;br /&gt;
				passOnRequestProperties: [ // parent requestProperties to pass on to the child searchResult request, if not received in parent request will error&lt;br /&gt;
					&amp;quot;xx&amp;quot;, &lt;br /&gt;
					// .. &lt;br /&gt;
				]&lt;br /&gt;
			},&lt;br /&gt;
			// ..&lt;br /&gt;
		}&lt;br /&gt;
		hookBeforeFindDataServiceName: &amp;quot;xx&amp;quot;, // if set will send async request to external service before finding data&lt;br /&gt;
		hookAfterFindDataServiceName: &amp;quot;xx&amp;quot;, // if set will send async request to external service before finding data&lt;br /&gt;
	}&lt;br /&gt;
},&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SearchResultMain ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	searchResultId: &amp;quot;xx&amp;quot; // main element for one set of search results&lt;br /&gt;
	searchDetailId: &amp;quot;xx&amp;quot; // hashes of other values that affect result data&lt;br /&gt;
	searchResultMainStatus: &amp;quot;processing&amp;quot;,&lt;br /&gt;
	requiredData: {} // same as request&lt;br /&gt;
	childSearchIds: {&lt;br /&gt;
		{childSearchType}: [{array of childSearchIds}], // array of childSearchIds for this parent searchResultMain, split out by childSearchType&lt;br /&gt;
		// ..&lt;br /&gt;
	}&lt;br /&gt;
	createTime: currentTime.getTime(),&lt;br /&gt;
	expiryTime: expiryTime.getTime(),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: searchResultId&lt;br /&gt;
* sort key: searchDetailId&lt;br /&gt;
* searchResultId: for standard single filter searches is {searchType}_{filterMainId}&lt;br /&gt;
* searchDetailId: for standard single filter searches is {requestPropertiesHash}_{requiredDataHash}&lt;br /&gt;
* searchResultId: for combined search results is {searchType}_{searchParamsHash}&lt;br /&gt;
* searchDetailId: for combined search results is {requiredDataHash}&lt;br /&gt;
&lt;br /&gt;
== SearchResultParents ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	childSearchId: &amp;quot;xx&amp;quot;, // {searchResultId}_{searchDetailId}&lt;br /&gt;
	parentSearchId: &amp;quot;xx&amp;quot; // {searchResultId}_{searchDetailId}&lt;br /&gt;
	searchResultParentStatus: &amp;quot;processing&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: childSearchId&lt;br /&gt;
* sort key: parentSearchId&lt;br /&gt;
* when a SearchResultMain is finished it checks this table to see if any parents need to be processed&lt;br /&gt;
&lt;br /&gt;
== SearchResultData ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	searchId: &amp;quot;xx&amp;quot;, // {searchResultId}_{searchDetailId}&lt;br /&gt;
	dataId: &amp;quot;xx&amp;quot;, // id of element (sellOfferId/productId/variantProduct(type and id))&lt;br /&gt;
	// reconsider this field, does not scale: childData: {}, // only used when childId set in SearchResultMain, saves requiredData results for all matching child records&lt;br /&gt;
	searchResultDataStatus: &amp;quot;processing&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: searchId&lt;br /&gt;
* sort key: dataId&lt;br /&gt;
&lt;br /&gt;
== RequiredData ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	requiredDataId: &amp;quot;xx&amp;quot;, // {searchType}_{dataId}_{requestPropertiesHash} OR maybe hash of object of these values?&lt;br /&gt;
	fieldName: &amp;quot;xx&amp;quot;,&lt;br /&gt;
	requiredDataValue: &amp;quot;xx&amp;quot;, // value found for this reqdata field&lt;br /&gt;
	requiredDataStatus: &amp;quot;xx&amp;quot;, // waitingExternalData | complete | invalid&lt;br /&gt;
    createTime: currentTime.getTime(),&lt;br /&gt;
    expiryTime: expiryTime.getTime(),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: requiredDataId &lt;br /&gt;
* sort key: fieldName&lt;br /&gt;
* one record is one result we can calculate from external services, this can be shared by multiple SearchResultData records&lt;br /&gt;
* requiredDataId includes identifiers that can affect the data's value&lt;br /&gt;
* if keys too long for Dynamo we could hash an object containing all required fields and can add the values of each into the item separately, if needed&lt;br /&gt;
* primary key can be used when result comes back from external service, so that message must include all values needed to make requiredDataId&lt;br /&gt;
* can probably add fields during processing to store extra data for processing this SearchResultData record&lt;br /&gt;
* if we want to find all records for one SearchResultData we could search for just the partition key, but it might return additonal fields used by other searches with different requiredData&lt;br /&gt;
&lt;br /&gt;
== RequiredDataSearchResultData ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	requiredDataId_fieldName: &amp;quot;xx&amp;quot;, // {requiredDataId}_{fieldName}&lt;br /&gt;
	searchId: &amp;quot;xx&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: requiredDataId_fieldName&lt;br /&gt;
* sort key: searchId&lt;br /&gt;
* can extract dataId from requiredDataId_fieldName to find primary key for SearchResultData&lt;br /&gt;
* used to create links between RequiredData results and all SearchResultData that need it&lt;br /&gt;
&lt;br /&gt;
== ParentDataId ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	parentId: &amp;quot;xx&amp;quot;, // {parent searchType}_{parent dataId}_{child searchResultId (searchType and filterMainId)}_{requestPropertiesHash}&lt;br /&gt;
	childDataId: &amp;quot;xx&amp;quot; // {child dataId}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: parentId, identifies one parent dataId matching to a specific childSearchResult, excluding requiredData which is unimportant in this context, only need to specify child searchType/filterMainId/requestPropertiesHash to identify what matching one unique set of parent dataIds&lt;br /&gt;
* sort key: childDataId&lt;br /&gt;
* child filterMainId is required because we will have different ranges of childIds stored depending on what filter was used to find them&lt;br /&gt;
&lt;br /&gt;
= requestProperties =&lt;br /&gt;
&lt;br /&gt;
These are properties that are added to a Search Result request that affect the data found, they may be required or optional. Because these properties can affect the value of data they must be added to SearchResultMain identifiers to differentiate batches of results.&lt;br /&gt;
&lt;br /&gt;
= requireRequestProperties =&lt;br /&gt;
&lt;br /&gt;
Some requiredData fields will need additional properties to be received in the initial request.&lt;br /&gt;
* example: variant/product/sellOffer pricing fields will require locationNodeId/s and browseQuantity&lt;br /&gt;
* example: all translations require language/s&lt;br /&gt;
&lt;br /&gt;
= Moving child SearchResult data to parent = &lt;br /&gt;
* eg: product searchType has sellOffer child searchType data&lt;br /&gt;
* eg: variantProduct searchType has product child searchType data&lt;br /&gt;
* parent must wait for child FindData to complete before can process parents FindData&lt;br /&gt;
* child SearchResult might already have completed before the parent request was received (ie by a different request), need to account for this&lt;br /&gt;
* (old design - can still use if have to, but would be best to separate results so can scale, eg if want to show details about child products, that could pass as a separate Search/Sort set of results including pagination) aggregate multiple child data into the parents data values, but also keep a record of all children in the parents data record&lt;br /&gt;
&lt;br /&gt;
= Multiple Search Results services =&lt;br /&gt;
&lt;br /&gt;
* design to allow for different implementations, eg catalogs can choose which Search Results service it uses&lt;br /&gt;
* could achieve this be having a setting in Catalog handlers or Catalog Manager that records which Search Result service the Catalog uses&lt;br /&gt;
&lt;br /&gt;
= browseQuantity for calculating prices =&lt;br /&gt;
&lt;br /&gt;
* when browsing, a user can define browseQuantity they want to buy (default 1), this would be injected into price calculation to obtain available price for each sellOffer&lt;br /&gt;
* different to filters, eg availableQuantity, which determines which sellOffers are returned. (we might have a method/hook that validates or updates the complex filter so these settings don't conflict, but not needed)&lt;br /&gt;
* added to requestProperties in request&lt;br /&gt;
* I think if we request prices for a SellOffer in a quantity it cannot handle, eg browseQuantity is 100 but selloffer only has 20 remaining, the pricing function should return an error, could then remove (or mark as not enough quantity available) such sellOffers, so they might still exist in search results and maybe sort results but show quantity not/available.&lt;br /&gt;
&lt;br /&gt;
= Notes = &lt;br /&gt;
&lt;br /&gt;
* Consider requests find all possible needed data, even if the current request does not use it, that way subsequent requests can feed off the same processed data, ie standardize requiredData at request level to use cache more often&lt;br /&gt;
* there might be a special case where we find all results with an empty filter, eg for a child Search Result request which is filtered only by the adult results and wants to not filter child results in any way, that would create a record for every item in the child request and include links to all parent dataIds, that data set could be used by any other request that matches searchType/requestPropertiesHash/requiredDataHash. Maybe work that in in the future as a separate check when processing parent requests so not need to send child request, or intentionally maintain that result set. Might be able to find other shared efficient results as well, however having cached results in RequiredData will also reduce a lot of work and maybe mitigate the need for this&lt;br /&gt;
* maybe could optimise querying data even further by copying final data for each RequiredData record into SearchResultData record, so not need to query RequiredData table, but maybe not needed as most consumer queries will point to SortResult&lt;br /&gt;
&lt;br /&gt;
= Normalize Structure SearchResult Request =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    searchResultId: &amp;quot;hash_filter_main&amp;quot;,&lt;br /&gt;
    searchDetailId: &amp;quot;hash_requiredData_main_all&amp;quot;,&lt;br /&gt;
    requiredDataObjects: {&lt;br /&gt;
      hash_fieldNameObject_A: {&lt;br /&gt;
        fieldName: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hash_fieldNameObject_B: {&lt;br /&gt;
        fieldName: &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
        linkPathObjectId: &amp;quot;hash_linkPathObject_A&amp;quot;,&lt;br /&gt;
        complexFilterCombinationIds: [ //* optional&lt;br /&gt;
          &amp;quot;hash_filter_of_use_for_combination&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      hash_fieldNameObject_B: {&lt;br /&gt;
        requiredDataType: 'variantAndOrProductReqData',&lt;br /&gt;
        xxxxRequiredData: 'hash_requiredData_of_xxxx',&lt;br /&gt;
        yyyyRequiredData: 'hash_requirdData_of_yyyy'&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    searchParams: {&lt;br /&gt;
      //* case this request use filter main&lt;br /&gt;
      filterObjectId: &amp;quot;hash_filter_main&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      //* case this request send identifiers and not send request to ComplexFilter Service&lt;br /&gt;
      identifiersIds: [&lt;br /&gt;
        {&lt;br /&gt;
          xxId: &amp;quot;xxxx_1&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          xxId: &amp;quot;xxxx_2&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
      ],&lt;br /&gt;
&lt;br /&gt;
      //* case searchResult generated&lt;br /&gt;
      searchResultGeneratedParam: { //* front end cannot create searchParams --&amp;gt; searchResultGeneratedParam&lt;br /&gt;
        xxxx: { //* sort request of each objType&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;XXXX&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          searchResultId: &amp;quot;11111&amp;quot;,&lt;br /&gt;
          searchDetailId: &amp;quot;22222&amp;quot;,&lt;br /&gt;
          requiredDataObject: {&lt;br /&gt;
            hash_requiredData_of_xxxx: {&lt;br /&gt;
              fieldName: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          searchParams: {&lt;br /&gt;
            filterObjectId: &amp;quot;11111&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          filterElements: {&lt;br /&gt;
            11111: {&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;XXXX&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              filterElement: {&lt;br /&gt;
                filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                partitionKeyValues: {&lt;br /&gt;
                  xxxxId: {&lt;br /&gt;
                    value: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
                  }&lt;br /&gt;
                }&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          linkPathObjects: {},&lt;br /&gt;
          linkPathSteps: {},&lt;br /&gt;
          sortFields: [&lt;br /&gt;
            {&lt;br /&gt;
              fieldName: &amp;quot;yyyy&amp;quot;,&lt;br /&gt;
              dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
              sortOrder: &amp;quot;descending&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        },&lt;br /&gt;
        yyyy: { //* sort request of each objType&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;YYYY&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;yyyy&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          searchResultId: &amp;quot;33333&amp;quot;,&lt;br /&gt;
          searchDetailId: &amp;quot;44444&amp;quot;,&lt;br /&gt;
          requiredDataObject: {&lt;br /&gt;
            hash_requirdData_of_yyyy: {&lt;br /&gt;
              fieldName: &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
              linkPathObjectId: &amp;quot;hash_LinkPathObject_B&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          searchParams: {&lt;br /&gt;
            filterObjectId: &amp;quot;33333&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          filterElements: {&lt;br /&gt;
            33333: {&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;YYYY&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;yyyy&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              filterElement: {&lt;br /&gt;
                filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                partitionKeyValues: {&lt;br /&gt;
                  yyyyId: {&lt;br /&gt;
                    value: &amp;quot;yyyy&amp;quot;&lt;br /&gt;
                  }&lt;br /&gt;
                }&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          linkPathObjects: {&lt;br /&gt;
            hash_LinkPathObject_B: {&lt;br /&gt;
              initialObjType: {&lt;br /&gt;
                serviceTag: &amp;quot;YYYY&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;yyyy&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              linkSteps: [&lt;br /&gt;
                &amp;quot;linkStep_B_1&amp;quot;,&lt;br /&gt;
                &amp;quot;linkStep_B_2&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          linkPathSteps: {&lt;br /&gt;
            linkStep_B_1: {&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;x&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasX&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;from&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              //* setting of links&lt;br /&gt;
            },&lt;br /&gt;
            linkStep_B_2: {&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;x&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasX&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;from&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              //* setting of links&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          sortFields: [&lt;br /&gt;
            {&lt;br /&gt;
              fieldName: &amp;quot;yyyy&amp;quot;,&lt;br /&gt;
              dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
              sortOrder: &amp;quot;descending&amp;quot;,&lt;br /&gt;
              refFieldNameId: &amp;quot;hash_requirdData_of_yyyy&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    filterElements: { //* other type can see in structure_complexFilter&lt;br /&gt;
      hash_filter_main: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        filterElement: {&lt;br /&gt;
          filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
          partitionKeyValues: {&lt;br /&gt;
            xxId: {&lt;br /&gt;
              value: &amp;quot;xxx&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      hash_filter_of_use_for_combination: {&lt;br /&gt;
        //* same filter element&lt;br /&gt;
      },&lt;br /&gt;
      hash_filter_of_use_for_perParent: {&lt;br /&gt;
        //* has filter element special&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        filterElement: {&lt;br /&gt;
          filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
          partitionKeyValues: {&lt;br /&gt;
            xxId: {&lt;br /&gt;
              valueType: &amp;quot;perParentIdentifiers&amp;quot;, //* special for perParent to add parent identifiers of link from IntemediateIdentifiers table&lt;br /&gt;
              perParentIdentifierFieldname: &amp;quot;xxId&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      ref_filterMainIdA: {&lt;br /&gt;
        //* same filter element&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    linkPathObjects: {&lt;br /&gt;
      hash_linkPathObject_A: {&lt;br /&gt;
        initialObjType: {&lt;br /&gt;
          serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        linkSteps: [&lt;br /&gt;
          &amp;quot;linkStep_A_1&amp;quot;,&lt;br /&gt;
          &amp;quot;linkStep_A_2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      tttt: {&lt;br /&gt;
        //* same linkPathObject&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    linkPathSteps: {&lt;br /&gt;
      linkStep_A_1: {&lt;br /&gt;
        pathLinkType: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;x&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          relType: {&lt;br /&gt;
            serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
            relationshipTag: &amp;quot;hasX&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          direction: &amp;quot;from&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        //* setting of links&lt;br /&gt;
        requestProperties: {&lt;br /&gt;
          tag_xxx: &amp;quot;cccc&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        filterElementId: &amp;quot;ref_filterMainIdA&amp;quot;,&lt;br /&gt;
        aggregate: 'max',&lt;br /&gt;
        sortFields: [&lt;br /&gt;
          {&lt;br /&gt;
            fieldName: 'xxxx',&lt;br /&gt;
            dataType: 'string',&lt;br /&gt;
            sortOrder: 'descending',&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            fieldName: 'tttt',&lt;br /&gt;
            dataType: 'string',&lt;br /&gt;
            sortOrder: 'descending',&lt;br /&gt;
            refFieldNameId: &amp;quot;d1b376c689a2de1370e30f7629edc0cefc8d29f0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        combine: &amp;quot;true&amp;quot;,&lt;br /&gt;
        requiredDataObjects: { //* use for linkPath has linkPath&lt;br /&gt;
          d1b376c689a2de1370e30f7629edc0cefc8d29f0: {&lt;br /&gt;
            fieldName: 'tttt',&lt;br /&gt;
            linkPathObjectId: &amp;quot;tttt&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        perParentCombinationIds: [&lt;br /&gt;
          {&lt;br /&gt;
            tag: 'tag_yyyy',&lt;br /&gt;
            filterMainId: 'hash_filter_of_use_for_perParent'&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        applyCombinations: [&lt;br /&gt;
          {&lt;br /&gt;
            tag: 'tag_xxxx',&lt;br /&gt;
            filterMainId: 'hash_filter_of_use_for_combination'&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
        comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
        comparisonSortDataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
        comparisonValue: 20,&lt;br /&gt;
      },&lt;br /&gt;
      linkStep_A_2: {&lt;br /&gt;
        pathLinkType: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;x&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          relType: {&lt;br /&gt;
            serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
            relationshipTag: &amp;quot;hasX&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          direction: &amp;quot;from&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        //* setting of links&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= hash linkPath =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
searchDetailId = 'all_requiredDataHash'&lt;br /&gt;
&lt;br /&gt;
all_requiredDataHash = hash(&lt;br /&gt;
  {&lt;br /&gt;
    requiredDataObjects: { all_fieldNameObjects },&lt;br /&gt;
    linkPathObjects: { all_linkPathObjects }, //*if not have, set default = {}&lt;br /&gt;
    linkPathSteps: { all_linkPathSteps } //*if not have, set default = {}&lt;br /&gt;
  }&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
requiredDataObjects = {&lt;br /&gt;
  hash_fieldNameObject: {&lt;br /&gt;
    fieldName: &amp;quot;A_fieldName&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  hash_fieldNameObject2: {&lt;br /&gt;
    fieldName: &amp;quot;C_fieldName&amp;quot;,&lt;br /&gt;
    linkPathObjectId: &amp;quot;hash_linkPathObject&amp;quot;,&lt;br /&gt;
    complexFilterCombinationIds: [&lt;br /&gt;
      &amp;quot;hash_filter_element_for_complexFilterCombination&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
hash_fieldNameObject = hash({&lt;br /&gt;
  fieldName: {&lt;br /&gt;
    fieldName: &amp;quot;fieldName&amp;quot;,&lt;br /&gt;
    linkPathObjectId: &amp;quot;hash_linkPathObject&amp;quot;, //optional, if requiredData has linkPath&lt;br /&gt;
    complexFilterCombinationIds: [&lt;br /&gt;
      &amp;quot;hash_filter_element_for_complexFilterCombination&amp;quot;&lt;br /&gt;
    ] //optional, if requiredData has combination complexFilter&lt;br /&gt;
  },&lt;br /&gt;
  linkPathObjects: {&lt;br /&gt;
    hash_linkPathObject: {&lt;br /&gt;
      initialObjType: { A },&lt;br /&gt;
      linkSteps: [&amp;quot;hash_linkStep1&amp;quot;, &amp;quot;hash_linkStep2&amp;quot;]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  linkPathSteps: {&lt;br /&gt;
    hash_linkStep1: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: { B },&lt;br /&gt;
        relType: { hasB },&lt;br /&gt;
        direction: &amp;quot;&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      //* other settings of each link //* optional&lt;br /&gt;
      filterElementId: &amp;quot;&amp;quot;,&lt;br /&gt;
      requestProperties: {},&lt;br /&gt;
      aggregate: &amp;quot;&amp;quot;,&lt;br /&gt;
      sortFields: [],&lt;br /&gt;
      requiredDataObjects: {},&lt;br /&gt;
      combine: true | false,&lt;br /&gt;
      perParentCombinationIds: [],&lt;br /&gt;
      applyCombinations: [],&lt;br /&gt;
      comparison: &amp;quot;&amp;quot;,&lt;br /&gt;
      comparisonSortField: &amp;quot;&amp;quot;,&lt;br /&gt;
      comparisonSortDataType: &amp;quot;&amp;quot;,&lt;br /&gt;
      comparisonValue: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    hash_linkStep2: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: { C },&lt;br /&gt;
        relType: { hasC },&lt;br /&gt;
        direction: &amp;quot;&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      //* other settings of each link //* optional&lt;br /&gt;
      filterElementId: &amp;quot;&amp;quot;,&lt;br /&gt;
      requestProperties: {},&lt;br /&gt;
      aggregate: &amp;quot;&amp;quot;,&lt;br /&gt;
      sortFields: [],&lt;br /&gt;
      requiredDataObjects: {},&lt;br /&gt;
      combine: true | false,&lt;br /&gt;
      perParentCombinationIds: [],&lt;br /&gt;
      applyCombinations: [],&lt;br /&gt;
      comparison: &amp;quot;&amp;quot;,&lt;br /&gt;
      comparisonSortField: &amp;quot;&amp;quot;,&lt;br /&gt;
      comparisonSortDataType: &amp;quot;&amp;quot;,&lt;br /&gt;
      comparisonValue: &amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
linkPathObjects = {&lt;br /&gt;
  hash_fieldNameObject2: {&lt;br /&gt;
    initialObjType: {},&lt;br /&gt;
    linkSteps: [&amp;quot;hash_linkStep1&amp;quot;, &amp;quot;hash_linkStep2&amp;quot;]&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
hash_fieldNameObject2 = hash({&lt;br /&gt;
  initialObjType: { A },&lt;br /&gt;
  linkSteps: [&amp;quot;hash_linkStep1&amp;quot;, &amp;quot;hash_linkStep2&amp;quot;]&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
linkPathSteps = {&lt;br /&gt;
  hash_linkStep1: {&lt;br /&gt;
    pathLinkType: {&lt;br /&gt;
      objType: { B },&lt;br /&gt;
      relType: { hasB },&lt;br /&gt;
      direction: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    //* other settings of each link //* optional&lt;br /&gt;
    filterElementId: &amp;quot;&amp;quot;,&lt;br /&gt;
    requestProperties: {},&lt;br /&gt;
    aggregate: &amp;quot;&amp;quot;,&lt;br /&gt;
    sortFields: [],&lt;br /&gt;
    requiredDataObjects: {},&lt;br /&gt;
    combine: true | false,&lt;br /&gt;
    perParentCombinationIds: [],&lt;br /&gt;
    applyCombinations: [],&lt;br /&gt;
    comparison: &amp;quot;&amp;quot;,&lt;br /&gt;
    comparisonSortField: &amp;quot;&amp;quot;,&lt;br /&gt;
    comparisonSortDataType: &amp;quot;&amp;quot;,&lt;br /&gt;
    comparisonValue: &amp;quot;&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  hash_linkStep2: {&lt;br /&gt;
    pathLinkType: {&lt;br /&gt;
      objType: { C },&lt;br /&gt;
      relType: { hasC },&lt;br /&gt;
      direction: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    //* other settings of each link //* optional&lt;br /&gt;
    filterElementId: &amp;quot;&amp;quot;,&lt;br /&gt;
    requestProperties: {},&lt;br /&gt;
    aggregate: &amp;quot;&amp;quot;,&lt;br /&gt;
    sortFields: [],&lt;br /&gt;
    requiredDataObjects: {},&lt;br /&gt;
    combine: true | false,&lt;br /&gt;
    perParentCombinationIds: [],&lt;br /&gt;
    applyCombinations: [],&lt;br /&gt;
    comparison: &amp;quot;&amp;quot;,&lt;br /&gt;
    comparisonSortField: &amp;quot;&amp;quot;,&lt;br /&gt;
    comparisonSortDataType: &amp;quot;&amp;quot;,&lt;br /&gt;
    comparisonValue: &amp;quot;&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
hash_linkStep1 = hash({&lt;br /&gt;
  pathLinkType: {&lt;br /&gt;
    objType: { B },&lt;br /&gt;
    relType: { hasB },&lt;br /&gt;
    direction: &amp;quot;&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  //* other settings of each link //* optional&lt;br /&gt;
  filterElementId: &amp;quot;&amp;quot;,&lt;br /&gt;
  requestProperties: {},&lt;br /&gt;
  aggregate: &amp;quot;&amp;quot;,&lt;br /&gt;
  sortFields: [],&lt;br /&gt;
  requiredDataObjects: {},&lt;br /&gt;
  combine: true | false,&lt;br /&gt;
  perParentCombinationIds: [],&lt;br /&gt;
  applyCombinations: [],&lt;br /&gt;
  comparison: &amp;quot;&amp;quot;,&lt;br /&gt;
  comparisonSortField: &amp;quot;&amp;quot;,&lt;br /&gt;
  comparisonSortDataType: &amp;quot;&amp;quot;,&lt;br /&gt;
  comparisonValue: &amp;quot;&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Working documents =&lt;br /&gt;
&lt;br /&gt;
[[:Category:Working_documents - Search Results|Working_documents - Search Results]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Backend services| Search Results]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=Service_-_Search_Results&amp;diff=4184</id>
		<title>Service - Search Results</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=Service_-_Search_Results&amp;diff=4184"/>
		<updated>2026-03-18T02:30:43Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
Service that handles search result requests, feeding work to [[Service - Search Result (handlers)]]. Takes results from Complex Filter service which are identifier ids only and adds additional fields of information ready for display to end consumer, either directly if no sorting required, or via Sort Result service.&lt;br /&gt;
&lt;br /&gt;
Functions as a cache of Search Result data, so if subsequent matching requests come in they do not need to pass on to Complex Filter or find required data.&lt;br /&gt;
&lt;br /&gt;
= Repository =&lt;br /&gt;
&lt;br /&gt;
https://bitbucket.org/izara-core-search/izara-core-search-search-results/src/master/&lt;br /&gt;
&lt;br /&gt;
= DynamoDB tables =&lt;br /&gt;
&lt;br /&gt;
== [[Standard Config Table Per Service]] ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration tags ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;SearchType&amp;quot;,&lt;br /&gt;
	configTag: &amp;quot;xx&amp;quot; // {eg: sellOffer/Product/VariantProduct etc..}&lt;br /&gt;
	configValue: {&lt;br /&gt;
		complexFilterServiceName: &amp;quot;xx&amp;quot; // {service name of complex filter that handles this type}&lt;br /&gt;
		complexFilterType: &amp;quot;xx&amp;quot; // optional, if complexFilterType is different to searchType&lt;br /&gt;
		dataHandlerServiceName: &amp;quot;xx&amp;quot; {service name used to create function/queue names for finding data results, often a Manager service for the object}&lt;br /&gt;
		requireRequestProperties: {&lt;br /&gt;
			{requiredData fieldName}: [ // dependant on what requiredData requested&lt;br /&gt;
				&amp;quot;xx&amp;quot;,&lt;br /&gt;
				// .. {properties that must be received in the request for this searchType to process correctly}&lt;br /&gt;
			]&lt;br /&gt;
		},&lt;br /&gt;
		parentDataIdentifierFields: [&lt;br /&gt;
			&amp;quot;xx&amp;quot;, // these are always found with any request for this SearchType to add into ParentDataId table for each found data&lt;br /&gt;
		],&lt;br /&gt;
		childSearchResults: {&lt;br /&gt;
			{childSearchType}: { // searchType of child searchResult, matches filterType for building child complex filter&lt;br /&gt;
				searchResultsServiceName: &amp;quot;xx&amp;quot;, // allows for results to be saved by different deployed services&lt;br /&gt;
				requiredData: { // requiredData we request from the child searchType depending on what requiredData fields are set in the parent's request&lt;br /&gt;
					{parent requiredData fieldName}: [&lt;br /&gt;
						&amp;quot;xx&amp;quot;, // list of child requiredData fields to add&lt;br /&gt;
						// ..&lt;br /&gt;
					],&lt;br /&gt;
					// ..&lt;br /&gt;
				},&lt;br /&gt;
				passOnRequestProperties: [ // parent requestProperties to pass on to the child searchResult request, if not received in parent request will error&lt;br /&gt;
					&amp;quot;xx&amp;quot;, &lt;br /&gt;
					// .. &lt;br /&gt;
				]&lt;br /&gt;
			},&lt;br /&gt;
			// ..&lt;br /&gt;
		}&lt;br /&gt;
		hookBeforeFindDataServiceName: &amp;quot;xx&amp;quot;, // if set will send async request to external service before finding data&lt;br /&gt;
		hookAfterFindDataServiceName: &amp;quot;xx&amp;quot;, // if set will send async request to external service before finding data&lt;br /&gt;
	}&lt;br /&gt;
},&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SearchResultMain ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	searchResultId: &amp;quot;xx&amp;quot; // main element for one set of search results&lt;br /&gt;
	searchDetailId: &amp;quot;xx&amp;quot; // hashes of other values that affect result data&lt;br /&gt;
	searchResultMainStatus: &amp;quot;processing&amp;quot;,&lt;br /&gt;
	requiredData: {} // same as request&lt;br /&gt;
	childSearchIds: {&lt;br /&gt;
		{childSearchType}: [{array of childSearchIds}], // array of childSearchIds for this parent searchResultMain, split out by childSearchType&lt;br /&gt;
		// ..&lt;br /&gt;
	}&lt;br /&gt;
	createTime: currentTime.getTime(),&lt;br /&gt;
	expiryTime: expiryTime.getTime(),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: searchResultId&lt;br /&gt;
* sort key: searchDetailId&lt;br /&gt;
* searchResultId: for standard single filter searches is {searchType}_{filterMainId}&lt;br /&gt;
* searchDetailId: for standard single filter searches is {requestPropertiesHash}_{requiredDataHash}&lt;br /&gt;
* searchResultId: for combined search results is {searchType}_{searchParamsHash}&lt;br /&gt;
* searchDetailId: for combined search results is {requiredDataHash}&lt;br /&gt;
&lt;br /&gt;
== SearchResultParents ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	childSearchId: &amp;quot;xx&amp;quot;, // {searchResultId}_{searchDetailId}&lt;br /&gt;
	parentSearchId: &amp;quot;xx&amp;quot; // {searchResultId}_{searchDetailId}&lt;br /&gt;
	searchResultParentStatus: &amp;quot;processing&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: childSearchId&lt;br /&gt;
* sort key: parentSearchId&lt;br /&gt;
* when a SearchResultMain is finished it checks this table to see if any parents need to be processed&lt;br /&gt;
&lt;br /&gt;
== SearchResultData ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	searchId: &amp;quot;xx&amp;quot;, // {searchResultId}_{searchDetailId}&lt;br /&gt;
	dataId: &amp;quot;xx&amp;quot;, // id of element (sellOfferId/productId/variantProduct(type and id))&lt;br /&gt;
	// reconsider this field, does not scale: childData: {}, // only used when childId set in SearchResultMain, saves requiredData results for all matching child records&lt;br /&gt;
	searchResultDataStatus: &amp;quot;processing&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: searchId&lt;br /&gt;
* sort key: dataId&lt;br /&gt;
&lt;br /&gt;
== RequiredData ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	requiredDataId: &amp;quot;xx&amp;quot;, // {searchType}_{dataId}_{requestPropertiesHash} OR maybe hash of object of these values?&lt;br /&gt;
	fieldName: &amp;quot;xx&amp;quot;,&lt;br /&gt;
	requiredDataValue: &amp;quot;xx&amp;quot;, // value found for this reqdata field&lt;br /&gt;
	requiredDataStatus: &amp;quot;xx&amp;quot;, // waitingExternalData | complete | invalid&lt;br /&gt;
    createTime: currentTime.getTime(),&lt;br /&gt;
    expiryTime: expiryTime.getTime(),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: requiredDataId &lt;br /&gt;
* sort key: fieldName&lt;br /&gt;
* one record is one result we can calculate from external services, this can be shared by multiple SearchResultData records&lt;br /&gt;
* requiredDataId includes identifiers that can affect the data's value&lt;br /&gt;
* if keys too long for Dynamo we could hash an object containing all required fields and can add the values of each into the item separately, if needed&lt;br /&gt;
* primary key can be used when result comes back from external service, so that message must include all values needed to make requiredDataId&lt;br /&gt;
* can probably add fields during processing to store extra data for processing this SearchResultData record&lt;br /&gt;
* if we want to find all records for one SearchResultData we could search for just the partition key, but it might return additonal fields used by other searches with different requiredData&lt;br /&gt;
&lt;br /&gt;
== RequiredDataSearchResultData ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	requiredDataId_fieldName: &amp;quot;xx&amp;quot;, // {requiredDataId}_{fieldName}&lt;br /&gt;
	searchId: &amp;quot;xx&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: requiredDataId_fieldName&lt;br /&gt;
* sort key: searchId&lt;br /&gt;
* can extract dataId from requiredDataId_fieldName to find primary key for SearchResultData&lt;br /&gt;
* used to create links between RequiredData results and all SearchResultData that need it&lt;br /&gt;
&lt;br /&gt;
== ParentDataId ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	parentId: &amp;quot;xx&amp;quot;, // {parent searchType}_{parent dataId}_{child searchResultId (searchType and filterMainId)}_{requestPropertiesHash}&lt;br /&gt;
	childDataId: &amp;quot;xx&amp;quot; // {child dataId}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* partition key: parentId, identifies one parent dataId matching to a specific childSearchResult, excluding requiredData which is unimportant in this context, only need to specify child searchType/filterMainId/requestPropertiesHash to identify what matching one unique set of parent dataIds&lt;br /&gt;
* sort key: childDataId&lt;br /&gt;
* child filterMainId is required because we will have different ranges of childIds stored depending on what filter was used to find them&lt;br /&gt;
&lt;br /&gt;
= requestProperties =&lt;br /&gt;
&lt;br /&gt;
These are properties that are added to a Search Result request that affect the data found, they may be required or optional. Because these properties can affect the value of data they must be added to SearchResultMain identifiers to differentiate batches of results.&lt;br /&gt;
&lt;br /&gt;
= requireRequestProperties =&lt;br /&gt;
&lt;br /&gt;
Some requiredData fields will need additional properties to be received in the initial request.&lt;br /&gt;
* example: variant/product/sellOffer pricing fields will require locationNodeId/s and browseQuantity&lt;br /&gt;
* example: all translations require language/s&lt;br /&gt;
&lt;br /&gt;
= Moving child SearchResult data to parent = &lt;br /&gt;
* eg: product searchType has sellOffer child searchType data&lt;br /&gt;
* eg: variantProduct searchType has product child searchType data&lt;br /&gt;
* parent must wait for child FindData to complete before can process parents FindData&lt;br /&gt;
* child SearchResult might already have completed before the parent request was received (ie by a different request), need to account for this&lt;br /&gt;
* (old design - can still use if have to, but would be best to separate results so can scale, eg if want to show details about child products, that could pass as a separate Search/Sort set of results including pagination) aggregate multiple child data into the parents data values, but also keep a record of all children in the parents data record&lt;br /&gt;
&lt;br /&gt;
= Multiple Search Results services =&lt;br /&gt;
&lt;br /&gt;
* design to allow for different implementations, eg catalogs can choose which Search Results service it uses&lt;br /&gt;
* could achieve this be having a setting in Catalog handlers or Catalog Manager that records which Search Result service the Catalog uses&lt;br /&gt;
&lt;br /&gt;
= browseQuantity for calculating prices =&lt;br /&gt;
&lt;br /&gt;
* when browsing, a user can define browseQuantity they want to buy (default 1), this would be injected into price calculation to obtain available price for each sellOffer&lt;br /&gt;
* different to filters, eg availableQuantity, which determines which sellOffers are returned. (we might have a method/hook that validates or updates the complex filter so these settings don't conflict, but not needed)&lt;br /&gt;
* added to requestProperties in request&lt;br /&gt;
* I think if we request prices for a SellOffer in a quantity it cannot handle, eg browseQuantity is 100 but selloffer only has 20 remaining, the pricing function should return an error, could then remove (or mark as not enough quantity available) such sellOffers, so they might still exist in search results and maybe sort results but show quantity not/available.&lt;br /&gt;
&lt;br /&gt;
= Notes = &lt;br /&gt;
&lt;br /&gt;
* Consider requests find all possible needed data, even if the current request does not use it, that way subsequent requests can feed off the same processed data, ie standardize requiredData at request level to use cache more often&lt;br /&gt;
* there might be a special case where we find all results with an empty filter, eg for a child Search Result request which is filtered only by the adult results and wants to not filter child results in any way, that would create a record for every item in the child request and include links to all parent dataIds, that data set could be used by any other request that matches searchType/requestPropertiesHash/requiredDataHash. Maybe work that in in the future as a separate check when processing parent requests so not need to send child request, or intentionally maintain that result set. Might be able to find other shared efficient results as well, however having cached results in RequiredData will also reduce a lot of work and maybe mitigate the need for this&lt;br /&gt;
* maybe could optimise querying data even further by copying final data for each RequiredData record into SearchResultData record, so not need to query RequiredData table, but maybe not needed as most consumer queries will point to SortResult&lt;br /&gt;
&lt;br /&gt;
= Normalize Structure SearchResult Request =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    searchResultId: &amp;quot;hash_filter_main&amp;quot;,&lt;br /&gt;
    searchDetailId: &amp;quot;hash_requiredData_main_all&amp;quot;,&lt;br /&gt;
    requiredDataObjects: {&lt;br /&gt;
      hash_fieldNameObject_A: {&lt;br /&gt;
        fieldName: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hash_fieldNameObject_B: {&lt;br /&gt;
        fieldName: &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
        linkPathObjectId: &amp;quot;hash_linkPathObject_A&amp;quot;,&lt;br /&gt;
        complexFilterCombinationIds: [ //* optional&lt;br /&gt;
          &amp;quot;hash_filter_of_use_for_combination&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      hash_fieldNameObject_B: {&lt;br /&gt;
        requiredDataType: 'variantAndOrProductReqData',&lt;br /&gt;
        xxxxRequiredData: 'hash_requiredData_of_xxxx',&lt;br /&gt;
        yyyyRequiredData: 'hash_requirdData_of_yyyy'&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    searchParams: {&lt;br /&gt;
      //* case this request use filter main&lt;br /&gt;
      filterObjectId: &amp;quot;hash_filter_main&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      //* case this request send identifiers and not send request to ComplexFilter Service&lt;br /&gt;
      identifiersIds: [&lt;br /&gt;
        {&lt;br /&gt;
          xxId: &amp;quot;xxxx_1&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          xxId: &amp;quot;xxxx_2&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
      ],&lt;br /&gt;
&lt;br /&gt;
      //* case searchResult generated&lt;br /&gt;
      searchResultGeneratedParam: {&lt;br /&gt;
        xxxx: { //* sort request of each objType&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;XXXX&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          searchResultId: &amp;quot;11111&amp;quot;,&lt;br /&gt;
          searchDetailId: &amp;quot;22222&amp;quot;,&lt;br /&gt;
          requiredDataObject: {&lt;br /&gt;
            hash_requiredData_of_xxxx: {&lt;br /&gt;
              fieldName: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          searchParams: {&lt;br /&gt;
            filterObjectId: &amp;quot;11111&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          filterElements: {&lt;br /&gt;
            11111: {&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;XXXX&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              filterElement: {&lt;br /&gt;
                filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                partitionKeyValues: {&lt;br /&gt;
                  xxxxId: {&lt;br /&gt;
                    value: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
                  }&lt;br /&gt;
                }&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          linkPathObjects: {},&lt;br /&gt;
          linkPathSteps: {},&lt;br /&gt;
          sortFields: [&lt;br /&gt;
            {&lt;br /&gt;
              fieldName: &amp;quot;yyyy&amp;quot;,&lt;br /&gt;
              dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
              sortOrder: &amp;quot;descending&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        },&lt;br /&gt;
        yyyy: { //* sort request of each objType&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;YYYY&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;yyyy&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          searchResultId: &amp;quot;33333&amp;quot;,&lt;br /&gt;
          searchDetailId: &amp;quot;44444&amp;quot;,&lt;br /&gt;
          requiredDataObject: {&lt;br /&gt;
            hash_requirdData_of_yyyy: {&lt;br /&gt;
              fieldName: &amp;quot;xxxx&amp;quot;,&lt;br /&gt;
              linkPathObjectId: &amp;quot;hash_LinkPathObject_B&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          searchParams: {&lt;br /&gt;
            filterObjectId: &amp;quot;33333&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          filterElements: {&lt;br /&gt;
            33333: {&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;YYYY&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;yyyy&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              filterElement: {&lt;br /&gt;
                filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                partitionKeyValues: {&lt;br /&gt;
                  yyyyId: {&lt;br /&gt;
                    value: &amp;quot;yyyy&amp;quot;&lt;br /&gt;
                  }&lt;br /&gt;
                }&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          linkPathObjects: {&lt;br /&gt;
            hash_LinkPathObject_B: {&lt;br /&gt;
              initialObjType: {&lt;br /&gt;
                serviceTag: &amp;quot;YYYY&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;yyyy&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              linkSteps: [&lt;br /&gt;
                &amp;quot;linkStep_B_1&amp;quot;,&lt;br /&gt;
                &amp;quot;linkStep_B_2&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          linkPathSteps: {&lt;br /&gt;
            linkStep_B_1: {&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;x&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasX&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;from&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              //* setting of links&lt;br /&gt;
            },&lt;br /&gt;
            linkStep_B_2: {&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;x&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasX&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;from&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              //* setting of links&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          sortFields: [&lt;br /&gt;
            {&lt;br /&gt;
              fieldName: &amp;quot;yyyy&amp;quot;,&lt;br /&gt;
              dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
              sortOrder: &amp;quot;descending&amp;quot;,&lt;br /&gt;
              refFieldNameId: &amp;quot;hash_requirdData_of_yyyy&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    filterElements: { //* other type can see in structure_complexFilter&lt;br /&gt;
      hash_filter_main: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        filterElement: {&lt;br /&gt;
          filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
          partitionKeyValues: {&lt;br /&gt;
            xxId: {&lt;br /&gt;
              value: &amp;quot;xxx&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      hash_filter_of_use_for_combination: {&lt;br /&gt;
        //* same filter element&lt;br /&gt;
      },&lt;br /&gt;
      hash_filter_of_use_for_perParent: {&lt;br /&gt;
        //* has filter element special&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        filterElement: {&lt;br /&gt;
          filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
          partitionKeyValues: {&lt;br /&gt;
            xxId: {&lt;br /&gt;
              valueType: &amp;quot;perParentIdentifiers&amp;quot;, //* special for perParent to add parent identifiers of link from IntemediateIdentifiers table&lt;br /&gt;
              perParentIdentifierFieldname: &amp;quot;xxId&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      ref_filterMainIdA: {&lt;br /&gt;
        //* same filter element&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    linkPathObjects: {&lt;br /&gt;
      hash_linkPathObject_A: {&lt;br /&gt;
        initialObjType: {&lt;br /&gt;
          serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        linkSteps: [&lt;br /&gt;
          &amp;quot;linkStep_A_1&amp;quot;,&lt;br /&gt;
          &amp;quot;linkStep_A_2&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      tttt: {&lt;br /&gt;
        //* same linkPathObject&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    linkPathSteps: {&lt;br /&gt;
      linkStep_A_1: {&lt;br /&gt;
        pathLinkType: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;x&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          relType: {&lt;br /&gt;
            serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
            relationshipTag: &amp;quot;hasX&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          direction: &amp;quot;from&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        //* setting of links&lt;br /&gt;
        requestProperties: {&lt;br /&gt;
          tag_xxx: &amp;quot;cccc&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        filterElementId: &amp;quot;ref_filterMainIdA&amp;quot;,&lt;br /&gt;
        aggregate: 'max',&lt;br /&gt;
        sortFields: [&lt;br /&gt;
          {&lt;br /&gt;
            fieldName: 'xxxx',&lt;br /&gt;
            dataType: 'string',&lt;br /&gt;
            sortOrder: 'descending',&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            fieldName: 'tttt',&lt;br /&gt;
            dataType: 'string',&lt;br /&gt;
            sortOrder: 'descending',&lt;br /&gt;
            refFieldNameId: &amp;quot;d1b376c689a2de1370e30f7629edc0cefc8d29f0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        combine: &amp;quot;true&amp;quot;,&lt;br /&gt;
        requiredDataObjects: { //* use for linkPath has linkPath&lt;br /&gt;
          d1b376c689a2de1370e30f7629edc0cefc8d29f0: {&lt;br /&gt;
            fieldName: 'tttt',&lt;br /&gt;
            linkPathObjectId: &amp;quot;tttt&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        perParentCombinationIds: [&lt;br /&gt;
          {&lt;br /&gt;
            tag: 'tag_yyyy',&lt;br /&gt;
            filterMainId: 'hash_filter_of_use_for_perParent'&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        applyCombinations: [&lt;br /&gt;
          {&lt;br /&gt;
            tag: 'tag_xxxx',&lt;br /&gt;
            filterMainId: 'hash_filter_of_use_for_combination'&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
        comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
        comparisonSortDataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
        comparisonValue: 20,&lt;br /&gt;
      },&lt;br /&gt;
      linkStep_A_2: {&lt;br /&gt;
        pathLinkType: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;x&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          relType: {&lt;br /&gt;
            serviceTag: &amp;quot;X&amp;quot;,&lt;br /&gt;
            relationshipTag: &amp;quot;hasX&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          direction: &amp;quot;from&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        //* setting of links&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= hash linkPath =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
searchDetailId = 'all_requiredDataHash'&lt;br /&gt;
&lt;br /&gt;
all_requiredDataHash = hash(&lt;br /&gt;
  {&lt;br /&gt;
    requiredDataObjects: { all_fieldNameObjects },&lt;br /&gt;
    linkPathObjects: { all_linkPathObjects }, //*if not have, set default = {}&lt;br /&gt;
    linkPathSteps: { all_linkPathSteps } //*if not have, set default = {}&lt;br /&gt;
  }&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
requiredDataObjects = {&lt;br /&gt;
  hash_fieldNameObject: {&lt;br /&gt;
    fieldName: &amp;quot;A_fieldName&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  hash_fieldNameObject2: {&lt;br /&gt;
    fieldName: &amp;quot;C_fieldName&amp;quot;,&lt;br /&gt;
    linkPathObjectId: &amp;quot;hash_linkPathObject&amp;quot;,&lt;br /&gt;
    complexFilterCombinationIds: [&lt;br /&gt;
      &amp;quot;hash_filter_element_for_complexFilterCombination&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
hash_fieldNameObject = hash({&lt;br /&gt;
  fieldName: {&lt;br /&gt;
    fieldName: &amp;quot;fieldName&amp;quot;,&lt;br /&gt;
    linkPathObjectId: &amp;quot;hash_linkPathObject&amp;quot;, //optional, if requiredData has linkPath&lt;br /&gt;
    complexFilterCombinationIds: [&lt;br /&gt;
      &amp;quot;hash_filter_element_for_complexFilterCombination&amp;quot;&lt;br /&gt;
    ] //optional, if requiredData has combination complexFilter&lt;br /&gt;
  },&lt;br /&gt;
  linkPathObjects: {&lt;br /&gt;
    hash_linkPathObject: {&lt;br /&gt;
      initialObjType: { A },&lt;br /&gt;
      linkSteps: [&amp;quot;hash_linkStep1&amp;quot;, &amp;quot;hash_linkStep2&amp;quot;]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  linkPathSteps: {&lt;br /&gt;
    hash_linkStep1: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: { B },&lt;br /&gt;
        relType: { hasB },&lt;br /&gt;
        direction: &amp;quot;&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      //* other settings of each link //* optional&lt;br /&gt;
      filterElementId: &amp;quot;&amp;quot;,&lt;br /&gt;
      requestProperties: {},&lt;br /&gt;
      aggregate: &amp;quot;&amp;quot;,&lt;br /&gt;
      sortFields: [],&lt;br /&gt;
      requiredDataObjects: {},&lt;br /&gt;
      combine: true | false,&lt;br /&gt;
      perParentCombinationIds: [],&lt;br /&gt;
      applyCombinations: [],&lt;br /&gt;
      comparison: &amp;quot;&amp;quot;,&lt;br /&gt;
      comparisonSortField: &amp;quot;&amp;quot;,&lt;br /&gt;
      comparisonSortDataType: &amp;quot;&amp;quot;,&lt;br /&gt;
      comparisonValue: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    hash_linkStep2: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
        objType: { C },&lt;br /&gt;
        relType: { hasC },&lt;br /&gt;
        direction: &amp;quot;&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      //* other settings of each link //* optional&lt;br /&gt;
      filterElementId: &amp;quot;&amp;quot;,&lt;br /&gt;
      requestProperties: {},&lt;br /&gt;
      aggregate: &amp;quot;&amp;quot;,&lt;br /&gt;
      sortFields: [],&lt;br /&gt;
      requiredDataObjects: {},&lt;br /&gt;
      combine: true | false,&lt;br /&gt;
      perParentCombinationIds: [],&lt;br /&gt;
      applyCombinations: [],&lt;br /&gt;
      comparison: &amp;quot;&amp;quot;,&lt;br /&gt;
      comparisonSortField: &amp;quot;&amp;quot;,&lt;br /&gt;
      comparisonSortDataType: &amp;quot;&amp;quot;,&lt;br /&gt;
      comparisonValue: &amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
linkPathObjects = {&lt;br /&gt;
  hash_fieldNameObject2: {&lt;br /&gt;
    initialObjType: {},&lt;br /&gt;
    linkSteps: [&amp;quot;hash_linkStep1&amp;quot;, &amp;quot;hash_linkStep2&amp;quot;]&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
hash_fieldNameObject2 = hash({&lt;br /&gt;
  initialObjType: { A },&lt;br /&gt;
  linkSteps: [&amp;quot;hash_linkStep1&amp;quot;, &amp;quot;hash_linkStep2&amp;quot;]&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
linkPathSteps = {&lt;br /&gt;
  hash_linkStep1: {&lt;br /&gt;
    pathLinkType: {&lt;br /&gt;
      objType: { B },&lt;br /&gt;
      relType: { hasB },&lt;br /&gt;
      direction: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    //* other settings of each link //* optional&lt;br /&gt;
    filterElementId: &amp;quot;&amp;quot;,&lt;br /&gt;
    requestProperties: {},&lt;br /&gt;
    aggregate: &amp;quot;&amp;quot;,&lt;br /&gt;
    sortFields: [],&lt;br /&gt;
    requiredDataObjects: {},&lt;br /&gt;
    combine: true | false,&lt;br /&gt;
    perParentCombinationIds: [],&lt;br /&gt;
    applyCombinations: [],&lt;br /&gt;
    comparison: &amp;quot;&amp;quot;,&lt;br /&gt;
    comparisonSortField: &amp;quot;&amp;quot;,&lt;br /&gt;
    comparisonSortDataType: &amp;quot;&amp;quot;,&lt;br /&gt;
    comparisonValue: &amp;quot;&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  hash_linkStep2: {&lt;br /&gt;
    pathLinkType: {&lt;br /&gt;
      objType: { C },&lt;br /&gt;
      relType: { hasC },&lt;br /&gt;
      direction: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    //* other settings of each link //* optional&lt;br /&gt;
    filterElementId: &amp;quot;&amp;quot;,&lt;br /&gt;
    requestProperties: {},&lt;br /&gt;
    aggregate: &amp;quot;&amp;quot;,&lt;br /&gt;
    sortFields: [],&lt;br /&gt;
    requiredDataObjects: {},&lt;br /&gt;
    combine: true | false,&lt;br /&gt;
    perParentCombinationIds: [],&lt;br /&gt;
    applyCombinations: [],&lt;br /&gt;
    comparison: &amp;quot;&amp;quot;,&lt;br /&gt;
    comparisonSortField: &amp;quot;&amp;quot;,&lt;br /&gt;
    comparisonSortDataType: &amp;quot;&amp;quot;,&lt;br /&gt;
    comparisonValue: &amp;quot;&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
hash_linkStep1 = hash({&lt;br /&gt;
  pathLinkType: {&lt;br /&gt;
    objType: { B },&lt;br /&gt;
    relType: { hasB },&lt;br /&gt;
    direction: &amp;quot;&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  //* other settings of each link //* optional&lt;br /&gt;
  filterElementId: &amp;quot;&amp;quot;,&lt;br /&gt;
  requestProperties: {},&lt;br /&gt;
  aggregate: &amp;quot;&amp;quot;,&lt;br /&gt;
  sortFields: [],&lt;br /&gt;
  requiredDataObjects: {},&lt;br /&gt;
  combine: true | false,&lt;br /&gt;
  perParentCombinationIds: [],&lt;br /&gt;
  applyCombinations: [],&lt;br /&gt;
  comparison: &amp;quot;&amp;quot;,&lt;br /&gt;
  comparisonSortField: &amp;quot;&amp;quot;,&lt;br /&gt;
  comparisonSortDataType: &amp;quot;&amp;quot;,&lt;br /&gt;
  comparisonValue: &amp;quot;&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Working documents =&lt;br /&gt;
&lt;br /&gt;
[[:Category:Working_documents - Search Results|Working_documents - Search Results]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Backend services| Search Results]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=Service_-_Complex_Filter&amp;diff=4182</id>
		<title>Service - Complex Filter</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=Service_-_Complex_Filter&amp;diff=4182"/>
		<updated>2026-03-18T01:32:50Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
Allows for filters that span nested levels of related entities&lt;br /&gt;
&lt;br /&gt;
= Repository =&lt;br /&gt;
&lt;br /&gt;
https://bitbucket.org/izara-core-search/izara-core-search-complex-filters&lt;br /&gt;
&lt;br /&gt;
= DynamoDB tables =&lt;br /&gt;
&lt;br /&gt;
== [[Standard Config Table Per Service]] ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration tags ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;FilterType&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;xx&amp;quot; // eg: variant / product / sellOffer&lt;br /&gt;
	configValue: {&lt;br /&gt;
		childComplexFilterTypes: {&lt;br /&gt;
			{child filterType}: {&lt;br /&gt;
				&amp;quot;translateIdsServiceName&amp;quot;: &amp;quot;xx&amp;quot; // eg: variantManager / sellOfferManager, service than converts child id to parent id&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
		logicalServiceNames : [&amp;quot;xx&amp;quot;, &amp;quot;yy&amp;quot;] // eg: &amp;quot;ProductStandard&amp;quot;, &amp;quot;ProductCustom&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* logicalServiceNames should not duplicate over mulitiple FilterType's, because we use this setting to match a Logical Service response to a FilterMain record, need it to uniquely identify one filterMain record&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;ComplexFilterServiceName&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;xx&amp;quot; // eg: product / sellOffer&lt;br /&gt;
	configValue: &amp;quot;yy&amp;quot; // eg: ComplexFilterProducts&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;ExpiryInterval&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;ExpiryInterval&amp;quot;&lt;br /&gt;
	configValue: xx // minutes(?) complexfilter ttl&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;MaxProcessInvocationCount&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;MaxProcessInvocationCount&amp;quot;&lt;br /&gt;
	configValue: 10 // maximum number of invocations allowed for large operation complex filter processing&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= complexFilter request =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	filterType: &amp;quot;xx&amp;quot; // eg: &amp;quot;mediaLink&amp;quot;,&lt;br /&gt;
	type: &amp;quot;group&amp;quot;,&lt;br /&gt;
	elements:&lt;br /&gt;
	[&lt;br /&gt;
		{&lt;br /&gt;
			type: &amp;quot;complexFilter&amp;quot;,&lt;br /&gt;
			complexFilter: {&lt;br /&gt;
				filterType: &amp;quot;xx&amp;quot;, //eg: mediaLinkProperty&lt;br /&gt;
				type: &amp;quot;group&amp;quot;,&lt;br /&gt;
				elements: &lt;br /&gt;
				[&lt;br /&gt;
					{&lt;br /&gt;
						type: &amp;quot;logical&amp;quot;,&lt;br /&gt;
						logicalTag: &amp;quot;propertyLabelId&amp;quot;, // is used by the logical service/s to decide how to find data&lt;br /&gt;
&lt;br /&gt;
						// the below properties are up to the logicalTag what is needed, but these are common:&lt;br /&gt;
						comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
						value: &amp;quot;lksdflkfldfgldfkgjldfg&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
				]&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			type: &amp;quot;logicalOperator&amp;quot;,&lt;br /&gt;
			operator: &amp;quot;and&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			type: &amp;quot;complexFilter&amp;quot;,&lt;br /&gt;
			complexFilter: {&lt;br /&gt;
				filterType: &amp;quot;xx&amp;quot;, //eg: mediaLinkPropertyTranslation&lt;br /&gt;
				type: &amp;quot;group&amp;quot;,&lt;br /&gt;
				elements: &lt;br /&gt;
				[&lt;br /&gt;
					{&lt;br /&gt;
						type: &amp;quot;logical&amp;quot;,&lt;br /&gt;
						logicalTag: &amp;quot;textTag_languageId_text&amp;quot;,&lt;br /&gt;
						&lt;br /&gt;
						//example for matching to specific translation text:&lt;br /&gt;
						textTag: &amp;quot;mediaLinkPropertyValue&amp;quot;,&lt;br /&gt;
						languageId: &amp;quot;en&amp;quot;,&lt;br /&gt;
						text: &amp;quot;Blue&amp;quot;,&lt;br /&gt;
						subjectIdentifierPropertyName: &amp;quot;propertyId&amp;quot;,&lt;br /&gt;
						caseSensitive: true&lt;br /&gt;
					},&lt;br /&gt;
				]&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		...&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How to request Complex Filter =&lt;br /&gt;
&lt;br /&gt;
* invoke shared library function createFilterMainId which iterates through elements and builds filterMainId by applying operators. There are no database requests in this function so it can be run from any service and can trust the filterMainId will be standardized&lt;br /&gt;
* No cleaning of the filter object is performed, so additional unused properties would result in a different filterMainId, even if the underlying filter is the same&lt;br /&gt;
* calling function saves filterMainId in pending table waiting for filter complete, this needs to be done before calling ProcessComplexFilter to protect against race condition of complex filter completing before pending record saved (probably use AwaitingStep process)&lt;br /&gt;
* All requests to ProcessComplexFilter will send a message out, even if cache exists&lt;br /&gt;
* CallingFlow param allows Complex Filter service to pass a message back to only the calling flow when a request hits cached results&lt;br /&gt;
&lt;br /&gt;
== How is filterMainId generated ==&lt;br /&gt;
&lt;br /&gt;
* cannot hash entire request elements without iterating through the elements because a final filterMainId of multiple elements is actually the final operation filterMainId (hash of the last element joined with the previous culmination of operation elements)&lt;br /&gt;
* this does not match a hash of the original request object&lt;br /&gt;
* needs to be done this way so we can back track through parent operations in a standardized way when receiving results for each element &lt;br /&gt;
&lt;br /&gt;
= Normal Structure ComplexFilter Request =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
 { //* type: &amp;quot;logical&amp;quot; structure&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    filterMainId: &amp;quot;hash_operation&amp;quot;,&lt;br /&gt;
    filterElements: { //* this is top filterElements that keep all filterElement of request&lt;br /&gt;
      hash_ref_filterElement_A: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        filterElement: {&lt;br /&gt;
          filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
          partitionKeyValues: {&lt;br /&gt;
            xxId: &amp;quot;xx&amp;quot;,&lt;br /&gt;
            yyId: &amp;quot;yy&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          sortKeyValues: {&lt;br /&gt;
            zzId: &amp;quot;zz&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
          comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
          conditionalFieldValues: [&lt;br /&gt;
            {&lt;br /&gt;
              fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
              includeValues: [&amp;quot;th&amp;quot;],&lt;br /&gt;
              // excludeValues: [&amp;quot;en&amp;quot;,&amp;quot;jp&amp;quot;]&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      hash_childComplexFilter: {&lt;br /&gt;
        objType: {},&lt;br /&gt;
        filterElement: {&lt;br /&gt;
           filterType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
              serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
              objectType: &amp;quot;yy&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
            relType: {&lt;br /&gt;
              serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
              relationshipTag: &amp;quot;hasYY&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
           direction: &amp;quot;from&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         childFilterElementId: &amp;quot;hash_ref_filterElement_A&amp;quot;,&lt;br /&gt;
         requestProperties: {&lt;br /&gt;
           tag_xxxxx: &amp;quot;xxxxx&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      hash_ref_filterElement_B: {&lt;br /&gt;
         //* normalize structure&lt;br /&gt;
      },&lt;br /&gt;
      hash_operation: {&lt;br /&gt;
        objType: {},&lt;br /&gt;
        filterElement: {&lt;br /&gt;
          filterType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
          filterElementLeft: &amp;quot;hash_childComplexFilter&amp;quot;,&lt;br /&gt;
          filterElementRight: &amp;quot;hash_ref_filterElement_B&amp;quot;,&lt;br /&gt;
          operator: &amp;quot;AND&amp;quot; | &amp;quot;OR&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= example pattern each filterType structure in filterElement =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
      partitionKeyValues: {&lt;br /&gt;
            xxId: &amp;quot;xx&amp;quot;,&lt;br /&gt;
            yyId: &amp;quot;yy&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      sortKeyValues: {&lt;br /&gt;
            zzId: &amp;quot;zz&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
      conditionalFieldValues: [&lt;br /&gt;
        {&lt;br /&gt;
          fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
          includeValues: [&amp;quot;th&amp;quot;],&lt;br /&gt;
          // excludeValues: [&amp;quot;en&amp;quot;,&amp;quot;jp&amp;quot;]&lt;br /&gt;
        }&lt;br /&gt;
     ]&lt;br /&gt;
  },&lt;br /&gt;
  { &lt;br /&gt;
    filterType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
    filterElements: { //* use when hash own filterMainId, but when keep in top filterElmenets must delete &lt;br /&gt;
       ref_filterElement_A: {&lt;br /&gt;
         //* normalize structure&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    pathLinkType: {&lt;br /&gt;
       objType: {&lt;br /&gt;
         serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
         objectType: &amp;quot;yy&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       relType: {&lt;br /&gt;
         serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
         relationshipTag: &amp;quot;hasYY&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       direction: &amp;quot;from&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    childFilterElementId: &amp;quot;ref_filterElement_A&amp;quot;,&lt;br /&gt;
    requestProperties: {&lt;br /&gt;
       tag_xxxxx: &amp;quot;xxxxx&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    filterType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
    filterElements: { //* use when hash own filterMainId, but when keep in top filterElmenets must delete &lt;br /&gt;
      ref_filterElement_A: {&lt;br /&gt;
        //* normalize structure&lt;br /&gt;
      },&lt;br /&gt;
      ref_filterElement_B: {&lt;br /&gt;
        //* normalize structure&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    filterElementLeft: &amp;quot;ref_filterElement_A&amp;quot;,&lt;br /&gt;
    filterElementRight: &amp;quot;ref_filterElement_B&amp;quot;,&lt;br /&gt;
    operator: &amp;quot;AND&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    filterType: &amp;quot;translateIds &amp;quot;,&lt;br /&gt;
    childIdentifiers: [&lt;br /&gt;
      {&lt;br /&gt;
        xxId: &amp;quot;111&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        xxId: &amp;quot;222&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    pathLinkType: {&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;yy&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;yy&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      relType: {&lt;br /&gt;
        serviceTag: &amp;quot;yy&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;hasYY&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      direction: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    requesetProperties: {&lt;br /&gt;
      tag_quantity: 20&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  { //* traversal has hopsPassObjType&lt;br /&gt;
    filterType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
    traversals: [&lt;br /&gt;
      {&lt;br /&gt;
        links: [&lt;br /&gt;
         {&lt;br /&gt;
           relType: {},&lt;br /&gt;
           direction: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           relType: {},&lt;br /&gt;
           direction: &amp;quot;&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
        ],&lt;br /&gt;
      //* other settings&lt;br /&gt;
 	fields: { //* optional&lt;br /&gt;
          categoryId: 'sellOfferId_value',&lt;br /&gt;
           productId: 'sellOfferId_value'&lt;br /&gt;
        },&lt;br /&gt;
       relationshipProperties: { timestamp: 'sellOfferId_value' }, //* optional&lt;br /&gt;
       hopsStart: 1, //* optional default = 1&lt;br /&gt;
       hopsEnd: 10, //* optional&lt;br /&gt;
       hopsPassObjType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       objType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       fields: {&lt;br /&gt;
          name: { //fieldName&lt;br /&gt;
           anyValue: [ &lt;br /&gt;
              'alice',&lt;br /&gt;
              'john',&lt;br /&gt;
           //...&lt;br /&gt;
          ]&lt;br /&gt;
         },&lt;br /&gt;
         xxId_fieldname: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     //example other fields pattern: //* front end not yet.&lt;br /&gt;
     // fields: {&lt;br /&gt;
     //   fieldName: {&lt;br /&gt;
     //     comparison: &amp;quot;greaterThan&amp;quot;, // greaterThan | lessThan | lessThanOrEqual | greaterThanOrEqual&lt;br /&gt;
     //     value: 100&lt;br /&gt;
     //   }&lt;br /&gt;
     // }&lt;br /&gt;
&lt;br /&gt;
     // fields: {&lt;br /&gt;
     //   fieldName: {&lt;br /&gt;
     //     comparison: &amp;quot;between&amp;quot;,&lt;br /&gt;
     //     valueBetweenStart: 100,&lt;br /&gt;
     //     valueBetweenEnd: 200&lt;br /&gt;
     //   }&lt;br /&gt;
     // }&lt;br /&gt;
     }&lt;br /&gt;
   ]&lt;br /&gt;
  },&lt;br /&gt;
  { //* traversal no hopsPassObjType    &lt;br /&gt;
    filterType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
    traversals: [&lt;br /&gt;
      {&lt;br /&gt;
        links: [&lt;br /&gt;
          {&lt;br /&gt;
            relType: {},&lt;br /&gt;
            direction: &amp;quot;&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            relType: {},&lt;br /&gt;
            direction: &amp;quot;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        //* other settings&lt;br /&gt;
        hopsPassObjType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        fields: {&lt;br /&gt;
          xxId: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
= example hash filterElement of each filterType = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let hash_ref_filterElement_A = hash({&lt;br /&gt;
 objType: {&lt;br /&gt;
   serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
   objectType: &amp;quot;&amp;quot;&lt;br /&gt;
 },&lt;br /&gt;
 filterElement: {&lt;br /&gt;
   filterType: &amp;quot;logical&amp;quot; | &amp;quot;childComplexFilter&amp;quot; | &amp;quot;operation&amp;quot; | &amp;quot;translateIds&amp;quot; | &amp;quot;traversal&amp;quot;,&lt;br /&gt;
   filterElements: { //* use in filterType: &amp;quot;childComplexFilter&amp;quot; | &amp;quot;operation&amp;quot;&lt;br /&gt;
     //* all ref filterElement that this filterElement ref&lt;br /&gt;
   },&lt;br /&gt;
   //* other parameters depend on the filterType.&lt;br /&gt;
   //..&lt;br /&gt;
   //..&lt;br /&gt;
 }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
= Working documents =&lt;br /&gt;
&lt;br /&gt;
[[:Category:Working_documents - Complex Filter|Complex Filter]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Backend services| Complex Filter]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=Service_-_Complex_Filter&amp;diff=4181</id>
		<title>Service - Complex Filter</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=Service_-_Complex_Filter&amp;diff=4181"/>
		<updated>2026-03-18T01:30:09Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
Allows for filters that span nested levels of related entities&lt;br /&gt;
&lt;br /&gt;
= Repository =&lt;br /&gt;
&lt;br /&gt;
https://bitbucket.org/izara-core-search/izara-core-search-complex-filters&lt;br /&gt;
&lt;br /&gt;
= DynamoDB tables =&lt;br /&gt;
&lt;br /&gt;
== [[Standard Config Table Per Service]] ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration tags ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;FilterType&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;xx&amp;quot; // eg: variant / product / sellOffer&lt;br /&gt;
	configValue: {&lt;br /&gt;
		childComplexFilterTypes: {&lt;br /&gt;
			{child filterType}: {&lt;br /&gt;
				&amp;quot;translateIdsServiceName&amp;quot;: &amp;quot;xx&amp;quot; // eg: variantManager / sellOfferManager, service than converts child id to parent id&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
		logicalServiceNames : [&amp;quot;xx&amp;quot;, &amp;quot;yy&amp;quot;] // eg: &amp;quot;ProductStandard&amp;quot;, &amp;quot;ProductCustom&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* logicalServiceNames should not duplicate over mulitiple FilterType's, because we use this setting to match a Logical Service response to a FilterMain record, need it to uniquely identify one filterMain record&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;ComplexFilterServiceName&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;xx&amp;quot; // eg: product / sellOffer&lt;br /&gt;
	configValue: &amp;quot;yy&amp;quot; // eg: ComplexFilterProducts&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;ExpiryInterval&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;ExpiryInterval&amp;quot;&lt;br /&gt;
	configValue: xx // minutes(?) complexfilter ttl&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;MaxProcessInvocationCount&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;MaxProcessInvocationCount&amp;quot;&lt;br /&gt;
	configValue: 10 // maximum number of invocations allowed for large operation complex filter processing&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= complexFilter request =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	filterType: &amp;quot;xx&amp;quot; // eg: &amp;quot;mediaLink&amp;quot;,&lt;br /&gt;
	type: &amp;quot;group&amp;quot;,&lt;br /&gt;
	elements:&lt;br /&gt;
	[&lt;br /&gt;
		{&lt;br /&gt;
			type: &amp;quot;complexFilter&amp;quot;,&lt;br /&gt;
			complexFilter: {&lt;br /&gt;
				filterType: &amp;quot;xx&amp;quot;, //eg: mediaLinkProperty&lt;br /&gt;
				type: &amp;quot;group&amp;quot;,&lt;br /&gt;
				elements: &lt;br /&gt;
				[&lt;br /&gt;
					{&lt;br /&gt;
						type: &amp;quot;logical&amp;quot;,&lt;br /&gt;
						logicalTag: &amp;quot;propertyLabelId&amp;quot;, // is used by the logical service/s to decide how to find data&lt;br /&gt;
&lt;br /&gt;
						// the below properties are up to the logicalTag what is needed, but these are common:&lt;br /&gt;
						comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
						value: &amp;quot;lksdflkfldfgldfkgjldfg&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
				]&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			type: &amp;quot;logicalOperator&amp;quot;,&lt;br /&gt;
			operator: &amp;quot;and&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			type: &amp;quot;complexFilter&amp;quot;,&lt;br /&gt;
			complexFilter: {&lt;br /&gt;
				filterType: &amp;quot;xx&amp;quot;, //eg: mediaLinkPropertyTranslation&lt;br /&gt;
				type: &amp;quot;group&amp;quot;,&lt;br /&gt;
				elements: &lt;br /&gt;
				[&lt;br /&gt;
					{&lt;br /&gt;
						type: &amp;quot;logical&amp;quot;,&lt;br /&gt;
						logicalTag: &amp;quot;textTag_languageId_text&amp;quot;,&lt;br /&gt;
						&lt;br /&gt;
						//example for matching to specific translation text:&lt;br /&gt;
						textTag: &amp;quot;mediaLinkPropertyValue&amp;quot;,&lt;br /&gt;
						languageId: &amp;quot;en&amp;quot;,&lt;br /&gt;
						text: &amp;quot;Blue&amp;quot;,&lt;br /&gt;
						subjectIdentifierPropertyName: &amp;quot;propertyId&amp;quot;,&lt;br /&gt;
						caseSensitive: true&lt;br /&gt;
					},&lt;br /&gt;
				]&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		...&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How to request Complex Filter =&lt;br /&gt;
&lt;br /&gt;
* invoke shared library function createFilterMainId which iterates through elements and builds filterMainId by applying operators. There are no database requests in this function so it can be run from any service and can trust the filterMainId will be standardized&lt;br /&gt;
* No cleaning of the filter object is performed, so additional unused properties would result in a different filterMainId, even if the underlying filter is the same&lt;br /&gt;
* calling function saves filterMainId in pending table waiting for filter complete, this needs to be done before calling ProcessComplexFilter to protect against race condition of complex filter completing before pending record saved (probably use AwaitingStep process)&lt;br /&gt;
* All requests to ProcessComplexFilter will send a message out, even if cache exists&lt;br /&gt;
* CallingFlow param allows Complex Filter service to pass a message back to only the calling flow when a request hits cached results&lt;br /&gt;
&lt;br /&gt;
== How is filterMainId generated ==&lt;br /&gt;
&lt;br /&gt;
* cannot hash entire request elements without iterating through the elements because a final filterMainId of multiple elements is actually the final operation filterMainId (hash of the last element joined with the previous culmination of operation elements)&lt;br /&gt;
* this does not match a hash of the original request object&lt;br /&gt;
* needs to be done this way so we can back track through parent operations in a standardized way when receiving results for each element &lt;br /&gt;
&lt;br /&gt;
= Normal Structure ComplexFilter Request =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
 { //* type: &amp;quot;logical&amp;quot; structure&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    filterMainId: &amp;quot;hash_operation&amp;quot;,&lt;br /&gt;
    filterElements: { //* this is top filterElements that keep all filterElement of request&lt;br /&gt;
      hash_ref_filterElement_A: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        filterElement: {&lt;br /&gt;
          filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
          partitionKeyValues: {&lt;br /&gt;
            xxId: &amp;quot;xx&amp;quot;,&lt;br /&gt;
            yyId: &amp;quot;yy&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          sortKeyValues: {&lt;br /&gt;
            zzId: &amp;quot;zz&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
          comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
          conditionalFieldValues: [&lt;br /&gt;
            {&lt;br /&gt;
              fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
              includeValues: [&amp;quot;th&amp;quot;],&lt;br /&gt;
              // excludeValues: [&amp;quot;en&amp;quot;,&amp;quot;jp&amp;quot;]&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      hash_childComplexFilter: {&lt;br /&gt;
        objType: {},&lt;br /&gt;
        filterElement: {&lt;br /&gt;
           filterType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
              serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
              objectType: &amp;quot;yy&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
            relType: {&lt;br /&gt;
              serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
              relationshipTag: &amp;quot;hasYY&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
           direction: &amp;quot;from&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         childFilterElementId: &amp;quot;hash_ref_filterElement_A&amp;quot;,&lt;br /&gt;
         requestProperties: {&lt;br /&gt;
           tag_xxxxx: &amp;quot;xxxxx&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      hash_ref_filterElement_B: {&lt;br /&gt;
         //* normalize structure&lt;br /&gt;
      },&lt;br /&gt;
      hash_operation: {&lt;br /&gt;
        objType: {},&lt;br /&gt;
        filterElement: {&lt;br /&gt;
          filterType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
          filterElementLeft: &amp;quot;hash_childComplexFilter&amp;quot;,&lt;br /&gt;
          filterElementRight: &amp;quot;hash_ref_filterElement_B&amp;quot;,&lt;br /&gt;
          operator: &amp;quot;AND&amp;quot; | &amp;quot;OR&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= example pattern each filterType structure in filterElement =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
      partitionKeyValues: {&lt;br /&gt;
            xxId: &amp;quot;xx&amp;quot;,&lt;br /&gt;
            yyId: &amp;quot;yy&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      sortKeyValues: {&lt;br /&gt;
            zzId: &amp;quot;zz&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
      conditionalFieldValues: [&lt;br /&gt;
        {&lt;br /&gt;
          fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
          includeValues: [&amp;quot;th&amp;quot;],&lt;br /&gt;
          // excludeValues: [&amp;quot;en&amp;quot;,&amp;quot;jp&amp;quot;]&lt;br /&gt;
        }&lt;br /&gt;
     ]&lt;br /&gt;
  },&lt;br /&gt;
  { &lt;br /&gt;
    filterType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
    filterElements: { //* use when hash own filterMainId, but when keep in top filterElmenets must delete &lt;br /&gt;
       ref_filterElement_A: {&lt;br /&gt;
         //* normalize structure&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    pathLinkType: {&lt;br /&gt;
       objType: {&lt;br /&gt;
         serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
         objectType: &amp;quot;yy&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       relType: {&lt;br /&gt;
         serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
         relationshipTag: &amp;quot;hasYY&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       direction: &amp;quot;from&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    childFilterElementId: &amp;quot;ref_filterElement_A&amp;quot;,&lt;br /&gt;
    requestProperties: {&lt;br /&gt;
       tag_xxxxx: &amp;quot;xxxxx&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    filterType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
    filterElements: { //* use when hash own filterMainId, but when keep in top filterElmenets must delete &lt;br /&gt;
      ref_filterElement_A: {&lt;br /&gt;
        //* normalize structure&lt;br /&gt;
      },&lt;br /&gt;
      ref_filterElement_B: {&lt;br /&gt;
        //* normalize structure&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    filterElementLeft: &amp;quot;ref_filterElement_A&amp;quot;,&lt;br /&gt;
    filterElementRight: &amp;quot;ref_filterElement_B&amp;quot;,&lt;br /&gt;
    operator: &amp;quot;AND&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    filterType: &amp;quot;translateIds &amp;quot;,&lt;br /&gt;
    childIdentifiers: [&lt;br /&gt;
      {&lt;br /&gt;
        xxId: &amp;quot;111&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        xxId: &amp;quot;222&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    pathLinkType: {&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;yy&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;yy&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      relType: {&lt;br /&gt;
        serviceTag: &amp;quot;yy&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;hasYY&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      direction: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    requesetProperties: {&lt;br /&gt;
      tag_quantity: 20&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  { //* traversal has hopsPassObjType&lt;br /&gt;
    filterType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
    traversals: [&lt;br /&gt;
      {&lt;br /&gt;
        links: [&lt;br /&gt;
         {&lt;br /&gt;
           relType: {},&lt;br /&gt;
           direction: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           relType: {},&lt;br /&gt;
           direction: &amp;quot;&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
        ],&lt;br /&gt;
      //* other settings&lt;br /&gt;
 	fields: { //* optional&lt;br /&gt;
          categoryId: 'sellOfferId_value',&lt;br /&gt;
           productId: 'sellOfferId_value'&lt;br /&gt;
        },&lt;br /&gt;
       relationshipProperties: { timestamp: 'sellOfferId_value' }, //* optional&lt;br /&gt;
       hopsStart: 1, //* optional default = 1&lt;br /&gt;
       hopsEnd: 10, //* optional&lt;br /&gt;
       hopsPassObjType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       objType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       fields: {&lt;br /&gt;
          name: { //fieldName&lt;br /&gt;
           anyValue: [ &lt;br /&gt;
              'alice',&lt;br /&gt;
              'john',&lt;br /&gt;
           //...&lt;br /&gt;
          ]&lt;br /&gt;
         },&lt;br /&gt;
         xxId_fieldname: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     //example other fields pattern: //* front end not yet.&lt;br /&gt;
     // fields: {&lt;br /&gt;
     //   fieldName: {&lt;br /&gt;
     //     comparison: &amp;quot;greaterThan&amp;quot;, // greaterThan | lessThan | lessThanOrEqual | greaterThanOrEqual&lt;br /&gt;
     //     value: 100&lt;br /&gt;
     //   }&lt;br /&gt;
     // }&lt;br /&gt;
&lt;br /&gt;
     // fields: {&lt;br /&gt;
     //   fieldName: {&lt;br /&gt;
     //     comparison: &amp;quot;between&amp;quot;,&lt;br /&gt;
     //     valueBetweenStart: 100,&lt;br /&gt;
     //     valueBetweenEnd: 200&lt;br /&gt;
     //   }&lt;br /&gt;
     // }&lt;br /&gt;
     }&lt;br /&gt;
   ]&lt;br /&gt;
  },&lt;br /&gt;
  { //* traversal no hopsPassObjType    &lt;br /&gt;
    filterType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
    traversals: [&lt;br /&gt;
      {&lt;br /&gt;
        links: [&lt;br /&gt;
          {&lt;br /&gt;
            relType: {},&lt;br /&gt;
            direction: &amp;quot;&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            relType: {},&lt;br /&gt;
            direction: &amp;quot;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        //* other settings&lt;br /&gt;
        hopsPassObjType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        fields: {&lt;br /&gt;
          xxId: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
= example hash filterElement of each filterType = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let hash_ref_filterElement_A = hash({&lt;br /&gt;
 objType: {&lt;br /&gt;
   serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
   objectType: &amp;quot;&amp;quot;&lt;br /&gt;
 },&lt;br /&gt;
 filterElement: {&lt;br /&gt;
   filterType: &amp;quot;logical&amp;quot; | &amp;quot;childComplexFilter&amp;quot; | &amp;quot;operation&amp;quot; | &amp;quot;translateIds&amp;quot; | &amp;quot;traversal&amp;quot;,&lt;br /&gt;
   filterElements: { //* use in filterType: &amp;quot;childComplexFilter&amp;quot; | &amp;quot;operation&amp;quot;&lt;br /&gt;
     //* all ref filterElement that this filterElement ref&lt;br /&gt;
   },&lt;br /&gt;
   //* parameters depend on the filterType.&lt;br /&gt;
 }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
= Working documents =&lt;br /&gt;
&lt;br /&gt;
[[:Category:Working_documents - Complex Filter|Complex Filter]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Backend services| Complex Filter]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=Service_-_Complex_Filter&amp;diff=4180</id>
		<title>Service - Complex Filter</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=Service_-_Complex_Filter&amp;diff=4180"/>
		<updated>2026-03-18T01:15:01Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
Allows for filters that span nested levels of related entities&lt;br /&gt;
&lt;br /&gt;
= Repository =&lt;br /&gt;
&lt;br /&gt;
https://bitbucket.org/izara-core-search/izara-core-search-complex-filters&lt;br /&gt;
&lt;br /&gt;
= DynamoDB tables =&lt;br /&gt;
&lt;br /&gt;
== [[Standard Config Table Per Service]] ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration tags ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;FilterType&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;xx&amp;quot; // eg: variant / product / sellOffer&lt;br /&gt;
	configValue: {&lt;br /&gt;
		childComplexFilterTypes: {&lt;br /&gt;
			{child filterType}: {&lt;br /&gt;
				&amp;quot;translateIdsServiceName&amp;quot;: &amp;quot;xx&amp;quot; // eg: variantManager / sellOfferManager, service than converts child id to parent id&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
		logicalServiceNames : [&amp;quot;xx&amp;quot;, &amp;quot;yy&amp;quot;] // eg: &amp;quot;ProductStandard&amp;quot;, &amp;quot;ProductCustom&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* logicalServiceNames should not duplicate over mulitiple FilterType's, because we use this setting to match a Logical Service response to a FilterMain record, need it to uniquely identify one filterMain record&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;ComplexFilterServiceName&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;xx&amp;quot; // eg: product / sellOffer&lt;br /&gt;
	configValue: &amp;quot;yy&amp;quot; // eg: ComplexFilterProducts&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;ExpiryInterval&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;ExpiryInterval&amp;quot;&lt;br /&gt;
	configValue: xx // minutes(?) complexfilter ttl&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;MaxProcessInvocationCount&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;MaxProcessInvocationCount&amp;quot;&lt;br /&gt;
	configValue: 10 // maximum number of invocations allowed for large operation complex filter processing&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= complexFilter request =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	filterType: &amp;quot;xx&amp;quot; // eg: &amp;quot;mediaLink&amp;quot;,&lt;br /&gt;
	type: &amp;quot;group&amp;quot;,&lt;br /&gt;
	elements:&lt;br /&gt;
	[&lt;br /&gt;
		{&lt;br /&gt;
			type: &amp;quot;complexFilter&amp;quot;,&lt;br /&gt;
			complexFilter: {&lt;br /&gt;
				filterType: &amp;quot;xx&amp;quot;, //eg: mediaLinkProperty&lt;br /&gt;
				type: &amp;quot;group&amp;quot;,&lt;br /&gt;
				elements: &lt;br /&gt;
				[&lt;br /&gt;
					{&lt;br /&gt;
						type: &amp;quot;logical&amp;quot;,&lt;br /&gt;
						logicalTag: &amp;quot;propertyLabelId&amp;quot;, // is used by the logical service/s to decide how to find data&lt;br /&gt;
&lt;br /&gt;
						// the below properties are up to the logicalTag what is needed, but these are common:&lt;br /&gt;
						comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
						value: &amp;quot;lksdflkfldfgldfkgjldfg&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
				]&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			type: &amp;quot;logicalOperator&amp;quot;,&lt;br /&gt;
			operator: &amp;quot;and&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			type: &amp;quot;complexFilter&amp;quot;,&lt;br /&gt;
			complexFilter: {&lt;br /&gt;
				filterType: &amp;quot;xx&amp;quot;, //eg: mediaLinkPropertyTranslation&lt;br /&gt;
				type: &amp;quot;group&amp;quot;,&lt;br /&gt;
				elements: &lt;br /&gt;
				[&lt;br /&gt;
					{&lt;br /&gt;
						type: &amp;quot;logical&amp;quot;,&lt;br /&gt;
						logicalTag: &amp;quot;textTag_languageId_text&amp;quot;,&lt;br /&gt;
						&lt;br /&gt;
						//example for matching to specific translation text:&lt;br /&gt;
						textTag: &amp;quot;mediaLinkPropertyValue&amp;quot;,&lt;br /&gt;
						languageId: &amp;quot;en&amp;quot;,&lt;br /&gt;
						text: &amp;quot;Blue&amp;quot;,&lt;br /&gt;
						subjectIdentifierPropertyName: &amp;quot;propertyId&amp;quot;,&lt;br /&gt;
						caseSensitive: true&lt;br /&gt;
					},&lt;br /&gt;
				]&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		...&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How to request Complex Filter =&lt;br /&gt;
&lt;br /&gt;
* invoke shared library function createFilterMainId which iterates through elements and builds filterMainId by applying operators. There are no database requests in this function so it can be run from any service and can trust the filterMainId will be standardized&lt;br /&gt;
* No cleaning of the filter object is performed, so additional unused properties would result in a different filterMainId, even if the underlying filter is the same&lt;br /&gt;
* calling function saves filterMainId in pending table waiting for filter complete, this needs to be done before calling ProcessComplexFilter to protect against race condition of complex filter completing before pending record saved (probably use AwaitingStep process)&lt;br /&gt;
* All requests to ProcessComplexFilter will send a message out, even if cache exists&lt;br /&gt;
* CallingFlow param allows Complex Filter service to pass a message back to only the calling flow when a request hits cached results&lt;br /&gt;
&lt;br /&gt;
== How is filterMainId generated ==&lt;br /&gt;
&lt;br /&gt;
* cannot hash entire request elements without iterating through the elements because a final filterMainId of multiple elements is actually the final operation filterMainId (hash of the last element joined with the previous culmination of operation elements)&lt;br /&gt;
* this does not match a hash of the original request object&lt;br /&gt;
* needs to be done this way so we can back track through parent operations in a standardized way when receiving results for each element &lt;br /&gt;
&lt;br /&gt;
= Normal Structure ComplexFilter Request =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
 { //* type: &amp;quot;logical&amp;quot; structure&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    filterMainId: &amp;quot;hash_operation&amp;quot;,&lt;br /&gt;
    filterElements: { //* this is top filterElements that keep all filterElement of request&lt;br /&gt;
      hash_ref_filterElement_A: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        filterElement: {&lt;br /&gt;
          filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
          partitionKeyValues: {&lt;br /&gt;
            xxId: &amp;quot;xx&amp;quot;,&lt;br /&gt;
            yyId: &amp;quot;yy&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          sortKeyValues: {&lt;br /&gt;
            zzId: &amp;quot;zz&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
          comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
          conditionalFieldValues: [&lt;br /&gt;
            {&lt;br /&gt;
              fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
              includeValues: [&amp;quot;th&amp;quot;],&lt;br /&gt;
              // excludeValues: [&amp;quot;en&amp;quot;,&amp;quot;jp&amp;quot;]&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      hash_childComplexFilter: {&lt;br /&gt;
        objType: {},&lt;br /&gt;
        filterElement: {&lt;br /&gt;
           filterType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
              serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
              objectType: &amp;quot;yy&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
            relType: {&lt;br /&gt;
              serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
              relationshipTag: &amp;quot;hasYY&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
           direction: &amp;quot;from&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         childFilterElementId: &amp;quot;hash_ref_filterElement_A&amp;quot;,&lt;br /&gt;
         requestProperties: {&lt;br /&gt;
           tag_xxxxx: &amp;quot;xxxxx&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      hash_ref_filterElement_B: {&lt;br /&gt;
         //* normalize structure&lt;br /&gt;
      },&lt;br /&gt;
      hash_operation: {&lt;br /&gt;
        objType: {},&lt;br /&gt;
        filterElement: {&lt;br /&gt;
          filterType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
          filterElementLeft: &amp;quot;hash_childComplexFilter&amp;quot;,&lt;br /&gt;
          filterElementRight: &amp;quot;hash_ref_filterElement_B&amp;quot;,&lt;br /&gt;
          operator: &amp;quot;AND&amp;quot; | &amp;quot;OR&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= example pattern each filterType structure in filterElement =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
      partitionKeyValues: {&lt;br /&gt;
            xxId: &amp;quot;xx&amp;quot;,&lt;br /&gt;
            yyId: &amp;quot;yy&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      sortKeyValues: {&lt;br /&gt;
            zzId: &amp;quot;zz&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
      conditionalFieldValues: [&lt;br /&gt;
        {&lt;br /&gt;
          fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
          includeValues: [&amp;quot;th&amp;quot;],&lt;br /&gt;
          // excludeValues: [&amp;quot;en&amp;quot;,&amp;quot;jp&amp;quot;]&lt;br /&gt;
        }&lt;br /&gt;
     ]&lt;br /&gt;
  },&lt;br /&gt;
  { &lt;br /&gt;
    filterType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
    filterElements: { //* use when hash own filterMainId, but when keep in top filterElmenets must delete &lt;br /&gt;
       ref_filterElement_A: {&lt;br /&gt;
         //* normalize structure&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    pathLinkType: {&lt;br /&gt;
       objType: {&lt;br /&gt;
         serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
         objectType: &amp;quot;yy&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       relType: {&lt;br /&gt;
         serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
         relationshipTag: &amp;quot;hasYY&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       direction: &amp;quot;from&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    childFilterElementId: &amp;quot;ref_filterElement_A&amp;quot;,&lt;br /&gt;
    requestProperties: {&lt;br /&gt;
       tag_xxxxx: &amp;quot;xxxxx&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    filterType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
    filterElements: { //* use when hash own filterMainId, but when keep in top filterElmenets must delete &lt;br /&gt;
      ref_filterElement_A: {&lt;br /&gt;
        //* normalize structure&lt;br /&gt;
      },&lt;br /&gt;
      ref_filterElement_B: {&lt;br /&gt;
        //* normalize structure&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    filterElementLeft: &amp;quot;ref_filterElement_A&amp;quot;,&lt;br /&gt;
    filterElementRight: &amp;quot;ref_filterElement_B&amp;quot;,&lt;br /&gt;
    operator: &amp;quot;AND&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    filterType: &amp;quot;translateIds &amp;quot;,&lt;br /&gt;
    childIdentifiers: [&lt;br /&gt;
      {&lt;br /&gt;
        xxId: &amp;quot;111&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        xxId: &amp;quot;222&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    pathLinkType: {&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;yy&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;yy&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      relType: {&lt;br /&gt;
        serviceTag: &amp;quot;yy&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;hasYY&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      direction: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    requesetProperties: {&lt;br /&gt;
      tag_quantity: 20&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  { //* traversal has hopsPassObjType&lt;br /&gt;
    filterType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
    traversals: [&lt;br /&gt;
      {&lt;br /&gt;
        links: [&lt;br /&gt;
         {&lt;br /&gt;
           relType: {},&lt;br /&gt;
           direction: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           relType: {},&lt;br /&gt;
           direction: &amp;quot;&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
        ],&lt;br /&gt;
      //* other settings&lt;br /&gt;
 	fields: { //* optional&lt;br /&gt;
          categoryId: 'sellOfferId_value',&lt;br /&gt;
           productId: 'sellOfferId_value'&lt;br /&gt;
        },&lt;br /&gt;
       relationshipProperties: { timestamp: 'sellOfferId_value' }, //* optional&lt;br /&gt;
       hopsStart: 1, //* optional default = 1&lt;br /&gt;
       hopsEnd: 10, //* optional&lt;br /&gt;
       hopsPassObjType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       objType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       fields: {&lt;br /&gt;
          name: { //fieldName&lt;br /&gt;
           anyValue: [ &lt;br /&gt;
              'alice',&lt;br /&gt;
              'john',&lt;br /&gt;
           //...&lt;br /&gt;
          ]&lt;br /&gt;
         },&lt;br /&gt;
         xxId_fieldname: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     //example other fields pattern: //* front end not yet.&lt;br /&gt;
     // fields: {&lt;br /&gt;
     //   fieldName: {&lt;br /&gt;
     //     comparison: &amp;quot;greaterThan&amp;quot;, // greaterThan | lessThan | lessThanOrEqual | greaterThanOrEqual&lt;br /&gt;
     //     value: 100&lt;br /&gt;
     //   }&lt;br /&gt;
     // }&lt;br /&gt;
&lt;br /&gt;
     // fields: {&lt;br /&gt;
     //   fieldName: {&lt;br /&gt;
     //     comparison: &amp;quot;between&amp;quot;,&lt;br /&gt;
     //     valueBetweenStart: 100,&lt;br /&gt;
     //     valueBetweenEnd: 200&lt;br /&gt;
     //   }&lt;br /&gt;
     // }&lt;br /&gt;
     }&lt;br /&gt;
   ]&lt;br /&gt;
  },&lt;br /&gt;
  { //* traversal no hopsPassObjType    &lt;br /&gt;
    filterType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
    traversals: [&lt;br /&gt;
      {&lt;br /&gt;
        links: [&lt;br /&gt;
          {&lt;br /&gt;
            relType: {},&lt;br /&gt;
            direction: &amp;quot;&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            relType: {},&lt;br /&gt;
            direction: &amp;quot;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        //* other settings&lt;br /&gt;
        hopsPassObjType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        fields: {&lt;br /&gt;
          xxId: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
= Working documents =&lt;br /&gt;
&lt;br /&gt;
[[:Category:Working_documents - Complex Filter|Complex Filter]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Backend services| Complex Filter]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=Service_-_Complex_Filter&amp;diff=4179</id>
		<title>Service - Complex Filter</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=Service_-_Complex_Filter&amp;diff=4179"/>
		<updated>2026-03-18T01:13:23Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
Allows for filters that span nested levels of related entities&lt;br /&gt;
&lt;br /&gt;
= Repository =&lt;br /&gt;
&lt;br /&gt;
https://bitbucket.org/izara-core-search/izara-core-search-complex-filters&lt;br /&gt;
&lt;br /&gt;
= DynamoDB tables =&lt;br /&gt;
&lt;br /&gt;
== [[Standard Config Table Per Service]] ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration tags ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;FilterType&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;xx&amp;quot; // eg: variant / product / sellOffer&lt;br /&gt;
	configValue: {&lt;br /&gt;
		childComplexFilterTypes: {&lt;br /&gt;
			{child filterType}: {&lt;br /&gt;
				&amp;quot;translateIdsServiceName&amp;quot;: &amp;quot;xx&amp;quot; // eg: variantManager / sellOfferManager, service than converts child id to parent id&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
		logicalServiceNames : [&amp;quot;xx&amp;quot;, &amp;quot;yy&amp;quot;] // eg: &amp;quot;ProductStandard&amp;quot;, &amp;quot;ProductCustom&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* logicalServiceNames should not duplicate over mulitiple FilterType's, because we use this setting to match a Logical Service response to a FilterMain record, need it to uniquely identify one filterMain record&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;ComplexFilterServiceName&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;xx&amp;quot; // eg: product / sellOffer&lt;br /&gt;
	configValue: &amp;quot;yy&amp;quot; // eg: ComplexFilterProducts&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;ExpiryInterval&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;ExpiryInterval&amp;quot;&lt;br /&gt;
	configValue: xx // minutes(?) complexfilter ttl&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;MaxProcessInvocationCount&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;MaxProcessInvocationCount&amp;quot;&lt;br /&gt;
	configValue: 10 // maximum number of invocations allowed for large operation complex filter processing&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= complexFilter request =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	filterType: &amp;quot;xx&amp;quot; // eg: &amp;quot;mediaLink&amp;quot;,&lt;br /&gt;
	type: &amp;quot;group&amp;quot;,&lt;br /&gt;
	elements:&lt;br /&gt;
	[&lt;br /&gt;
		{&lt;br /&gt;
			type: &amp;quot;complexFilter&amp;quot;,&lt;br /&gt;
			complexFilter: {&lt;br /&gt;
				filterType: &amp;quot;xx&amp;quot;, //eg: mediaLinkProperty&lt;br /&gt;
				type: &amp;quot;group&amp;quot;,&lt;br /&gt;
				elements: &lt;br /&gt;
				[&lt;br /&gt;
					{&lt;br /&gt;
						type: &amp;quot;logical&amp;quot;,&lt;br /&gt;
						logicalTag: &amp;quot;propertyLabelId&amp;quot;, // is used by the logical service/s to decide how to find data&lt;br /&gt;
&lt;br /&gt;
						// the below properties are up to the logicalTag what is needed, but these are common:&lt;br /&gt;
						comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
						value: &amp;quot;lksdflkfldfgldfkgjldfg&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
				]&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			type: &amp;quot;logicalOperator&amp;quot;,&lt;br /&gt;
			operator: &amp;quot;and&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			type: &amp;quot;complexFilter&amp;quot;,&lt;br /&gt;
			complexFilter: {&lt;br /&gt;
				filterType: &amp;quot;xx&amp;quot;, //eg: mediaLinkPropertyTranslation&lt;br /&gt;
				type: &amp;quot;group&amp;quot;,&lt;br /&gt;
				elements: &lt;br /&gt;
				[&lt;br /&gt;
					{&lt;br /&gt;
						type: &amp;quot;logical&amp;quot;,&lt;br /&gt;
						logicalTag: &amp;quot;textTag_languageId_text&amp;quot;,&lt;br /&gt;
						&lt;br /&gt;
						//example for matching to specific translation text:&lt;br /&gt;
						textTag: &amp;quot;mediaLinkPropertyValue&amp;quot;,&lt;br /&gt;
						languageId: &amp;quot;en&amp;quot;,&lt;br /&gt;
						text: &amp;quot;Blue&amp;quot;,&lt;br /&gt;
						subjectIdentifierPropertyName: &amp;quot;propertyId&amp;quot;,&lt;br /&gt;
						caseSensitive: true&lt;br /&gt;
					},&lt;br /&gt;
				]&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		...&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How to request Complex Filter =&lt;br /&gt;
&lt;br /&gt;
* invoke shared library function createFilterMainId which iterates through elements and builds filterMainId by applying operators. There are no database requests in this function so it can be run from any service and can trust the filterMainId will be standardized&lt;br /&gt;
* No cleaning of the filter object is performed, so additional unused properties would result in a different filterMainId, even if the underlying filter is the same&lt;br /&gt;
* calling function saves filterMainId in pending table waiting for filter complete, this needs to be done before calling ProcessComplexFilter to protect against race condition of complex filter completing before pending record saved (probably use AwaitingStep process)&lt;br /&gt;
* All requests to ProcessComplexFilter will send a message out, even if cache exists&lt;br /&gt;
* CallingFlow param allows Complex Filter service to pass a message back to only the calling flow when a request hits cached results&lt;br /&gt;
&lt;br /&gt;
== How is filterMainId generated ==&lt;br /&gt;
&lt;br /&gt;
* cannot hash entire request elements without iterating through the elements because a final filterMainId of multiple elements is actually the final operation filterMainId (hash of the last element joined with the previous culmination of operation elements)&lt;br /&gt;
* this does not match a hash of the original request object&lt;br /&gt;
* needs to be done this way so we can back track through parent operations in a standardized way when receiving results for each element &lt;br /&gt;
&lt;br /&gt;
= Normal Structure ComplexFilter Request =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
 { //* type: &amp;quot;logical&amp;quot; structure&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    filterMainId: &amp;quot;hash_logical_1&amp;quot;,&lt;br /&gt;
    filterElements: { //* this is top filterElements that keep all filterElement of request&lt;br /&gt;
      hash_ref_filterElement_A: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        filterElement: {&lt;br /&gt;
          filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
          partitionKeyValues: {&lt;br /&gt;
            xxId: &amp;quot;xx&amp;quot;,&lt;br /&gt;
            yyId: &amp;quot;yy&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          sortKeyValues: {&lt;br /&gt;
            zzId: &amp;quot;zz&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
          comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
          conditionalFieldValues: [&lt;br /&gt;
            {&lt;br /&gt;
              fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
              includeValues: [&amp;quot;th&amp;quot;],&lt;br /&gt;
              // excludeValues: [&amp;quot;en&amp;quot;,&amp;quot;jp&amp;quot;]&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      hash_childComplexFilter: {&lt;br /&gt;
        objType: {},&lt;br /&gt;
        filterElement: {&lt;br /&gt;
           filterType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
              serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
              objectType: &amp;quot;yy&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
            relType: {&lt;br /&gt;
              serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
              relationshipTag: &amp;quot;hasYY&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
           direction: &amp;quot;from&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         childFilterElementId: &amp;quot;hash_ref_filterElement_A&amp;quot;,&lt;br /&gt;
         requestProperties: {&lt;br /&gt;
           tag_xxxxx: &amp;quot;xxxxx&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      hash_ref_filterElement_B: {&lt;br /&gt;
         //* normalize structure&lt;br /&gt;
      },&lt;br /&gt;
      hash_operation: {&lt;br /&gt;
        objType: {},&lt;br /&gt;
        filterElement: {&lt;br /&gt;
          filterType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
          filterElementLeft: &amp;quot;hash_childComplexFilter&amp;quot;,&lt;br /&gt;
          filterElementRight: &amp;quot;hash_ref_filterElement_B&amp;quot;,&lt;br /&gt;
          operator: &amp;quot;AND&amp;quot; | &amp;quot;OR&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= example pattern each filterType structure in filterElement =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
      partitionKeyValues: {&lt;br /&gt;
            xxId: &amp;quot;xx&amp;quot;,&lt;br /&gt;
            yyId: &amp;quot;yy&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      sortKeyValues: {&lt;br /&gt;
            zzId: &amp;quot;zz&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
      conditionalFieldValues: [&lt;br /&gt;
        {&lt;br /&gt;
          fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
          includeValues: [&amp;quot;th&amp;quot;],&lt;br /&gt;
          // excludeValues: [&amp;quot;en&amp;quot;,&amp;quot;jp&amp;quot;]&lt;br /&gt;
        }&lt;br /&gt;
     ]&lt;br /&gt;
  },&lt;br /&gt;
  { &lt;br /&gt;
    filterType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
    filterElements: { //* use when hash own filterMainId, but when keep in top filterElmenets must delete &lt;br /&gt;
       ref_filterElement_A: {&lt;br /&gt;
         //* normalize structure&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    pathLinkType: {&lt;br /&gt;
       objType: {&lt;br /&gt;
         serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
         objectType: &amp;quot;yy&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       relType: {&lt;br /&gt;
         serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
         relationshipTag: &amp;quot;hasYY&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       direction: &amp;quot;from&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    childFilterElementId: &amp;quot;ref_filterElement_A&amp;quot;,&lt;br /&gt;
    requestProperties: {&lt;br /&gt;
       tag_xxxxx: &amp;quot;xxxxx&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    filterType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
    filterElements: { //* use when hash own filterMainId, but when keep in top filterElmenets must delete &lt;br /&gt;
      ref_filterElement_A: {&lt;br /&gt;
        //* normalize structure&lt;br /&gt;
      },&lt;br /&gt;
      ref_filterElement_B: {&lt;br /&gt;
        //* normalize structure&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    filterElementLeft: &amp;quot;ref_filterElement_A&amp;quot;,&lt;br /&gt;
    filterElementRight: &amp;quot;ref_filterElement_B&amp;quot;,&lt;br /&gt;
    operator: &amp;quot;AND&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    filterType: &amp;quot;translateIds &amp;quot;,&lt;br /&gt;
    childIdentifiers: [&lt;br /&gt;
      {&lt;br /&gt;
        xxId: &amp;quot;111&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        xxId: &amp;quot;222&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    pathLinkType: {&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;yy&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;yy&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      relType: {&lt;br /&gt;
        serviceTag: &amp;quot;yy&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;hasYY&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      direction: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    requesetProperties: {&lt;br /&gt;
      tag_quantity: 20&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  { //* traversal has hopsPassObjType&lt;br /&gt;
    filterType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
    traversals: [&lt;br /&gt;
      {&lt;br /&gt;
        links: [&lt;br /&gt;
         {&lt;br /&gt;
           relType: {},&lt;br /&gt;
           direction: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           relType: {},&lt;br /&gt;
           direction: &amp;quot;&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
        ],&lt;br /&gt;
      //* other settings&lt;br /&gt;
 	fields: { //* optional&lt;br /&gt;
          categoryId: 'sellOfferId_value',&lt;br /&gt;
           productId: 'sellOfferId_value'&lt;br /&gt;
        },&lt;br /&gt;
       relationshipProperties: { timestamp: 'sellOfferId_value' }, //* optional&lt;br /&gt;
       hopsStart: 1, //* optional default = 1&lt;br /&gt;
       hopsEnd: 10, //* optional&lt;br /&gt;
       hopsPassObjType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       objType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       fields: {&lt;br /&gt;
          name: { //fieldName&lt;br /&gt;
           anyValue: [ &lt;br /&gt;
              'alice',&lt;br /&gt;
              'john',&lt;br /&gt;
           //...&lt;br /&gt;
          ]&lt;br /&gt;
         },&lt;br /&gt;
         xxId_fieldname: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     //example other fields pattern: //* front end not yet.&lt;br /&gt;
     // fields: {&lt;br /&gt;
     //   fieldName: {&lt;br /&gt;
     //     comparison: &amp;quot;greaterThan&amp;quot;, // greaterThan | lessThan | lessThanOrEqual | greaterThanOrEqual&lt;br /&gt;
     //     value: 100&lt;br /&gt;
     //   }&lt;br /&gt;
     // }&lt;br /&gt;
&lt;br /&gt;
     // fields: {&lt;br /&gt;
     //   fieldName: {&lt;br /&gt;
     //     comparison: &amp;quot;between&amp;quot;,&lt;br /&gt;
     //     valueBetweenStart: 100,&lt;br /&gt;
     //     valueBetweenEnd: 200&lt;br /&gt;
     //   }&lt;br /&gt;
     // }&lt;br /&gt;
     }&lt;br /&gt;
   ]&lt;br /&gt;
  },&lt;br /&gt;
  { //* traversal no hopsPassObjType    &lt;br /&gt;
    filterType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
    traversals: [&lt;br /&gt;
      {&lt;br /&gt;
        links: [&lt;br /&gt;
          {&lt;br /&gt;
            relType: {},&lt;br /&gt;
            direction: &amp;quot;&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            relType: {},&lt;br /&gt;
            direction: &amp;quot;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        //* other settings&lt;br /&gt;
        hopsPassObjType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        fields: {&lt;br /&gt;
          xxId: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
= Working documents =&lt;br /&gt;
&lt;br /&gt;
[[:Category:Working_documents - Complex Filter|Complex Filter]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Backend services| Complex Filter]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=Service_-_Complex_Filter&amp;diff=4178</id>
		<title>Service - Complex Filter</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=Service_-_Complex_Filter&amp;diff=4178"/>
		<updated>2026-03-18T01:02:56Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
Allows for filters that span nested levels of related entities&lt;br /&gt;
&lt;br /&gt;
= Repository =&lt;br /&gt;
&lt;br /&gt;
https://bitbucket.org/izara-core-search/izara-core-search-complex-filters&lt;br /&gt;
&lt;br /&gt;
= DynamoDB tables =&lt;br /&gt;
&lt;br /&gt;
== [[Standard Config Table Per Service]] ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration tags ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;FilterType&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;xx&amp;quot; // eg: variant / product / sellOffer&lt;br /&gt;
	configValue: {&lt;br /&gt;
		childComplexFilterTypes: {&lt;br /&gt;
			{child filterType}: {&lt;br /&gt;
				&amp;quot;translateIdsServiceName&amp;quot;: &amp;quot;xx&amp;quot; // eg: variantManager / sellOfferManager, service than converts child id to parent id&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
		logicalServiceNames : [&amp;quot;xx&amp;quot;, &amp;quot;yy&amp;quot;] // eg: &amp;quot;ProductStandard&amp;quot;, &amp;quot;ProductCustom&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* logicalServiceNames should not duplicate over mulitiple FilterType's, because we use this setting to match a Logical Service response to a FilterMain record, need it to uniquely identify one filterMain record&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;ComplexFilterServiceName&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;xx&amp;quot; // eg: product / sellOffer&lt;br /&gt;
	configValue: &amp;quot;yy&amp;quot; // eg: ComplexFilterProducts&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;ExpiryInterval&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;ExpiryInterval&amp;quot;&lt;br /&gt;
	configValue: xx // minutes(?) complexfilter ttl&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	configKey: &amp;quot;MaxProcessInvocationCount&amp;quot;&lt;br /&gt;
	configTag: &amp;quot;MaxProcessInvocationCount&amp;quot;&lt;br /&gt;
	configValue: 10 // maximum number of invocations allowed for large operation complex filter processing&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= complexFilter request =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	filterType: &amp;quot;xx&amp;quot; // eg: &amp;quot;mediaLink&amp;quot;,&lt;br /&gt;
	type: &amp;quot;group&amp;quot;,&lt;br /&gt;
	elements:&lt;br /&gt;
	[&lt;br /&gt;
		{&lt;br /&gt;
			type: &amp;quot;complexFilter&amp;quot;,&lt;br /&gt;
			complexFilter: {&lt;br /&gt;
				filterType: &amp;quot;xx&amp;quot;, //eg: mediaLinkProperty&lt;br /&gt;
				type: &amp;quot;group&amp;quot;,&lt;br /&gt;
				elements: &lt;br /&gt;
				[&lt;br /&gt;
					{&lt;br /&gt;
						type: &amp;quot;logical&amp;quot;,&lt;br /&gt;
						logicalTag: &amp;quot;propertyLabelId&amp;quot;, // is used by the logical service/s to decide how to find data&lt;br /&gt;
&lt;br /&gt;
						// the below properties are up to the logicalTag what is needed, but these are common:&lt;br /&gt;
						comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
						value: &amp;quot;lksdflkfldfgldfkgjldfg&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
				]&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			type: &amp;quot;logicalOperator&amp;quot;,&lt;br /&gt;
			operator: &amp;quot;and&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			type: &amp;quot;complexFilter&amp;quot;,&lt;br /&gt;
			complexFilter: {&lt;br /&gt;
				filterType: &amp;quot;xx&amp;quot;, //eg: mediaLinkPropertyTranslation&lt;br /&gt;
				type: &amp;quot;group&amp;quot;,&lt;br /&gt;
				elements: &lt;br /&gt;
				[&lt;br /&gt;
					{&lt;br /&gt;
						type: &amp;quot;logical&amp;quot;,&lt;br /&gt;
						logicalTag: &amp;quot;textTag_languageId_text&amp;quot;,&lt;br /&gt;
						&lt;br /&gt;
						//example for matching to specific translation text:&lt;br /&gt;
						textTag: &amp;quot;mediaLinkPropertyValue&amp;quot;,&lt;br /&gt;
						languageId: &amp;quot;en&amp;quot;,&lt;br /&gt;
						text: &amp;quot;Blue&amp;quot;,&lt;br /&gt;
						subjectIdentifierPropertyName: &amp;quot;propertyId&amp;quot;,&lt;br /&gt;
						caseSensitive: true&lt;br /&gt;
					},&lt;br /&gt;
				]&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		...&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How to request Complex Filter =&lt;br /&gt;
&lt;br /&gt;
* invoke shared library function createFilterMainId which iterates through elements and builds filterMainId by applying operators. There are no database requests in this function so it can be run from any service and can trust the filterMainId will be standardized&lt;br /&gt;
* No cleaning of the filter object is performed, so additional unused properties would result in a different filterMainId, even if the underlying filter is the same&lt;br /&gt;
* calling function saves filterMainId in pending table waiting for filter complete, this needs to be done before calling ProcessComplexFilter to protect against race condition of complex filter completing before pending record saved (probably use AwaitingStep process)&lt;br /&gt;
* All requests to ProcessComplexFilter will send a message out, even if cache exists&lt;br /&gt;
* CallingFlow param allows Complex Filter service to pass a message back to only the calling flow when a request hits cached results&lt;br /&gt;
&lt;br /&gt;
== How is filterMainId generated ==&lt;br /&gt;
&lt;br /&gt;
* cannot hash entire request elements without iterating through the elements because a final filterMainId of multiple elements is actually the final operation filterMainId (hash of the last element joined with the previous culmination of operation elements)&lt;br /&gt;
* this does not match a hash of the original request object&lt;br /&gt;
* needs to be done this way so we can back track through parent operations in a standardized way when receiving results for each element &lt;br /&gt;
&lt;br /&gt;
= Normal Structure ComplexFilter Request =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
 { //* type: &amp;quot;logical&amp;quot; structure&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
      objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    filterMainId: &amp;quot;hash_logical_1&amp;quot;,&lt;br /&gt;
    filterElements: { //* this is top filterElements that keep all filterElement of request&lt;br /&gt;
      hash_logical_1: {&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;XX&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;xx&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        filterElement: {&lt;br /&gt;
          filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
          partitionKeyValues: {&lt;br /&gt;
            xxId: &amp;quot;xx&amp;quot;,&lt;br /&gt;
            yyId: &amp;quot;yy&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          sortKeyValues: {&lt;br /&gt;
            zzId: &amp;quot;zz&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
          comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
          conditionalFieldValues: [&lt;br /&gt;
            {&lt;br /&gt;
              fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
              includeValues: [&amp;quot;th&amp;quot;],&lt;br /&gt;
              // excludeValues: [&amp;quot;en&amp;quot;,&amp;quot;jp&amp;quot;]&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= example pattern each filterType structure in filterElement =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    filterType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
      partitionKeyValues: {&lt;br /&gt;
            xxId: &amp;quot;xx&amp;quot;,&lt;br /&gt;
            yyId: &amp;quot;yy&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      sortKeyValues: {&lt;br /&gt;
            zzId: &amp;quot;zz&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
      comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
      conditionalFieldValues: [&lt;br /&gt;
        {&lt;br /&gt;
          fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
          includeValues: [&amp;quot;th&amp;quot;],&lt;br /&gt;
          // excludeValues: [&amp;quot;en&amp;quot;,&amp;quot;jp&amp;quot;]&lt;br /&gt;
        }&lt;br /&gt;
     ]&lt;br /&gt;
  },&lt;br /&gt;
  { &lt;br /&gt;
    filterType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
    filterElements: { //* use when hash own filterMainId, but when keep in top filterElmenets must delete &lt;br /&gt;
       ref_filterElement_A: {&lt;br /&gt;
         //* normalize structure&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    pathLinkType: {&lt;br /&gt;
       objType: {&lt;br /&gt;
         serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
         objectType: &amp;quot;yy&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       relType: {&lt;br /&gt;
         serviceTag: &amp;quot;YY&amp;quot;,&lt;br /&gt;
         relationshipTag: &amp;quot;hasYY&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       direction: &amp;quot;from&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    childFilterElementId: &amp;quot;ref_filterElement_A&amp;quot;,&lt;br /&gt;
    requestProperties: {&lt;br /&gt;
       tag_xxxxx: &amp;quot;xxxxx&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    filterType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
    filterElements: { //* use when hash own filterMainId, but when keep in top filterElmenets must delete &lt;br /&gt;
      ref_filterElement_A: {&lt;br /&gt;
        //* normalize structure&lt;br /&gt;
      },&lt;br /&gt;
      ref_filterElement_B: {&lt;br /&gt;
        //* normalize structure&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    filterElementLeft: &amp;quot;ref_filterElement_A&amp;quot;,&lt;br /&gt;
    filterElementRight: &amp;quot;ref_filterElement_B&amp;quot;,&lt;br /&gt;
    operator: &amp;quot;AND&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    filterType: &amp;quot;translateIds &amp;quot;,&lt;br /&gt;
    childIdentifiers: [&lt;br /&gt;
      {&lt;br /&gt;
        xxId: &amp;quot;111&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        xxId: &amp;quot;222&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    pathLinkType: {&lt;br /&gt;
      objType: {&lt;br /&gt;
        serviceTag: &amp;quot;yy&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;yy&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      relType: {&lt;br /&gt;
        serviceTag: &amp;quot;yy&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;hasYY&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      direction: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    requesetProperties: {&lt;br /&gt;
      tag_quantity: 20&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  { //* traversal has hopsPassObjType&lt;br /&gt;
    filterType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
    traversals: [&lt;br /&gt;
      {&lt;br /&gt;
        links: [&lt;br /&gt;
         {&lt;br /&gt;
           relType: {},&lt;br /&gt;
           direction: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         {&lt;br /&gt;
           relType: {},&lt;br /&gt;
           direction: &amp;quot;&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
        ],&lt;br /&gt;
      //* other settings&lt;br /&gt;
 	fields: { //* optional&lt;br /&gt;
          categoryId: 'sellOfferId_value',&lt;br /&gt;
           productId: 'sellOfferId_value'&lt;br /&gt;
        },&lt;br /&gt;
       relationshipProperties: { timestamp: 'sellOfferId_value' }, //* optional&lt;br /&gt;
       hopsStart: 1, //* optional default = 1&lt;br /&gt;
       hopsEnd: 10, //* optional&lt;br /&gt;
       hopsPassObjType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       objType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     },&lt;br /&gt;
     {&lt;br /&gt;
       fields: {&lt;br /&gt;
          name: { //fieldName&lt;br /&gt;
           anyValue: [ &lt;br /&gt;
              'alice',&lt;br /&gt;
              'john',&lt;br /&gt;
           //...&lt;br /&gt;
          ]&lt;br /&gt;
         },&lt;br /&gt;
         xxId_fieldname: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     //example other fields pattern: //* front end not yet.&lt;br /&gt;
     // fields: {&lt;br /&gt;
     //   fieldName: {&lt;br /&gt;
     //     comparison: &amp;quot;greaterThan&amp;quot;, // greaterThan | lessThan | lessThanOrEqual | greaterThanOrEqual&lt;br /&gt;
     //     value: 100&lt;br /&gt;
     //   }&lt;br /&gt;
     // }&lt;br /&gt;
&lt;br /&gt;
     // fields: {&lt;br /&gt;
     //   fieldName: {&lt;br /&gt;
     //     comparison: &amp;quot;between&amp;quot;,&lt;br /&gt;
     //     valueBetweenStart: 100,&lt;br /&gt;
     //     valueBetweenEnd: 200&lt;br /&gt;
     //   }&lt;br /&gt;
     // }&lt;br /&gt;
     }&lt;br /&gt;
   ]&lt;br /&gt;
  },&lt;br /&gt;
  { //* traversal no hopsPassObjType    &lt;br /&gt;
    filterType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
    traversals: [&lt;br /&gt;
      {&lt;br /&gt;
        links: [&lt;br /&gt;
          {&lt;br /&gt;
            relType: {},&lt;br /&gt;
            direction: &amp;quot;&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            relType: {},&lt;br /&gt;
            direction: &amp;quot;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        //* other settings&lt;br /&gt;
        hopsPassObjType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        objType: {&lt;br /&gt;
          serviceTag: &amp;quot;&amp;quot;,&lt;br /&gt;
          objectType: &amp;quot;&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        fields: {&lt;br /&gt;
          xxId: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
= Working documents =&lt;br /&gt;
&lt;br /&gt;
[[:Category:Working_documents - Complex Filter|Complex Filter]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Backend services| Complex Filter]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4177</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4177"/>
		<updated>2026-03-18T00:07:43Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as params sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
	// header/footer filterDataField elements reference valueUserTag&lt;br /&gt;
&lt;br /&gt;
	&amp;quot;elements&amp;quot;: {&lt;br /&gt;
		// shared types&lt;br /&gt;
		&amp;quot;elementId12&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;freetext&amp;quot;,&lt;br /&gt;
			&amp;quot;value&amp;quot;: &amp;quot;aa&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// headerFooter types&lt;br /&gt;
		&amp;quot;elementId1&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;valueUserTag&amp;quot;: &amp;quot;userTag_9&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot; // || &amp;quot;select&amp;quot; || &amp;quot;checkbox&amp;quot; || &amp;quot;radio&amp;quot; ,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId2&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;select&amp;quot;,&lt;br /&gt;
			&amp;quot;options&amp;quot;: [&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option1&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
              },&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option2&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
			],&lt;br /&gt;
		},&lt;br /&gt;
        &amp;quot;elementId21&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;checkbox&amp;quot;,&lt;br /&gt;
			&amp;quot;onSetting:{&lt;br /&gt;
               optionText:&amp;quot;on&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
             &amp;quot;offSetting&amp;quot;:{&lt;br /&gt;
               optionText:&amp;quot;off&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
		   &lt;br /&gt;
           &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId3&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;sort&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;downArrow&amp;quot;, // || upArrow&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
			&amp;quot;dataType&amp;quot;: &amp;quot;number&amp;quot;, // &amp;quot;number&amp;quot; | &amp;quot;string&amp;quot;&lt;br /&gt;
			&amp;quot;sortOrder&amp;quot;: &amp;quot;ascending&amp;quot; // &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot; (default ascending)&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId4&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;numberOfRows&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot; // || &amp;quot;select&amp;quot; || &amp;quot;checkbox&amp;quot; || &amp;quot;radio&amp;quot; ,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId5&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;:&amp;quot;numberOfRows&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;select&amp;quot;,&lt;br /&gt;
			&amp;quot;options&amp;quot;: [&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;page5&amp;quot;,&lt;br /&gt;
               value:5&lt;br /&gt;
             },&lt;br /&gt;
	       	 {&lt;br /&gt;
               optionText:&amp;quot;page7&amp;quot;,&lt;br /&gt;
               value:7&lt;br /&gt;
             },&lt;br /&gt;
			],&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId6&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;submit&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;submit&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: [&amp;quot;sort&amp;quot;, &amp;quot;numberOfRows&amp;quot;, &amp;quot;filter&amp;quot;] &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId7&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;reset&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;reset rows&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: [&amp;quot;sort&amp;quot;, &amp;quot;numberOfRows&amp;quot;, &amp;quot;filter&amp;quot;] &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId9&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;totalDatafield&amp;quot;,&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
			&amp;quot;showIfNotAllRowsLoaded&amp;quot;: true // || false&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId11&amp;quot;:{&lt;br /&gt;
			// will need to link to per record check box&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkAction&amp;quot;,&lt;br /&gt;
			&amp;quot;action&amp;quot;: &amp;quot;on&amp;quot; // on | off | switch&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;, // have normalized list of bulkActionTags, with list of &amp;quot;bulkAction&amp;quot; and &amp;quot;bulkActionCheckBox&amp;quot; elements linked to it&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId8&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;pageNumbers&amp;quot;,&lt;br /&gt;
			&amp;quot;linksAfter&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToLastPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenLastPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;gt;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;linksBefore&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToFirstPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenFirstPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;showPagesAfter&amp;quot;: 3,&lt;br /&gt;
			&amp;quot;showPagesBefore&amp;quot;: 3&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		// records types    &lt;br /&gt;
		&amp;quot;elementId5&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;requiredDataLinkStepObject&amp;quot;, // in record&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementIdxx&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkActionCheckBox&amp;quot;,&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	valueUserTags: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
            valueSource: 'perParentIdentifier',&lt;br /&gt;
            perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	bulkActionUserTags: {&lt;br /&gt;
		tagA:{&lt;br /&gt;
			bulkActions: [&lt;br /&gt;
                &amp;quot;elementId11&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
            bulkActionCheckBoxes: [&lt;br /&gt;
                &amp;quot;elementIdxx&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
		},&lt;br /&gt;
        // ...&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
          partitionKeyValueUserTags: {&lt;br /&gt;
            productId: &amp;quot;userTag_1&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
          // sortKeyValueUserTags: {&lt;br /&gt;
          //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
          // },&lt;br /&gt;
          // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
          // conditionalFieldValues: [&lt;br /&gt;
          //  {&lt;br /&gt;
          //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
          //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
          //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
          //  }&lt;br /&gt;
          // ]&lt;br /&gt;
       },&lt;br /&gt;
       &lt;br /&gt;
       // ex. traversal type&lt;br /&gt;
       // hash_traversal: {&lt;br /&gt;
       //   logicalElementType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
       //   previousLogicalElementId: null,&lt;br /&gt;
       //   nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
       //   objType: {&lt;br /&gt;
       //     objectType: &amp;quot;locationNode&amp;quot;,&lt;br /&gt;
       //     serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
       //   },&lt;br /&gt;
       //   traversalSteps: [&lt;br /&gt;
       //     &amp;quot;hash_traversal_1&amp;quot;,&lt;br /&gt;
       //     &amp;quot;hash_traversal_2&amp;quot;,&lt;br /&gt;
       //     &amp;quot;hash_traversal_3&amp;quot;,&lt;br /&gt;
       //   ]&lt;br /&gt;
       // }&lt;br /&gt;
    },&lt;br /&gt;
    traversalSteps: {&lt;br /&gt;
       hash_traversal_1: {&lt;br /&gt;
		pathLinkType: {&lt;br /&gt;
            objType: {&lt;br /&gt;
			   serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			   objectType: &amp;quot;localtionLink&amp;quot;&lt;br /&gt;
		    },&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;hasLocationLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;to&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
       //* setting of traversal step&lt;br /&gt;
        fieldValueUserTags: [...]  //optional, if this step is not last step&lt;br /&gt;
        relationshipProperties: {&lt;br /&gt;
          // timestamp: 1231456 //or will ref value???? ====&amp;gt; not sure?&lt;br /&gt;
          timestamp: &amp;quot;valueUserTag_A&amp;quot;&lt;br /&gt;
        }, &lt;br /&gt;
        hopsPassObjType: true, //optional //* สามารถ hops ได้ทุก step ยกเว้น step สุดท้าย = traversal_5&lt;br /&gt;
        hopsStart: 1, //optional default: 1&lt;br /&gt;
        hopsEnd: 10, //optional &lt;br /&gt;
&lt;br /&gt;
       },&lt;br /&gt;
       hash_traversal_2: {&lt;br /&gt;
		pathLinkType: {&lt;br /&gt;
            objType: {&lt;br /&gt;
			   serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			   objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
		    },&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;isLocationNode&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;to&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		fieldValueUserTags: [...],//optional  &lt;br /&gt;
		hopsEnd: 10, //optional  &lt;br /&gt;
       },&lt;br /&gt;
       hash_traversal_3:{&lt;br /&gt;
         fieldValueUserTags: [&lt;br /&gt;
           {&lt;br /&gt;
             categoryId: &amp;quot;valueD&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             categoryId: &amp;quot;valueA&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             price: &amp;quot;valueF&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             categoryId: &amp;quot;valueA&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             categoryId: &amp;quot;valueB&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
         ]&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
        // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
	],&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
                partitionKeyValueUserTags: {&lt;br /&gt;
                   locationNodeId: &amp;quot;userTag_7&amp;quot;,&lt;br /&gt;
                },&lt;br /&gt;
                // sortKeyValueUserTags: {&lt;br /&gt;
                //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
                // },&lt;br /&gt;
                // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                // conditionalFieldValues: [&lt;br /&gt;
                //  {&lt;br /&gt;
                //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
                //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
                //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
                //  }&lt;br /&gt;
                // ]&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
               partitionKeyValueUserTags: {&lt;br /&gt;
                   sellOfferId: &amp;quot;userTag_8&amp;quot;,&lt;br /&gt;
               },&lt;br /&gt;
               // sortKeyValueUserTags: {&lt;br /&gt;
               //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
               // },&lt;br /&gt;
               // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               // conditionalFieldValues: [&lt;br /&gt;
               //  {&lt;br /&gt;
               //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
               //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
               //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
               //  }&lt;br /&gt;
               // ]&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
        // userTag_LinkStepObjectC&lt;br /&gt;
        // userTag_LinkStepObjectD&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
           addFilterMain: true, //default: false =&amp;gt; need to add filterMain set = true&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  partitionKeyValueUserTags: {&lt;br /&gt;
                     sellOfferId: &amp;quot;userTag_8&amp;quot;,&lt;br /&gt;
                  },&lt;br /&gt;
                  // sortKeyValueUserTags: {&lt;br /&gt;
                  //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
                  // },&lt;br /&gt;
                  // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  conditionalFieldValues: [&lt;br /&gt;
                    {&lt;br /&gt;
                      fieldname: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                      includeValueUserTags: [&amp;quot;userTag_2&amp;quot;], // &lt;br /&gt;
                      // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
                    }&lt;br /&gt;
                   ]&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
          aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
          sortFields: [&lt;br /&gt;
       			{&lt;br /&gt;
            		requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		            dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
                    sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
        		},&lt;br /&gt;
				{&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
                     sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
		         },&lt;br /&gt;
                {&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
                     sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;],&lt;br /&gt;
                     sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
		        }&lt;br /&gt;
            ],&lt;br /&gt;
          comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
          comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
          comparisonSortDataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
          comparisonValue: &amp;quot;userTag_2&amp;quot;,&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
             sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
		{&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
             sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		     dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
             sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;],&lt;br /&gt;
             sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
    ],&lt;br /&gt;
	valueUserTags: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueSource: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4089</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4089"/>
		<updated>2026-02-12T07:43:05Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as params sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
	// header/footer filterDataField elements reference valueUserTag&lt;br /&gt;
&lt;br /&gt;
	&amp;quot;elements&amp;quot;: {&lt;br /&gt;
		// shared types&lt;br /&gt;
		&amp;quot;elementId12&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;freetext&amp;quot;,&lt;br /&gt;
			&amp;quot;value&amp;quot;: &amp;quot;aa&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// headerFooter types&lt;br /&gt;
		&amp;quot;elementId1&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;valueUserTag&amp;quot;: &amp;quot;userTag_9&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot; // || &amp;quot;select&amp;quot; || &amp;quot;checkbox&amp;quot; || &amp;quot;radio&amp;quot; ,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId2&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;select&amp;quot;,&lt;br /&gt;
			&amp;quot;options&amp;quot;: [&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option1&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
              },&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option2&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
			],&lt;br /&gt;
		},&lt;br /&gt;
        &amp;quot;elementId21&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;checkbox&amp;quot;,&lt;br /&gt;
			&amp;quot;onSetting:{&lt;br /&gt;
               optionText:&amp;quot;on&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
             &amp;quot;offSetting&amp;quot;:{&lt;br /&gt;
               optionText:&amp;quot;off&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
		   &lt;br /&gt;
           &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId3&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;sort&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;downArrow&amp;quot;, // || upArrow&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
			&amp;quot;dataType&amp;quot;: &amp;quot;number&amp;quot;, // &amp;quot;number&amp;quot; | &amp;quot;string&amp;quot;&lt;br /&gt;
			&amp;quot;sortOrder&amp;quot;: &amp;quot;ascending&amp;quot; // &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot; (default ascending)&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId4&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;numberOfRows&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot; // || &amp;quot;select&amp;quot; || &amp;quot;checkbox&amp;quot; || &amp;quot;radio&amp;quot; ,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId5&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;:&amp;quot;numberOfRows&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;select&amp;quot;,&lt;br /&gt;
			&amp;quot;options&amp;quot;: [&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;page5&amp;quot;,&lt;br /&gt;
               value:5&lt;br /&gt;
             },&lt;br /&gt;
	       	 {&lt;br /&gt;
               optionText:&amp;quot;page7&amp;quot;,&lt;br /&gt;
               value:7&lt;br /&gt;
             },&lt;br /&gt;
			],&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId6&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;submit&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;submit&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: [&amp;quot;sort&amp;quot;, &amp;quot;numberOfRows&amp;quot;, &amp;quot;filter&amp;quot;] &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId7&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;reset&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;reset rows&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: [&amp;quot;sort&amp;quot;, &amp;quot;numberOfRows&amp;quot;, &amp;quot;filter&amp;quot;] &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId9&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;totalDatafield&amp;quot;,&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
			&amp;quot;showIfNotAllRowsLoaded&amp;quot;: true // || false&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId11&amp;quot;:{&lt;br /&gt;
			// will need to link to per record check box&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkAction&amp;quot;,&lt;br /&gt;
			&amp;quot;action&amp;quot;: &amp;quot;on&amp;quot; // on | off | switch&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;, // have normalized list of bulkActionTags, with list of &amp;quot;bulkAction&amp;quot; and &amp;quot;bulkActionCheckBox&amp;quot; elements linked to it&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId8&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;pageNumbers&amp;quot;,&lt;br /&gt;
			&amp;quot;linksAfter&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToLastPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenLastPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;gt;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;linksBefore&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToFirstPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenFirstPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;showPagesAfter&amp;quot;: 3,&lt;br /&gt;
			&amp;quot;showPagesBefore&amp;quot;: 3&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		// records types    &lt;br /&gt;
		&amp;quot;elementId5&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;requiredDataLinkStepObject&amp;quot;, // in record&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementIdxx&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkActionCheckBox&amp;quot;,&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
            valueSource: 'perParentIdentifier',&lt;br /&gt;
            perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	bulkActionUserTags: {&lt;br /&gt;
		tagA:{&lt;br /&gt;
			bulkActions: [&lt;br /&gt;
                &amp;quot;elementId11&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
            bulkActionCheckBoxes: [&lt;br /&gt;
                &amp;quot;elementIdxx&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
		},&lt;br /&gt;
        // ...&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
          partitionKeyValueUserTags: {&lt;br /&gt;
            productId: &amp;quot;userTag_1&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
          // sortKeyValueUserTags: {&lt;br /&gt;
          //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
          // },&lt;br /&gt;
          // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
          // conditionalFieldValues: [&lt;br /&gt;
          //  {&lt;br /&gt;
          //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
          //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
          //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
          //  }&lt;br /&gt;
          // ]&lt;br /&gt;
       },&lt;br /&gt;
       &lt;br /&gt;
       // ex. traversal type&lt;br /&gt;
       // uuid_traversal: {&lt;br /&gt;
       //   logicalElementType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
       //   previousLogicalElementId: null,&lt;br /&gt;
       //   nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
       //   objType: {&lt;br /&gt;
       //     objectType: &amp;quot;locationNode&amp;quot;,&lt;br /&gt;
       //     serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
       //   },&lt;br /&gt;
       //   traversalSteps: [&lt;br /&gt;
       //     &amp;quot;uuid_traversal_1&amp;quot;,&lt;br /&gt;
       //     &amp;quot;uuid_traversal_2&amp;quot;,&lt;br /&gt;
       //     &amp;quot;uuid_traversal_3&amp;quot;,&lt;br /&gt;
       //   ]&lt;br /&gt;
       // }&lt;br /&gt;
    },&lt;br /&gt;
    traversalSteps: {&lt;br /&gt;
       uuid_traversal_1: {&lt;br /&gt;
		pathLinkType: {&lt;br /&gt;
            objType: {&lt;br /&gt;
			   serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			   objectType: &amp;quot;localtionLink&amp;quot;&lt;br /&gt;
		    },&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;hasLocationLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;to&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		hopsPassObjType: true, //optional&lt;br /&gt;
		hopsEnd: 10, //optional  &lt;br /&gt;
       },&lt;br /&gt;
       uuid_traversal_2: {&lt;br /&gt;
		pathLinkType: {&lt;br /&gt;
            objType: {&lt;br /&gt;
			   serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			   objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
		    },&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;isLocationNode&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;to&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		//* last traversal cannot set hopPassObjType&lt;br /&gt;
		hopsEnd: 10, //optional  &lt;br /&gt;
       },&lt;br /&gt;
       uuid_traversal_3:{&lt;br /&gt;
         fieldValueUserTags: [&lt;br /&gt;
           {&lt;br /&gt;
             categoryId: &amp;quot;valueD&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             categoryId: &amp;quot;valueA&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             price: &amp;quot;valueF&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             categoryId: &amp;quot;valueA&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           {&lt;br /&gt;
             categoryId: &amp;quot;valueB&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
         ]&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
        // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
	],&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
                partitionKeyValueUserTags: {&lt;br /&gt;
                   locationNodeId: &amp;quot;userTag_7&amp;quot;,&lt;br /&gt;
                },&lt;br /&gt;
                // sortKeyValueUserTags: {&lt;br /&gt;
                //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
                // },&lt;br /&gt;
                // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                // conditionalFieldValues: [&lt;br /&gt;
                //  {&lt;br /&gt;
                //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
                //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
                //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
                //  }&lt;br /&gt;
                // ]&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
               partitionKeyValueUserTags: {&lt;br /&gt;
                   sellOfferId: &amp;quot;userTag_8&amp;quot;,&lt;br /&gt;
               },&lt;br /&gt;
               // sortKeyValueUserTags: {&lt;br /&gt;
               //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
               // },&lt;br /&gt;
               // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               // conditionalFieldValues: [&lt;br /&gt;
               //  {&lt;br /&gt;
               //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
               //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
               //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
               //  }&lt;br /&gt;
               // ]&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
        // userTag_LinkStepObjectC&lt;br /&gt;
        // userTag_LinkStepObjectD&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
           addFilterMain: true, //default: false =&amp;gt; need to add filterMain set = true&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  partitionKeyValueUserTags: {&lt;br /&gt;
                     sellOfferId: &amp;quot;userTag_8&amp;quot;,&lt;br /&gt;
                  },&lt;br /&gt;
                  // sortKeyValueUserTags: {&lt;br /&gt;
                  //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
                  // },&lt;br /&gt;
                  // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  conditionalFieldValues: [&lt;br /&gt;
                    {&lt;br /&gt;
                      fieldname: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                      includeValueUserTags: [&amp;quot;userTag_2&amp;quot;], // &lt;br /&gt;
                      // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
                    }&lt;br /&gt;
                   ]&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
          aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
          sortFields: [&lt;br /&gt;
       			{&lt;br /&gt;
            		requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		            dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
                    sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
        		},&lt;br /&gt;
				{&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
                     sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
		         },&lt;br /&gt;
                {&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
                     sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;],&lt;br /&gt;
                     sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
		        }&lt;br /&gt;
            ],&lt;br /&gt;
          comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
          comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
          comparisonSortDataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
          comparisonValue: &amp;quot;userTag_2&amp;quot;,&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
             sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
		{&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
             sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		     dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
             sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;],&lt;br /&gt;
             sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
    ],&lt;br /&gt;
	valueUserTags: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueSource: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4080</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4080"/>
		<updated>2026-02-05T08:03:39Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as params sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
	// header/footer filterDataField elements reference valueUserTag&lt;br /&gt;
&lt;br /&gt;
	&amp;quot;elements&amp;quot;: {&lt;br /&gt;
		// shared types&lt;br /&gt;
		&amp;quot;elementId12&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;freetext&amp;quot;,&lt;br /&gt;
			&amp;quot;value&amp;quot;: &amp;quot;aa&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// headerFooter types&lt;br /&gt;
		&amp;quot;elementId1&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;valueUserTag&amp;quot;: &amp;quot;userTag_9&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot; // || &amp;quot;select&amp;quot; || &amp;quot;checkbox&amp;quot; || &amp;quot;radio&amp;quot; ,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId2&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;select&amp;quot;,&lt;br /&gt;
			&amp;quot;options&amp;quot;: [&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option1&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
              },&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option2&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
			],&lt;br /&gt;
		},&lt;br /&gt;
        &amp;quot;elementId21&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;checkbox&amp;quot;,&lt;br /&gt;
			&amp;quot;onSetting:{&lt;br /&gt;
               optionText:&amp;quot;on&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
             &amp;quot;offSetting&amp;quot;:{&lt;br /&gt;
               optionText:&amp;quot;off&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
		   &lt;br /&gt;
           &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId3&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;sort&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;downArrow&amp;quot;, // || upArrow&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
			&amp;quot;dataType&amp;quot;: &amp;quot;number&amp;quot;, // &amp;quot;number&amp;quot; | &amp;quot;string&amp;quot;&lt;br /&gt;
			&amp;quot;sortOrder&amp;quot;: &amp;quot;ascending&amp;quot; // &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot; (default ascending)&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId4&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;numberOfRows&amp;quot;,&lt;br /&gt;
			&amp;quot;selection&amp;quot;: &amp;quot;input&amp;quot; // || list&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId6&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;submit&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;submit&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: &amp;quot;all&amp;quot; // numberOfRows || all || filters&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId7&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;reset&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;reset rows&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: &amp;quot;numberOfRows&amp;quot; // numberOfRows || all || filters&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId9&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;totalDatafield&amp;quot;,&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
			&amp;quot;showIfNotAllRowsLoaded&amp;quot;: true // || false&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId11&amp;quot;:{&lt;br /&gt;
			// will need to link to per record check box&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkAction&amp;quot;,&lt;br /&gt;
			&amp;quot;action&amp;quot;: &amp;quot;on&amp;quot; // on | off | switch&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;, // have normalized list of bulkActionTags, with list of &amp;quot;bulkAction&amp;quot; and &amp;quot;bulkActionCheckBox&amp;quot; elements linked to it&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId8&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;pageNumbers&amp;quot;,&lt;br /&gt;
			&amp;quot;linksAfter&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToLastPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenLastPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;gt;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;linksBefore&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToFirstPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenFirstPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;showPagesAfter&amp;quot;: 3,&lt;br /&gt;
			&amp;quot;showPagesBefore&amp;quot;: 3&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		// records types    &lt;br /&gt;
		&amp;quot;elementId5&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;requiredDataLinkStepObject&amp;quot;, // in record&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementIdxx&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkActionCheckBox&amp;quot;,&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
            valueSource: 'perParentIdentifier',&lt;br /&gt;
            perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	bulkActionUserTags: {&lt;br /&gt;
		tagA:{&lt;br /&gt;
			bulkActions: [&lt;br /&gt;
                &amp;quot;elementId11&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
            bulkActionCheckBoxes: [&lt;br /&gt;
                &amp;quot;elementIdxx&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
		},&lt;br /&gt;
        // ...&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
          partitionKeyValueUserTags: {&lt;br /&gt;
            productId: &amp;quot;userTag_1&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
          // sortKeyValueUserTags: {&lt;br /&gt;
          //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
          // },&lt;br /&gt;
          // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
          // conditionalFieldValues: [&lt;br /&gt;
          //  {&lt;br /&gt;
          //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
          //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
          //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
          //  }&lt;br /&gt;
          // ]&lt;br /&gt;
       },&lt;br /&gt;
       &lt;br /&gt;
       // ex. traversal type&lt;br /&gt;
       // uuid_traversal: {&lt;br /&gt;
       //   logicalElementType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
       //   previousLogicalElementId: null,&lt;br /&gt;
       //   nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
       //   objType: {&lt;br /&gt;
       //     objectType: &amp;quot;locationNode&amp;quot;,&lt;br /&gt;
       //     serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
       //   },&lt;br /&gt;
       //   traversalSteps: [&lt;br /&gt;
       //     &amp;quot;uuid_traversal_1&amp;quot;,&lt;br /&gt;
       //     &amp;quot;uuid_traversal_2&amp;quot;,&lt;br /&gt;
       //   ]&lt;br /&gt;
       // }&lt;br /&gt;
    },&lt;br /&gt;
    traversalSteps: {&lt;br /&gt;
       uuid_traversal_1: {&lt;br /&gt;
		objType: {&lt;br /&gt;
			serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			objectType: &amp;quot;localtionLink&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		link: {&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;hasLocationLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		hopsPassObjType: true, //optional&lt;br /&gt;
		hopsEnd: 10, //optional  &lt;br /&gt;
       },&lt;br /&gt;
       uuid_traversal_2: {&lt;br /&gt;
        objType: {&lt;br /&gt;
			serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		link: {&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;isLocationNode&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		//* last traversal cannot set hopPassObjType&lt;br /&gt;
		hopsEnd: 10, //optional  &lt;br /&gt;
        fieldValueUserTags: [&lt;br /&gt;
        {&lt;br /&gt;
          categoryId: &amp;quot;valueD&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          categoryId: &amp;quot;valueA&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          price: &amp;quot;valueF&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          categoryId: &amp;quot;valueA&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          categoryId: &amp;quot;valueB&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
      ]&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
        // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
	],&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
                partitionKeyValueUserTags: {&lt;br /&gt;
                   locationNodeId: &amp;quot;userTag_7&amp;quot;,&lt;br /&gt;
                },&lt;br /&gt;
                // sortKeyValueUserTags: {&lt;br /&gt;
                //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
                // },&lt;br /&gt;
                // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                // conditionalFieldValues: [&lt;br /&gt;
                //  {&lt;br /&gt;
                //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
                //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
                //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
                //  }&lt;br /&gt;
                // ]&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
               partitionKeyValueUserTags: {&lt;br /&gt;
                   sellOfferId: &amp;quot;userTag_8&amp;quot;,&lt;br /&gt;
               },&lt;br /&gt;
               // sortKeyValueUserTags: {&lt;br /&gt;
               //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
               // },&lt;br /&gt;
               // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               // conditionalFieldValues: [&lt;br /&gt;
               //  {&lt;br /&gt;
               //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
               //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
               //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
               //  }&lt;br /&gt;
               // ]&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
        // userTag_LinkStepObjectC&lt;br /&gt;
        // userTag_LinkStepObjectD&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
           addFilterMain: true, //default: false =&amp;gt; need to add filterMain set = true&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  partitionKeyValueUserTags: {&lt;br /&gt;
                     sellOfferId: &amp;quot;userTag_8&amp;quot;,&lt;br /&gt;
                  },&lt;br /&gt;
                  // sortKeyValueUserTags: {&lt;br /&gt;
                  //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
                  // },&lt;br /&gt;
                  // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  conditionalFieldValues: [&lt;br /&gt;
                    {&lt;br /&gt;
                      fieldname: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                      includeValueUserTags: [&amp;quot;userTag_2&amp;quot;], // &lt;br /&gt;
                      // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
                    }&lt;br /&gt;
                   ]&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
          aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
          sortFields: [&lt;br /&gt;
       			{&lt;br /&gt;
            		requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		            dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
                    sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
        		},&lt;br /&gt;
				{&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
                     sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
		         },&lt;br /&gt;
                {&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
                     sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;],&lt;br /&gt;
                     sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
		        }&lt;br /&gt;
            ],&lt;br /&gt;
          comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
          comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
          comparisonSortDataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
          comparisonValue: &amp;quot;userTag_2&amp;quot;,&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
             sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
		{&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
             sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		     dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
             sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;],&lt;br /&gt;
             sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
    ],&lt;br /&gt;
	valueUserTags: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueSource: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4079</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4079"/>
		<updated>2026-02-05T06:54:32Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as params sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
	// header/footer filterDataField elements reference valueUserTag&lt;br /&gt;
&lt;br /&gt;
	&amp;quot;elements&amp;quot;: {&lt;br /&gt;
		// shared types&lt;br /&gt;
		&amp;quot;elementId12&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;freetext&amp;quot;,&lt;br /&gt;
			&amp;quot;value&amp;quot;: &amp;quot;aa&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// headerFooter types&lt;br /&gt;
		&amp;quot;elementId1&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;valueUserTag&amp;quot;: &amp;quot;userTag_9&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot; // || &amp;quot;select&amp;quot; || &amp;quot;checkbox&amp;quot; || &amp;quot;radio&amp;quot; ,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId2&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;select&amp;quot;,&lt;br /&gt;
			&amp;quot;options&amp;quot;: [&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option1&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
              },&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option2&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
			],&lt;br /&gt;
		},&lt;br /&gt;
        &amp;quot;elementId21&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;checkbox&amp;quot;,&lt;br /&gt;
			&amp;quot;onSetting:{&lt;br /&gt;
               optionText:&amp;quot;on&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
             &amp;quot;offSetting&amp;quot;:{&lt;br /&gt;
               optionText:&amp;quot;off&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
		   &lt;br /&gt;
           &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId3&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;sort&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;downArrow&amp;quot;, // || upArrow&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
			&amp;quot;dataType&amp;quot;: &amp;quot;number&amp;quot;, // &amp;quot;number&amp;quot; | &amp;quot;string&amp;quot;&lt;br /&gt;
			&amp;quot;sortOrder&amp;quot;: &amp;quot;ascending&amp;quot; // &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot; (default ascending)&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId4&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;numberOfRows&amp;quot;,&lt;br /&gt;
			&amp;quot;selection&amp;quot;: &amp;quot;input&amp;quot; // || list&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId6&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;submit&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;submit&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: &amp;quot;all&amp;quot; // numberOfRows || all || filters&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId7&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;reset&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;reset rows&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: &amp;quot;numberOfRows&amp;quot; // numberOfRows || all || filters&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId9&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;totalDatafield&amp;quot;,&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
			&amp;quot;showIfNotAllRowsLoaded&amp;quot;: true // || false&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId11&amp;quot;:{&lt;br /&gt;
			// will need to link to per record check box&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkAction&amp;quot;,&lt;br /&gt;
			&amp;quot;action&amp;quot;: &amp;quot;on&amp;quot; // on | off | switch&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;, // have normalized list of bulkActionTags, with list of &amp;quot;bulkAction&amp;quot; and &amp;quot;bulkActionCheckBox&amp;quot; elements linked to it&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId8&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;pageNumbers&amp;quot;,&lt;br /&gt;
			&amp;quot;linksAfter&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToLastPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenLastPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;gt;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;linksBefore&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToFirstPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenFirstPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;showPagesAfter&amp;quot;: 3,&lt;br /&gt;
			&amp;quot;showPagesBefore&amp;quot;: 3&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		// records types    &lt;br /&gt;
		&amp;quot;elementId5&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;requiredDataLinkStepObject&amp;quot;, // in record&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementIdxx&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkActionCheckBox&amp;quot;,&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
            valueSource: 'perParentIdentifier',&lt;br /&gt;
            perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	bulkActionUserTags: {&lt;br /&gt;
		tagA:{&lt;br /&gt;
			bulkActions: [&lt;br /&gt;
                &amp;quot;elementId11&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
            bulkActionCheckBoxes: [&lt;br /&gt;
                &amp;quot;elementIdxx&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
		},&lt;br /&gt;
        // ...&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
          partitionKeyValueUserTags: {&lt;br /&gt;
            productId: &amp;quot;userTag_1&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
          // sortKeyValueUserTags: {&lt;br /&gt;
          //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
          // },&lt;br /&gt;
          // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
          // conditionalFieldValues: [&lt;br /&gt;
          //  {&lt;br /&gt;
          //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
          //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
          //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
          //  }&lt;br /&gt;
          // ]&lt;br /&gt;
       },&lt;br /&gt;
       &lt;br /&gt;
       // ex. traversal type&lt;br /&gt;
       // uuid_traversal: {&lt;br /&gt;
       //   logicalElementType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
       //   previousLogicalElementId: null,&lt;br /&gt;
       //   nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
       //   objType: {&lt;br /&gt;
       //     objectType: &amp;quot;locationNode&amp;quot;,&lt;br /&gt;
       //     serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
       //   },&lt;br /&gt;
       //   traversalSteps: [&lt;br /&gt;
       //     &amp;quot;uuid_traversal_1&amp;quot;,&lt;br /&gt;
       //     &amp;quot;uuid_traversal_2&amp;quot;,&lt;br /&gt;
       //   ]&lt;br /&gt;
       // }&lt;br /&gt;
    },&lt;br /&gt;
    traversalSteps: {&lt;br /&gt;
       uuid_traversal_1: {&lt;br /&gt;
		objType: {&lt;br /&gt;
			serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			objectType: &amp;quot;localtionLink&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		link: {&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;hasLocationLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		hopsPassObjType: true, //optional&lt;br /&gt;
		hopsEnd: 10, //optional  &lt;br /&gt;
       },&lt;br /&gt;
       uuid_traversal_2: {&lt;br /&gt;
        objType: {&lt;br /&gt;
			serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		link: {&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;isLocationNode&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		//* last traversal cannot set hopPassObjType&lt;br /&gt;
		hopsEnd: 10, //optional  &lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
        // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
	],&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
                partitionKeyValueUserTags: {&lt;br /&gt;
                   locationNodeId: &amp;quot;userTag_7&amp;quot;,&lt;br /&gt;
                },&lt;br /&gt;
                // sortKeyValueUserTags: {&lt;br /&gt;
                //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
                // },&lt;br /&gt;
                // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                // conditionalFieldValues: [&lt;br /&gt;
                //  {&lt;br /&gt;
                //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
                //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
                //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
                //  }&lt;br /&gt;
                // ]&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
               partitionKeyValueUserTags: {&lt;br /&gt;
                   sellOfferId: &amp;quot;userTag_8&amp;quot;,&lt;br /&gt;
               },&lt;br /&gt;
               // sortKeyValueUserTags: {&lt;br /&gt;
               //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
               // },&lt;br /&gt;
               // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               // conditionalFieldValues: [&lt;br /&gt;
               //  {&lt;br /&gt;
               //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
               //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
               //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
               //  }&lt;br /&gt;
               // ]&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
        // userTag_LinkStepObjectC&lt;br /&gt;
        // userTag_LinkStepObjectD&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
           addFilterMain: true, //default: false =&amp;gt; need to add filterMain set = true&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  partitionKeyValueUserTags: {&lt;br /&gt;
                     sellOfferId: &amp;quot;userTag_8&amp;quot;,&lt;br /&gt;
                  },&lt;br /&gt;
                  // sortKeyValueUserTags: {&lt;br /&gt;
                  //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
                  // },&lt;br /&gt;
                  // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  conditionalFieldValues: [&lt;br /&gt;
                    {&lt;br /&gt;
                      fieldname: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                      includeValueUserTags: [&amp;quot;userTag_2&amp;quot;], // &lt;br /&gt;
                      // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
                    }&lt;br /&gt;
                   ]&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
          aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
          sortFields: [&lt;br /&gt;
       			{&lt;br /&gt;
            		requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		            dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
                    sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
        		},&lt;br /&gt;
				{&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
                     sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
		         },&lt;br /&gt;
                {&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
                     sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;],&lt;br /&gt;
                     sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
		        }&lt;br /&gt;
            ],&lt;br /&gt;
          comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
          comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
          comparisonSortDataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
          comparisonValue: &amp;quot;userTag_2&amp;quot;,&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
             sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
		{&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
             sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		     dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
             sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;],&lt;br /&gt;
             sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
    ],&lt;br /&gt;
	valueUserTags: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueSource: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4078</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4078"/>
		<updated>2026-02-05T06:53:55Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as params sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
	// header/footer filterDataField elements reference valueUserTag&lt;br /&gt;
&lt;br /&gt;
	&amp;quot;elements&amp;quot;: {&lt;br /&gt;
		// shared types&lt;br /&gt;
		&amp;quot;elementId12&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;freetext&amp;quot;,&lt;br /&gt;
			&amp;quot;value&amp;quot;: &amp;quot;aa&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// headerFooter types&lt;br /&gt;
		&amp;quot;elementId1&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;valueUserTag&amp;quot;: &amp;quot;userTag_9&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot; // || &amp;quot;select&amp;quot; || &amp;quot;checkbox&amp;quot; || &amp;quot;radio&amp;quot; ,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId2&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;select&amp;quot;,&lt;br /&gt;
			&amp;quot;options&amp;quot;: [&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option1&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
              },&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option2&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
			],&lt;br /&gt;
		},&lt;br /&gt;
        &amp;quot;elementId21&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;checkbox&amp;quot;,&lt;br /&gt;
			&amp;quot;onSetting:{&lt;br /&gt;
               optionText:&amp;quot;on&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
             &amp;quot;offSetting&amp;quot;:{&lt;br /&gt;
               optionText:&amp;quot;off&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
		   &lt;br /&gt;
           &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId3&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;sort&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;downArrow&amp;quot;, // || upArrow&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
			&amp;quot;dataType&amp;quot;: &amp;quot;number&amp;quot;, // &amp;quot;number&amp;quot; | &amp;quot;string&amp;quot;&lt;br /&gt;
			&amp;quot;sortOrder&amp;quot;: &amp;quot;ascending&amp;quot; // &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot; (default ascending)&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId4&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;numberOfRows&amp;quot;,&lt;br /&gt;
			&amp;quot;selection&amp;quot;: &amp;quot;input&amp;quot; // || list&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId6&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;submit&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;submit&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: &amp;quot;all&amp;quot; // numberOfRows || all || filters&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId7&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;reset&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;reset rows&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: &amp;quot;numberOfRows&amp;quot; // numberOfRows || all || filters&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId9&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;totalDatafield&amp;quot;,&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
			&amp;quot;showIfNotAllRowsLoaded&amp;quot;: true // || false&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId11&amp;quot;:{&lt;br /&gt;
			// will need to link to per record check box&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkAction&amp;quot;,&lt;br /&gt;
			&amp;quot;action&amp;quot;: &amp;quot;on&amp;quot; // on | off | switch&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;, // have normalized list of bulkActionTags, with list of &amp;quot;bulkAction&amp;quot; and &amp;quot;bulkActionCheckBox&amp;quot; elements linked to it&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId8&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;pageNumbers&amp;quot;,&lt;br /&gt;
			&amp;quot;linksAfter&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToLastPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenLastPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;gt;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;linksBefore&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToFirstPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenFirstPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;showPagesAfter&amp;quot;: 3,&lt;br /&gt;
			&amp;quot;showPagesBefore&amp;quot;: 3&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		// records types    &lt;br /&gt;
		&amp;quot;elementId5&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;requiredDataLinkStepObject&amp;quot;, // in record&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementIdxx&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkActionCheckBox&amp;quot;,&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
            valueSource: 'perParentIdentifier',&lt;br /&gt;
            perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	bulkActionUserTags: {&lt;br /&gt;
		tagA:{&lt;br /&gt;
			bulkActions: [&lt;br /&gt;
                &amp;quot;elementId11&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
            bulkActionCheckBoxes: [&lt;br /&gt;
                &amp;quot;elementIdxx&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
		},&lt;br /&gt;
        // ...&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
          partitionKeyValueUserTags: {&lt;br /&gt;
            productId: &amp;quot;userTag_1&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
           sortKeyValueUserTags: {&lt;br /&gt;
          //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
          // },&lt;br /&gt;
          // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
          // conditionalFieldValues: [&lt;br /&gt;
          //  {&lt;br /&gt;
          //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
          //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
          //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
          //  }&lt;br /&gt;
          // ]&lt;br /&gt;
       },&lt;br /&gt;
       &lt;br /&gt;
       // ex. traversal type&lt;br /&gt;
       // uuid_traversal: {&lt;br /&gt;
       //   logicalElementType: &amp;quot;traversal&amp;quot;,&lt;br /&gt;
       //   previousLogicalElementId: null,&lt;br /&gt;
       //   nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
       //   objType: {&lt;br /&gt;
       //     objectType: &amp;quot;locationNode&amp;quot;,&lt;br /&gt;
       //     serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
       //   },&lt;br /&gt;
       //   traversalSteps: [&lt;br /&gt;
       //     &amp;quot;uuid_traversal_1&amp;quot;,&lt;br /&gt;
       //     &amp;quot;uuid_traversal_2&amp;quot;,&lt;br /&gt;
       //   ]&lt;br /&gt;
       // }&lt;br /&gt;
    },&lt;br /&gt;
    traversalSteps: {&lt;br /&gt;
       uuid_traversal_1: {&lt;br /&gt;
		objType: {&lt;br /&gt;
			serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			objectType: &amp;quot;localtionLink&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		link: {&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;hasLocationLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		hopsPassObjType: true, //optional&lt;br /&gt;
		hopsEnd: 10, //optional  &lt;br /&gt;
       },&lt;br /&gt;
       uuid_traversal_2: {&lt;br /&gt;
        objType: {&lt;br /&gt;
			serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		link: {&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;isLocationNode&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		//* last traversal cannot set hopPassObjType&lt;br /&gt;
		hopsEnd: 10, //optional  &lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
        // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
	],&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
                partitionKeyValueUserTags: {&lt;br /&gt;
                   locationNodeId: &amp;quot;userTag_7&amp;quot;,&lt;br /&gt;
                },&lt;br /&gt;
                // sortKeyValueUserTags: {&lt;br /&gt;
                //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
                // },&lt;br /&gt;
                // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                // conditionalFieldValues: [&lt;br /&gt;
                //  {&lt;br /&gt;
                //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
                //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
                //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
                //  }&lt;br /&gt;
                // ]&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
               partitionKeyValueUserTags: {&lt;br /&gt;
                   sellOfferId: &amp;quot;userTag_8&amp;quot;,&lt;br /&gt;
               },&lt;br /&gt;
               // sortKeyValueUserTags: {&lt;br /&gt;
               //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
               // },&lt;br /&gt;
               // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               // conditionalFieldValues: [&lt;br /&gt;
               //  {&lt;br /&gt;
               //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
               //   includeValueUserTags: [&amp;quot;th&amp;quot;],&lt;br /&gt;
               //    // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
               //  }&lt;br /&gt;
               // ]&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
        // userTag_LinkStepObjectC&lt;br /&gt;
        // userTag_LinkStepObjectD&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
           addFilterMain: true, //default: false =&amp;gt; need to add filterMain set = true&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  partitionKeyValueUserTags: {&lt;br /&gt;
                     sellOfferId: &amp;quot;userTag_8&amp;quot;,&lt;br /&gt;
                  },&lt;br /&gt;
                  // sortKeyValueUserTags: {&lt;br /&gt;
                  //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
                  // },&lt;br /&gt;
                  // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  conditionalFieldValues: [&lt;br /&gt;
                    {&lt;br /&gt;
                      fieldname: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                      includeValueUserTags: [&amp;quot;userTag_2&amp;quot;], // &lt;br /&gt;
                      // excludeValueUserTags: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
                    }&lt;br /&gt;
                   ]&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
          aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
          sortFields: [&lt;br /&gt;
       			{&lt;br /&gt;
            		requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		            dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
                    sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
        		},&lt;br /&gt;
				{&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
                     sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
		         },&lt;br /&gt;
                {&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
                     sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;],&lt;br /&gt;
                     sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
		        }&lt;br /&gt;
            ],&lt;br /&gt;
          comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
          comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
          comparisonSortDataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
          comparisonValue: &amp;quot;userTag_2&amp;quot;,&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
             sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
		{&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
             sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		     dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
             sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;],&lt;br /&gt;
             sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
    ],&lt;br /&gt;
	valueUserTags: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueSource: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4077</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4077"/>
		<updated>2026-02-05T06:37:39Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as params sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
	// header/footer filterDataField elements reference valueUserTag&lt;br /&gt;
&lt;br /&gt;
	&amp;quot;elements&amp;quot;: {&lt;br /&gt;
		// shared types&lt;br /&gt;
		&amp;quot;elementId12&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;freetext&amp;quot;,&lt;br /&gt;
			&amp;quot;value&amp;quot;: &amp;quot;aa&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// headerFooter types&lt;br /&gt;
		&amp;quot;elementId1&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;valueUserTag&amp;quot;: &amp;quot;userTag_9&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot; // || &amp;quot;select&amp;quot; || &amp;quot;checkbox&amp;quot; || &amp;quot;radio&amp;quot; ,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId2&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;select&amp;quot;,&lt;br /&gt;
			&amp;quot;options&amp;quot;: [&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option1&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
              },&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option2&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
			],&lt;br /&gt;
		},&lt;br /&gt;
        &amp;quot;elementId21&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;checkbox&amp;quot;,&lt;br /&gt;
			&amp;quot;onSetting:{&lt;br /&gt;
               optionText:&amp;quot;on&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
             &amp;quot;offSetting&amp;quot;:{&lt;br /&gt;
               optionText:&amp;quot;off&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
		   &lt;br /&gt;
           &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId3&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;sort&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;downArrow&amp;quot;, // || upArrow&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
			&amp;quot;dataType&amp;quot;: &amp;quot;number&amp;quot;, // &amp;quot;number&amp;quot; | &amp;quot;string&amp;quot;&lt;br /&gt;
			&amp;quot;sortOrder&amp;quot;: &amp;quot;ascending&amp;quot; // &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot; (default ascending)&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId4&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;numberOfRows&amp;quot;,&lt;br /&gt;
			&amp;quot;selection&amp;quot;: &amp;quot;input&amp;quot; // || list&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId6&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;submit&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;submit&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: &amp;quot;all&amp;quot; // numberOfRows || all || filters&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId7&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;reset&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;reset rows&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: &amp;quot;numberOfRows&amp;quot; // numberOfRows || all || filters&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId9&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;totalDatafield&amp;quot;,&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
			&amp;quot;showIfNotAllRowsLoaded&amp;quot;: true // || false&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId11&amp;quot;:{&lt;br /&gt;
			// will need to link to per record check box&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkAction&amp;quot;,&lt;br /&gt;
			&amp;quot;action&amp;quot;: &amp;quot;on&amp;quot; // on | off | switch&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;, // have normalized list of bulkActionTags, with list of &amp;quot;bulkAction&amp;quot; and &amp;quot;bulkActionCheckBox&amp;quot; elements linked to it&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId8&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;pageNumbers&amp;quot;,&lt;br /&gt;
			&amp;quot;linksAfter&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToLastPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenLastPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;gt;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;linksBefore&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToFirstPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenFirstPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;showPagesAfter&amp;quot;: 3,&lt;br /&gt;
			&amp;quot;showPagesBefore&amp;quot;: 3&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		// records types    &lt;br /&gt;
		&amp;quot;elementId5&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;requiredDataLinkStepObject&amp;quot;, // in record&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementIdxx&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkActionCheckBox&amp;quot;,&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
            valueSource: 'perParentIdentifier',&lt;br /&gt;
            perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	bulkActionUserTags: {&lt;br /&gt;
		tagA:{&lt;br /&gt;
			bulkActions: [&lt;br /&gt;
                &amp;quot;elementId11&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
            bulkActionCheckBoxes: [&lt;br /&gt;
                &amp;quot;elementIdxx&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
		},&lt;br /&gt;
        // ...&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
          partitionKeyValueUserTags: {&lt;br /&gt;
            productId: &amp;quot;userTag_1&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
          // sortKeyValueUserTags: {&lt;br /&gt;
          //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
          // },&lt;br /&gt;
          // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
          // conditionalFieldValues: [&lt;br /&gt;
          //  {&lt;br /&gt;
          //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
          //   include: [&amp;quot;th&amp;quot;],&lt;br /&gt;
          //    // exclude: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
          //  }&lt;br /&gt;
          // ]&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
        // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
	],&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
                partitionKeyValueUserTags: {&lt;br /&gt;
                   locationNodeId: &amp;quot;userTag_7&amp;quot;,&lt;br /&gt;
                },&lt;br /&gt;
                // sortKeyValueUserTags: {&lt;br /&gt;
                //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
                // },&lt;br /&gt;
                // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                // conditionalFieldValues: [&lt;br /&gt;
                //  {&lt;br /&gt;
                //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
                //   include: [&amp;quot;th&amp;quot;],&lt;br /&gt;
                //    // exclude: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
                //  }&lt;br /&gt;
                // ]&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
               partitionKeyValueUserTags: {&lt;br /&gt;
                   sellOfferId: &amp;quot;userTag_8&amp;quot;,&lt;br /&gt;
               },&lt;br /&gt;
               // sortKeyValueUserTags: {&lt;br /&gt;
               //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
               // },&lt;br /&gt;
               // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               // conditionalFieldValues: [&lt;br /&gt;
               //  {&lt;br /&gt;
               //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
               //   include: [&amp;quot;th&amp;quot;],&lt;br /&gt;
               //    // exclude: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
               //  }&lt;br /&gt;
               // ]&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
        // userTag_LinkStepObjectC&lt;br /&gt;
        // userTag_LinkStepObjectD&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
           addFilterMain: true, //default: false =&amp;gt; need to add filterMain set = true&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  partitionKeyValueUserTags: {&lt;br /&gt;
                     sellOfferId: &amp;quot;userTag_8&amp;quot;,&lt;br /&gt;
                  },&lt;br /&gt;
                  // sortKeyValueUserTags: {&lt;br /&gt;
                  //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
                  // },&lt;br /&gt;
                  // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  conditionalFieldValues: [&lt;br /&gt;
                    {&lt;br /&gt;
                      fieldname: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                      include: [&amp;quot;userTag_2&amp;quot;], // or include: [&amp;quot;praewDev&amp;quot;],&lt;br /&gt;
                      // exclude: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
                    }&lt;br /&gt;
                   ]&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
          aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
          sortFields: [&lt;br /&gt;
       			{&lt;br /&gt;
            		requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		            dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
                    sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
        		},&lt;br /&gt;
				{&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
                     sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
		         },&lt;br /&gt;
                {&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
                     sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;],&lt;br /&gt;
                     sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
		        }&lt;br /&gt;
            ],&lt;br /&gt;
          comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
          comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
          comparisonSortDataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
          comparisonValue: &amp;quot;userTag_2&amp;quot;,&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
             sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
		{&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
             sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		     dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
             sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;],&lt;br /&gt;
             sortOrder: &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
    ],&lt;br /&gt;
	valueUserTags: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueSource: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4076</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=4076"/>
		<updated>2026-02-05T06:33:51Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as params sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
	// header/footer filterDataField elements reference valueUserTag&lt;br /&gt;
&lt;br /&gt;
	&amp;quot;elements&amp;quot;: {&lt;br /&gt;
		// shared types&lt;br /&gt;
		&amp;quot;elementId12&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;freetext&amp;quot;,&lt;br /&gt;
			&amp;quot;value&amp;quot;: &amp;quot;aa&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// headerFooter types&lt;br /&gt;
		&amp;quot;elementId1&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;valueUserTag&amp;quot;: &amp;quot;userTag_9&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot; // || &amp;quot;select&amp;quot; || &amp;quot;checkbox&amp;quot; || &amp;quot;radio&amp;quot; ,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId2&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;select&amp;quot;,&lt;br /&gt;
			&amp;quot;options&amp;quot;: [&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option1&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
              },&lt;br /&gt;
	         {&lt;br /&gt;
               optionText:&amp;quot;option2&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
			],&lt;br /&gt;
		},&lt;br /&gt;
        &amp;quot;elementId21&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;checkbox&amp;quot;,&lt;br /&gt;
			&amp;quot;onSetting:{&lt;br /&gt;
               optionText:&amp;quot;on&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_1:&amp;quot;valueA&amp;quot;, //value not ref valueUserTag&lt;br /&gt;
                 userTag_2:&amp;quot;valueB&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
             &amp;quot;offSetting&amp;quot;:{&lt;br /&gt;
               optionText:&amp;quot;off&amp;quot;,&lt;br /&gt;
               valueUserTag:{ &lt;br /&gt;
                 userTag_9:&amp;quot;valueC&amp;quot; &lt;br /&gt;
&lt;br /&gt;
              },&lt;br /&gt;
             },&lt;br /&gt;
		   &lt;br /&gt;
           &lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId3&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;sort&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;downArrow&amp;quot;, // || upArrow&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
			&amp;quot;dataType&amp;quot;: &amp;quot;number&amp;quot;, // &amp;quot;number&amp;quot; | &amp;quot;string&amp;quot;&lt;br /&gt;
			&amp;quot;sortOrder&amp;quot;: &amp;quot;ascending&amp;quot; // &amp;quot;ascending&amp;quot;|&amp;quot;descending&amp;quot; (default ascending)&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId4&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;numberOfRows&amp;quot;,&lt;br /&gt;
			&amp;quot;selection&amp;quot;: &amp;quot;input&amp;quot; // || list&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId6&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;submit&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;submit&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: &amp;quot;all&amp;quot; // numberOfRows || all || filters&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId7&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;reset&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;reset rows&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: &amp;quot;numberOfRows&amp;quot; // numberOfRows || all || filters&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId9&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;totalDatafield&amp;quot;,&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
			&amp;quot;showIfNotAllRowsLoaded&amp;quot;: true // || false&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId11&amp;quot;:{&lt;br /&gt;
			// will need to link to per record check box&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkAction&amp;quot;,&lt;br /&gt;
			&amp;quot;action&amp;quot;: &amp;quot;on&amp;quot; // on | off | switch&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;, // have normalized list of bulkActionTags, with list of &amp;quot;bulkAction&amp;quot; and &amp;quot;bulkActionCheckBox&amp;quot; elements linked to it&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId8&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;pageNumbers&amp;quot;,&lt;br /&gt;
			&amp;quot;linksAfter&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToLastPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenLastPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;gt;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;linksBefore&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToFirstPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenFirstPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;showPagesAfter&amp;quot;: 3,&lt;br /&gt;
			&amp;quot;showPagesBefore&amp;quot;: 3&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		// records types    &lt;br /&gt;
		&amp;quot;elementId5&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;requiredDataLinkStepObject&amp;quot;, // in record&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementIdxx&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkActionCheckBox&amp;quot;,&lt;br /&gt;
			&amp;quot;bulkActionUserTag&amp;quot;: &amp;quot;tagA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
            valueSource: 'perParentIdentifier',&lt;br /&gt;
            perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	bulkActionUserTags: {&lt;br /&gt;
		tagA:{&lt;br /&gt;
			bulkActions: [&lt;br /&gt;
                &amp;quot;elementId11&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
            bulkActionCheckBoxes: [&lt;br /&gt;
                &amp;quot;elementIdxx&amp;quot;,&lt;br /&gt;
                // ...&lt;br /&gt;
            ],&lt;br /&gt;
		},&lt;br /&gt;
        // ...&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
          partitionKeyValueUserTags: {&lt;br /&gt;
            productId: &amp;quot;userTag_1&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
          // sortKeyValueUserTags: {&lt;br /&gt;
          //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
          // },&lt;br /&gt;
          // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
          // conditionalFieldValues: [&lt;br /&gt;
          //  {&lt;br /&gt;
          //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
          //   include: [&amp;quot;th&amp;quot;],&lt;br /&gt;
          //    // exclude: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
          //  }&lt;br /&gt;
          // ]&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
        // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
	],&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
                partitionKeyValueUserTags: {&lt;br /&gt;
                   locationNodeId: &amp;quot;userTag_7&amp;quot;,&lt;br /&gt;
                },&lt;br /&gt;
                // sortKeyValueUserTags: {&lt;br /&gt;
                //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
                // },&lt;br /&gt;
                // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                // conditionalFieldValues: [&lt;br /&gt;
                //  {&lt;br /&gt;
                //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
                //   include: [&amp;quot;th&amp;quot;],&lt;br /&gt;
                //    // exclude: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
                //  }&lt;br /&gt;
                // ]&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
               partitionKeyValueUserTags: {&lt;br /&gt;
                   sellOfferId: &amp;quot;userTag_8&amp;quot;,&lt;br /&gt;
               },&lt;br /&gt;
               // sortKeyValueUserTags: {&lt;br /&gt;
               //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
               // },&lt;br /&gt;
               // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               // conditionalFieldValues: [&lt;br /&gt;
               //  {&lt;br /&gt;
               //    fieldname: &amp;quot;language&amp;quot;,&lt;br /&gt;
               //   include: [&amp;quot;th&amp;quot;],&lt;br /&gt;
               //    // exclude: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
               //  }&lt;br /&gt;
               // ]&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
        // userTag_LinkStepObjectC&lt;br /&gt;
        // userTag_LinkStepObjectD&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
           addFilterMain: true, //default: false =&amp;gt; need to add filterMain set = true&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  partitionKeyValueUserTags: {&lt;br /&gt;
                     sellOfferId: &amp;quot;userTag_8&amp;quot;,&lt;br /&gt;
                  },&lt;br /&gt;
                  // sortKeyValueUserTags: {&lt;br /&gt;
                  //    productId: &amp;quot;valueB&amp;quot;,&lt;br /&gt;
                  // },&lt;br /&gt;
                  // comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  conditionalFieldValues: [&lt;br /&gt;
                    {&lt;br /&gt;
                      fieldname: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                      include: [&amp;quot;userTag_2&amp;quot;], // or include: [&amp;quot;praewDev&amp;quot;],&lt;br /&gt;
                      // exclude: [&amp;quot;xx&amp;quot;,&amp;quot;sdd&amp;quot;]&lt;br /&gt;
                    }&lt;br /&gt;
                   ]&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
          aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
          sortFields: [&lt;br /&gt;
       			{&lt;br /&gt;
            		requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		            dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        		},&lt;br /&gt;
				{&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
		         },&lt;br /&gt;
&lt;br /&gt;
                {&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
                     sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;]&lt;br /&gt;
		        }&lt;br /&gt;
            ],&lt;br /&gt;
          comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
          comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
          comparisonSortDataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
          comparisonValue: &amp;quot;userTag_2&amp;quot;,&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
             sortOrder: &amp;quot;descending&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
		{&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		     dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
             sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;]&lt;br /&gt;
		}&lt;br /&gt;
    ],&lt;br /&gt;
	valueUserTags: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueSource: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3997</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3997"/>
		<updated>2026-01-19T01:59:08Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as params sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
	// header/footer filterDataField elements reference valueUserTag&lt;br /&gt;
&lt;br /&gt;
	&amp;quot;elements&amp;quot;: {&lt;br /&gt;
		// shared types&lt;br /&gt;
		&amp;quot;elementId12&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;freetext&amp;quot;,&lt;br /&gt;
			&amp;quot;value&amp;quot;: &amp;quot;aa&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// headerFooter types&lt;br /&gt;
		&amp;quot;elementId1&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;valueUserTag&amp;quot;: &amp;quot;userTag_9&amp;quot;,&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot; // || &amp;quot;select&amp;quot; || &amp;quot;checkbox&amp;quot; || &amp;quot;radio&amp;quot; ,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId2&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;valueUserTag&amp;quot;,&lt;br /&gt;
			&amp;quot;valueUserTag&amp;quot;: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
			&amp;quot;inputType&amp;quot;: &amp;quot;select&amp;quot;,&lt;br /&gt;
			&amp;quot;options&amp;quot;: [&lt;br /&gt;
				&amp;quot;x&amp;quot;,&lt;br /&gt;
				&amp;quot;y&amp;quot;,&lt;br /&gt;
				&amp;quot;z&amp;quot;&lt;br /&gt;
			]&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId3&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;sort&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;downArrow&amp;quot;, // || upArrow&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
			&amp;quot;dataType&amp;quot;: &amp;quot;number&amp;quot;&lt;br /&gt;
			// probably add ascending/descending&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId4&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;numberOfRows&amp;quot;,&lt;br /&gt;
			&amp;quot;selection&amp;quot;: &amp;quot;input&amp;quot; // || list&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId6&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;submit&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;submit&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: &amp;quot;all&amp;quot; // numberOfRows || all || filters&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId7&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;reset&amp;quot;,&lt;br /&gt;
			&amp;quot;display&amp;quot;: &amp;quot;reset rows&amp;quot;, // any text to be shown&lt;br /&gt;
			&amp;quot;sendRequest&amp;quot;: &amp;quot;numberOfRows&amp;quot; // numberOfRows || all || filters&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId9&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;totalDatafield&amp;quot;,&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
			&amp;quot;showIfNotAllRowsLoaded&amp;quot;: true // || false&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId11&amp;quot;:{&lt;br /&gt;
			// will need to link to per record check box&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkAction&amp;quot;,&lt;br /&gt;
			&amp;quot;action&amp;quot;: &amp;quot;on&amp;quot; // on | off | switch&lt;br /&gt;
			&amp;quot;bulkActionTag&amp;quot;: &amp;quot;tagA&amp;quot;, // have normalized list of bulkActionTags, with list of &amp;quot;bulkAction&amp;quot; and &amp;quot;bulkActionCheckBox&amp;quot; elements linked to it&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementId8&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;pageNumbers&amp;quot;,&lt;br /&gt;
			&amp;quot;linksAfter&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToLastPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenLastPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;gt;&amp;gt;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;linksBefore&amp;quot;: [&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;goToFirstPage&amp;quot;,&lt;br /&gt;
					&amp;quot;hideWhenFirstPageShown&amp;quot;: true,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 1,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;&amp;lt;&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					&amp;quot;action&amp;quot;: &amp;quot;jumpNumberOfPages&amp;quot;,&lt;br /&gt;
					&amp;quot;jumpPages&amp;quot;: 7,&lt;br /&gt;
					&amp;quot;string&amp;quot;: &amp;quot;..&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;showPagesAfter&amp;quot;: 3,&lt;br /&gt;
			&amp;quot;showPagesBefore&amp;quot;: 3&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		// records types    &lt;br /&gt;
		&amp;quot;elementId5&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;requiredDataLinkStepObject&amp;quot;, // in record&lt;br /&gt;
			&amp;quot;requiredDataLinkStepObjectId&amp;quot;: &amp;quot;link1&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;elementIdxx&amp;quot;:{&lt;br /&gt;
			&amp;quot;elementType&amp;quot;: &amp;quot;bulkActionCheckBox&amp;quot;,&lt;br /&gt;
			&amp;quot;bulkActionTag&amp;quot;: &amp;quot;tagA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
            valueSource: 'perParentIdentifier',&lt;br /&gt;
            perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         fieldName: &amp;quot;productId&amp;quot;,&lt;br /&gt;
         comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
         valueUserTag: &amp;quot;userTag_1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
        // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
	],&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               fieldName: &amp;quot;locationNodeId&amp;quot;,&lt;br /&gt;
               comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               valueUserTag: &amp;quot;userTag_7&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              fieldName: &amp;quot;sellOfferId&amp;quot;,&lt;br /&gt;
              comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
              valueUserTag: &amp;quot;userTag_8&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
        // userTag_LinkStepObjectC&lt;br /&gt;
        // userTag_LinkStepObjectD&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
           addFilterMain: true, //default: false =&amp;gt; need to add filterMain set = true&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                  comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  valueUserTag: &amp;quot;userTag_2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
          aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
          sortFields: [&lt;br /&gt;
       			{&lt;br /&gt;
            		requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		            dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        		},&lt;br /&gt;
				{&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
		         },&lt;br /&gt;
&lt;br /&gt;
                {&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
                     sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;]&lt;br /&gt;
		        }&lt;br /&gt;
            ],&lt;br /&gt;
          comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
          comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
          comparisonSortDataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
          comparisonValue: &amp;quot;userTag_2&amp;quot;,&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;number&amp;quot;,&lt;br /&gt;
             sortOrder: &amp;quot;descending&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
		{&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		     dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
             sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;]&lt;br /&gt;
		}&lt;br /&gt;
    ],&lt;br /&gt;
	valueUserTags: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueSource: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-17_-_LinkPath_structure_and_examples&amp;diff=3936</id>
		<title>2025-04-17 - LinkPath structure and examples</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-17_-_LinkPath_structure_and_examples&amp;diff=3936"/>
		<updated>2026-01-12T01:01:21Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= requiredData normalize structure =&lt;br /&gt;
* component =&amp;gt; requiredDataObjects , linkPathObjects, linkPathSteps&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  requiredDataObjects: {&lt;br /&gt;
     hash_requiredDataObjectA: { //* normal requiredData&lt;br /&gt;
       fieldName: &amp;quot;fieldname if main objType or last fieldName for linkPath&amp;quot;,&lt;br /&gt;
     },&lt;br /&gt;
     hash_requiredDataObjectB: { //* has LinkPath&lt;br /&gt;
       fieldName: &amp;quot;fieldname if main objType or last fieldName for linkPath&amp;quot;,&lt;br /&gt;
       linkPathObjectId: &amp;quot;hash_linkPathA&amp;quot;,&lt;br /&gt;
       complexFilterCombinationIds: [ //* has applyCombinations&lt;br /&gt;
         &amp;quot;xxxxx&amp;quot;,&lt;br /&gt;
         &amp;quot;xxxxx&amp;quot;&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
  },&lt;br /&gt;
  linkPathObjects: {&lt;br /&gt;
    hash_linkPathA: {&lt;br /&gt;
      initialObjType: {&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      linkSteps: [&lt;br /&gt;
        &amp;quot;hash_linkStepB_1&amp;quot;,&lt;br /&gt;
        &amp;quot;hash_linkStepB_2&amp;quot;&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  linkPathSteps: {&lt;br /&gt;
    hash_linkStepB_1: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         relType: {&lt;br /&gt;
           serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
           relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         direction: &amp;quot;from&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      //------ conditions by link ------// : optional&lt;br /&gt;
      filterElementId: &amp;quot;ref_filterMainIdA&amp;quot;,&lt;br /&gt;
      aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
      sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
          dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
    },&lt;br /&gt;
    hash_linkStepB_2: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         relType: {&lt;br /&gt;
           serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
           relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         direction: &amp;quot;from&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      //------ conditions by link ------//&lt;br /&gt;
      filterElementId: &amp;quot;ref_filterMainIdA&amp;quot;,&lt;br /&gt;
      aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
      sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
          dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      requiredDataObjects: [ //* for use to create linkPath in linkPath&lt;br /&gt;
        {&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
      combine: &amp;quot;true&amp;quot;,&lt;br /&gt;
      comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
      comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
      comparisonSortDataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
      comparisonValue: &amp;quot;50&amp;quot;,&lt;br /&gt;
      requestProperties: {&lt;br /&gt;
        tag_xxxx: &amp;quot;value&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      perParentCombinationIds: [&lt;br /&gt;
        {&lt;br /&gt;
          tag: &amp;quot;tag_xxxxx&amp;quot;,&lt;br /&gt;
          filterMainId: &amp;quot;xxxxx&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      applyCombinations: [&lt;br /&gt;
        {&lt;br /&gt;
          tag: &amp;quot;tag_xxxxx&amp;quot;,&lt;br /&gt;
          filterMainId: &amp;quot;xxxxx&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ProcessSearchResultMessage ==&lt;br /&gt;
* Fetch and Sort Product Sizes by Language with Fallback&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Need to fetch all sizes, sorted by language order 'en', 'th'.&lt;br /&gt;
If a translation is missing for any language in sortArray: ['en', 'th'],&lt;br /&gt;
fallback to the defaultTranslationLink of that productAttribute.&lt;br /&gt;
ProductAttributeLabel with labelId = 'Id_X' represents a size.&lt;br /&gt;
identifiersIdArray contains all productAttributeIds linked to ProductAttributeLabel where labelId='Id_X'.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let processSearchResultMessage = {&lt;br /&gt;
  objType: {&lt;br /&gt;
    serviceTag: 'ProductAttribute',&lt;br /&gt;
    objectType: 'productAttribute'&lt;br /&gt;
  },&lt;br /&gt;
  requiredData: [&lt;br /&gt;
    {&lt;br /&gt;
      fieldName: 'text', //all sizes by languageId, where text is the identifiers of the translation objectType, which is the final link step of this requiredData&lt;br /&gt;
      linkPath: [&lt;br /&gt;
        {&lt;br /&gt;
          link: {&lt;br /&gt;
            relType: {&lt;br /&gt;
              serviceTag: 'Translations',&lt;br /&gt;
              relationshipTag: 'hasTranslationLink'&lt;br /&gt;
              // Must use hasTranslationLink because it will be automatically added by inserting a filterElement with logicalType: &amp;quot;translateIds&amp;quot;&lt;br /&gt;
              // where identifiers come from identifiersIdArray (Process-ComplexFilter), along with a filterElement of type: &amp;quot;logicalOperator&amp;quot; and operator: &amp;quot;and&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            objType: {&lt;br /&gt;
              serviceTag: 'Translations',&lt;br /&gt;
              objectType: 'translationLink'&lt;br /&gt;
            },&lt;br /&gt;
            direction: 'from'&lt;br /&gt;
          },&lt;br /&gt;
          aggregate: 'min',   //if 'min' sorts languages in order 'en', 'th', //if max sorts languages in order 'th', 'en&lt;br /&gt;
          sortFields: {&lt;br /&gt;
            fieldName: 'languageId',&lt;br /&gt;
            dataType: 'array',&lt;br /&gt;
            sortArray: ['en', 'th']  // sorts languages according to sortArray&lt;br /&gt;
          },&lt;br /&gt;
          filterElements: [&lt;br /&gt;
            {&lt;br /&gt;
              type: 'group',&lt;br /&gt;
              elements: [&lt;br /&gt;
                {&lt;br /&gt;
                  type: 'traversal',&lt;br /&gt;
                  traversals: [&lt;br /&gt;
                    {&lt;br /&gt;
                      fields: {&lt;br /&gt;
                        languageId: { anyValue: ['en', 'th'] },&lt;br /&gt;
                        textTag: 'productAttributeValue'&lt;br /&gt;
                      },&lt;br /&gt;
                      link: {&lt;br /&gt;
                        relationshipDirection: 'from',&lt;br /&gt;
                        relType: {&lt;br /&gt;
                          serviceTag: 'Translations',&lt;br /&gt;
                          relationshipTag: 'currentTranslationLink'&lt;br /&gt;
                        }&lt;br /&gt;
                      }&lt;br /&gt;
                    },&lt;br /&gt;
                    {&lt;br /&gt;
                      objType: {&lt;br /&gt;
                        serviceTag: 'ProductAttribute',&lt;br /&gt;
                        objectType: 'productAttribute'&lt;br /&gt;
                      }&lt;br /&gt;
                    }&lt;br /&gt;
                  ]&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                  type: 'logicalOperator', operator: 'or'&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                  type: 'traversal',&lt;br /&gt;
                  traversals: [&lt;br /&gt;
                    {&lt;br /&gt;
                      fields: {&lt;br /&gt;
                        textTag: 'productAttributeValue'&lt;br /&gt;
                      },&lt;br /&gt;
                      link: {&lt;br /&gt;
                        relationshipDirection: 'from',&lt;br /&gt;
                        relType: {&lt;br /&gt;
                          serviceTag: 'Translations',&lt;br /&gt;
                          relationshipTag: 'defaultTranslationLink'&lt;br /&gt;
                        }&lt;br /&gt;
                      }&lt;br /&gt;
                    },&lt;br /&gt;
                    {&lt;br /&gt;
                      objType: {&lt;br /&gt;
                        serviceTag: 'ProductAttribute',&lt;br /&gt;
                        objectType: 'productAttribute'&lt;br /&gt;
                      }&lt;br /&gt;
                    }&lt;br /&gt;
                  ]&lt;br /&gt;
                }&lt;br /&gt;
              ]&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          link: {&lt;br /&gt;
            relType: {&lt;br /&gt;
              serviceTag: 'Translations',&lt;br /&gt;
              relationshipTag: 'isTranslation'&lt;br /&gt;
            },&lt;br /&gt;
            objType: {&lt;br /&gt;
              serviceTag: 'Translations',&lt;br /&gt;
              objectType: 'translation'&lt;br /&gt;
            },&lt;br /&gt;
            direction: 'from'&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  filter: {&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: 'ProductAttribute',&lt;br /&gt;
      objectType: 'productAttribute'&lt;br /&gt;
    },&lt;br /&gt;
    elements: [&lt;br /&gt;
      {&lt;br /&gt;
        type: 'complexFilter',&lt;br /&gt;
        complexFilter: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: 'ProductAttribute',&lt;br /&gt;
            objectType: 'ProductAttributeLabel'&lt;br /&gt;
          },&lt;br /&gt;
          relType: {&lt;br /&gt;
            serviceTag: 'ProductAttribute',&lt;br /&gt;
            relationshipTag: 'isProductAttributeLabel'&lt;br /&gt;
          },&lt;br /&gt;
          direction: 'from',&lt;br /&gt;
          elements: [&lt;br /&gt;
            {&lt;br /&gt;
              type: 'logical',&lt;br /&gt;
              fieldName: 'labelId',&lt;br /&gt;
              comparison: 'equals',&lt;br /&gt;
              value: 'Id_X'&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  requestProperties: {},&lt;br /&gt;
  identifiersIdArray: [&lt;br /&gt;
    {&lt;br /&gt;
      identifiersId: 'hashOfIdentifiersObject_1',&lt;br /&gt;
      identifiers: {&lt;br /&gt;
        productAttributeId: 'productAttributeId_uuid_1'&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      identifiersId: 'hashOfIdentifiersObject_2',&lt;br /&gt;
      identifiers: {&lt;br /&gt;
        productAttributeId: 'productAttributeId_uuid_2'&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      identifiersId: 'hashOfIdentifiersObject_3',&lt;br /&gt;
      identifiers: {&lt;br /&gt;
        productAttributeId: 'productAttributeId_uuid_3'&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== example search and sort request ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;objType&amp;quot;:{&lt;br /&gt;
      &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
      &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;searchResultId&amp;quot;:&amp;quot;8e5fecd40a27e47f89cd2743916c0044f0f69bc6&amp;quot;,&lt;br /&gt;
   &amp;quot;searchDetailId&amp;quot;:&amp;quot;3462d3248d3af9406554f1c218b63442d26ac2e5&amp;quot;,&lt;br /&gt;
   &amp;quot;requiredDataObjects&amp;quot;:{&lt;br /&gt;
      &amp;quot;4c8e7879d26e6fa7ab85ded25a79a541754c5a3c&amp;quot;:{&lt;br /&gt;
         &amp;quot;fieldName&amp;quot;:&amp;quot;productId&amp;quot;,&lt;br /&gt;
         &amp;quot;linkPathObjectId&amp;quot;:&amp;quot;1a8a3f9c2c3ea5eaad1f42385362de5dd11cde8a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;c799f11507529f0fb6fa712568596d24b6507d40&amp;quot;:{&lt;br /&gt;
         &amp;quot;fieldName&amp;quot;:&amp;quot;sellOfferHandlerServiceTag&amp;quot;,&lt;br /&gt;
         &amp;quot;linkPathObjectId&amp;quot;:&amp;quot;5909f82f27bd6c1f921e95b88a65b6e4727a6532&amp;quot;,&lt;br /&gt;
         &amp;quot;complexFilterCombinationIds&amp;quot;:[&lt;br /&gt;
            &amp;quot;88d9c5b9ab36d8c3ebf17e8322541b9c64cae25b&amp;quot;,&lt;br /&gt;
            &amp;quot;51509dea0a7ba2746dbd24769b8e777f1411f3ff&amp;quot;,&lt;br /&gt;
            &amp;quot;d7a7f875254e856b4205075826631ec042b4c821&amp;quot;,&lt;br /&gt;
            &amp;quot;b96447ae98c95858694ca5ec407750c559825930&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;searchParams&amp;quot;:{&lt;br /&gt;
      &amp;quot;filterObjectId&amp;quot;:&amp;quot;8e5fecd40a27e47f89cd2743916c0044f0f69bc6&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;filterElements&amp;quot;:{&lt;br /&gt;
      &amp;quot;8e5fecd40a27e47f89cd2743916c0044f0f69bc6&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;sellOfferId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;equals&amp;quot;,&lt;br /&gt;
            &amp;quot;value&amp;quot;:&amp;quot;sellOfferId_001&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;d92ca4f68dc0d474cfdc10a6c702a5c7224a822c&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;rateTable&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;rateTableId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;highLow&amp;quot;,&lt;br /&gt;
            &amp;quot;valueType&amp;quot;:&amp;quot;perParentIdentifier&amp;quot;,&lt;br /&gt;
            &amp;quot;perParentIdentifierFieldname&amp;quot;:&amp;quot;sellOfferId&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;cd378bc32fbc9a46929c9a9d590e7d77243a839c&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;rateTable&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;rateTableId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;lessThanEquals&amp;quot;,&lt;br /&gt;
            &amp;quot;value&amp;quot;:&amp;quot;cccc&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;0c287df25d6ff203be7cc9faa2390f6ab0df3878&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;rateTable&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;operation&amp;quot;,&lt;br /&gt;
            &amp;quot;filterElementLeft&amp;quot;:&amp;quot;d92ca4f68dc0d474cfdc10a6c702a5c7224a822c&amp;quot;,&lt;br /&gt;
            &amp;quot;filterElementRight&amp;quot;:&amp;quot;cd378bc32fbc9a46929c9a9d590e7d77243a839c&amp;quot;,&lt;br /&gt;
            &amp;quot;operator&amp;quot;:&amp;quot;AND&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;e0b8534452e98796f144c83a221764ef32db5ab6&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;Locations&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;locationNode&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
            &amp;quot;childFilterElementId&amp;quot;:&amp;quot;0c287df25d6ff203be7cc9faa2390f6ab0df3878&amp;quot;,&lt;br /&gt;
            &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
               &amp;quot;relType&amp;quot;:{&lt;br /&gt;
                  &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
                  &amp;quot;relationshipTag&amp;quot;:&amp;quot;disabledDeliversTolocationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               &amp;quot;objType&amp;quot;:{&lt;br /&gt;
                  &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
                  &amp;quot;objectType&amp;quot;:&amp;quot;rateTable&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               &amp;quot;direction&amp;quot;:&amp;quot;to&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;requestProperties&amp;quot;:{}&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;88d9c5b9ab36d8c3ebf17e8322541b9c64cae25b&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;currencyId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;lessThan&amp;quot;,&lt;br /&gt;
            &amp;quot;value&amp;quot;:&amp;quot;bbbb&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;51509dea0a7ba2746dbd24769b8e777f1411f3ff&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOfferPlanUserPaymentMethodLink&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;sellOfferPlanUserPaymentMethodLinkId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;lessThan&amp;quot;,&lt;br /&gt;
            &amp;quot;value&amp;quot;:&amp;quot;bbbb&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;a5491ba3deb74e523741c8cfeb845f49db444a9c&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;Locations&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;locationNode&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;locationNodeId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;lessThan&amp;quot;,&lt;br /&gt;
            &amp;quot;value&amp;quot;:&amp;quot;cccc&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;7820aef170ae6c3e723382d6bc81d7b12a674974&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;rateTable&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;rateTableId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;highLow&amp;quot;,&lt;br /&gt;
            &amp;quot;value&amp;quot;:&amp;quot;aaaa&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;554fc368ec36c13a93e3c71c8081951060965bb2&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;Locations&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;locationNode&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
            &amp;quot;childFilterElementId&amp;quot;:&amp;quot;7820aef170ae6c3e723382d6bc81d7b12a674974&amp;quot;,&lt;br /&gt;
            &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
               &amp;quot;relType&amp;quot;:{&lt;br /&gt;
                  &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
                  &amp;quot;relationshipTag&amp;quot;:&amp;quot;deliversToLocationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               &amp;quot;objType&amp;quot;:{&lt;br /&gt;
                  &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
                  &amp;quot;objectType&amp;quot;:&amp;quot;rateTable&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               &amp;quot;direction&amp;quot;:&amp;quot;to&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;requestProperties&amp;quot;:{}&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;d7a7f875254e856b4205075826631ec042b4c821&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;Locations&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;locationNode&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;operation&amp;quot;,&lt;br /&gt;
            &amp;quot;filterElementLeft&amp;quot;:&amp;quot;a5491ba3deb74e523741c8cfeb845f49db444a9c&amp;quot;,&lt;br /&gt;
            &amp;quot;filterElementRight&amp;quot;:&amp;quot;554fc368ec36c13a93e3c71c8081951060965bb2&amp;quot;,&lt;br /&gt;
            &amp;quot;operator&amp;quot;:&amp;quot;OR&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;b96447ae98c95858694ca5ec407750c559825930&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOfferPlanUserPaymentMethodLink&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;operation&amp;quot;,&lt;br /&gt;
            &amp;quot;filterElementLeft&amp;quot;:&amp;quot;5faa4000cfb72e7aa28603a7740c212f6d6db5e0&amp;quot;,&lt;br /&gt;
            &amp;quot;filterElementRight&amp;quot;:&amp;quot;a1aa8d2907f8b6f24e7b66116129838e978bcaee&amp;quot;,&lt;br /&gt;
            &amp;quot;operator&amp;quot;:&amp;quot;OR&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;linkPathObjects&amp;quot;:{&lt;br /&gt;
      &amp;quot;1a8a3f9c2c3ea5eaad1f42385362de5dd11cde8a&amp;quot;:{&lt;br /&gt;
         &amp;quot;initialObjType&amp;quot;:{&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;linkSteps&amp;quot;:[&lt;br /&gt;
            &amp;quot;fa9a637eb09df71d939b3d914eb9ee27ae83048e&amp;quot;,&lt;br /&gt;
            &amp;quot;d3e2d36cab6d9441db10a7c983834cf9196398b3&amp;quot;,&lt;br /&gt;
            &amp;quot;fa9a637eb09df71d939b3d914eb9ee27ae83048e&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;2794814ec253fc93496bfcb50ea18ebfe640bf4d&amp;quot;:{&lt;br /&gt;
         &amp;quot;initialObjType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;linkSteps&amp;quot;:[&lt;br /&gt;
            &amp;quot;fa9a637eb09df71d939b3d914eb9ee27ae83048e&amp;quot;,&lt;br /&gt;
            &amp;quot;11704ae9a828b4709300964e2e0361bad13db5c3&amp;quot;,&lt;br /&gt;
            &amp;quot;964050f23f92b45a1ea573a573c50ae3ca2bae18&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;5909f82f27bd6c1f921e95b88a65b6e4727a6532&amp;quot;:{&lt;br /&gt;
         &amp;quot;initialObjType&amp;quot;:{&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;linkSteps&amp;quot;:[&lt;br /&gt;
            &amp;quot;fa9a637eb09df71d939b3d914eb9ee27ae83048e&amp;quot;,&lt;br /&gt;
            &amp;quot;634dd9295fcb1834de0a6ed1f1ab8a9fa06c4d7f&amp;quot;,&lt;br /&gt;
            &amp;quot;d3fc84fa4444406cef2de49baf53d38ab86cd2e0&amp;quot;,&lt;br /&gt;
            &amp;quot;2b0537fa34ee1d259488fce12204dd549e1c98a3&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;linkPathSteps&amp;quot;:{&lt;br /&gt;
      &amp;quot;fa9a637eb09df71d939b3d914eb9ee27ae83048e&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;product&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;to&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;d3e2d36cab6d9441db10a7c983834cf9196398b3&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;from&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;comparison&amp;quot;:&amp;quot;lessThan&amp;quot;,&lt;br /&gt;
         &amp;quot;comparisonSortField&amp;quot;:&amp;quot;productId&amp;quot;,&lt;br /&gt;
         &amp;quot;comparisonSortDataType&amp;quot;:&amp;quot;string&amp;quot;,&lt;br /&gt;
         &amp;quot;comparisonValue&amp;quot;:&amp;quot;eeee&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;634dd9295fcb1834de0a6ed1f1ab8a9fa06c4d7f&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;from&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;aggregate&amp;quot;:&amp;quot;min&amp;quot;,&lt;br /&gt;
         &amp;quot;sortFields&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;fieldName&amp;quot;:&amp;quot;SellOfferManager_CalCombinedPricingUniqueRequestId&amp;quot;,&lt;br /&gt;
               &amp;quot;dataType&amp;quot;:&amp;quot;string&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;requiredDataObjects&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;fieldName&amp;quot;:&amp;quot;SellOfferManager_CalCombinedPricingUniqueRequestId&amp;quot;,&lt;br /&gt;
               &amp;quot;linkPathObjectId&amp;quot;:&amp;quot;2794814ec253fc93496bfcb50ea18ebfe640bf4d&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;d3fc84fa4444406cef2de49baf53d38ab86cd2e0&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;orderPrice&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;from&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;requestProperties&amp;quot;:{&lt;br /&gt;
            &amp;quot;tag_sellOfferPlan&amp;quot;:&amp;quot;bbbb&amp;quot;,&lt;br /&gt;
            &amp;quot;tag_sellOfferPlanDeliveryMethodLink&amp;quot;:&amp;quot;bbbb&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;perParentCombinationIds&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;tag&amp;quot;:&amp;quot;tag_deliverTo&amp;quot;,&lt;br /&gt;
               &amp;quot;filterMainId&amp;quot;:&amp;quot;e0b8534452e98796f144c83a221764ef32db5ab6&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;applyCombinations&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;tag&amp;quot;:&amp;quot;tag_sellOfferPlanUserPaymentMethodLink&amp;quot;,&lt;br /&gt;
               &amp;quot;filterMainId&amp;quot;:&amp;quot;51509dea0a7ba2746dbd24769b8e777f1411f3ff&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;2b0537fa34ee1d259488fce12204dd549e1c98a3&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;to&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;requestProperties&amp;quot;:{&lt;br /&gt;
            &amp;quot;tag_deliverTo&amp;quot;:&amp;quot;aaaa&amp;quot;,&lt;br /&gt;
            &amp;quot;tag_sellOfferPlanDeliveryMethodLink&amp;quot;:&amp;quot;bbbb&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;applyCombinations&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;tag&amp;quot;:&amp;quot;tag_sellOfferPlan&amp;quot;,&lt;br /&gt;
               &amp;quot;filterMainId&amp;quot;:&amp;quot;88d9c5b9ab36d8c3ebf17e8322541b9c64cae25b&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;tag&amp;quot;:&amp;quot;tag_sellOfferPlanUserPaymentMethodLink&amp;quot;,&lt;br /&gt;
               &amp;quot;filterMainId&amp;quot;:&amp;quot;51509dea0a7ba2746dbd24769b8e777f1411f3ff&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;11704ae9a828b4709300964e2e0361bad13db5c3&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;from&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;aggregate&amp;quot;:&amp;quot;average&amp;quot;,&lt;br /&gt;
         &amp;quot;sortFields&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;fieldName&amp;quot;:&amp;quot;sellOfferHandlerServiceTag&amp;quot;,&lt;br /&gt;
               &amp;quot;dataType&amp;quot;:&amp;quot;string&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;requiredDataObjects&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;fieldName&amp;quot;:&amp;quot;sellOfferHandlerServiceTag&amp;quot;,&lt;br /&gt;
               &amp;quot;linkPathObjectId&amp;quot;:&amp;quot;cae7f8604e62fd4ac09146f5bdd512d9db668c70&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;combine&amp;quot;:true&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;964050f23f92b45a1ea573a573c50ae3ca2bae18&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;orderPrice&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;from&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;requestProperties&amp;quot;:{&lt;br /&gt;
            &amp;quot;tag_sellOfferPlan&amp;quot;:&amp;quot;aaaa&amp;quot;,&lt;br /&gt;
            &amp;quot;tag_sellOfferPlanDeliveryMethodLink&amp;quot;:&amp;quot;bbbb&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;applyCombinations&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;tag&amp;quot;:&amp;quot;tag_deliverTo&amp;quot;,&lt;br /&gt;
               &amp;quot;filterMainId&amp;quot;:&amp;quot;d7a7f875254e856b4205075826631ec042b4c821&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;tag&amp;quot;:&amp;quot;tag_sellOfferPlanUserPaymentMethodLink&amp;quot;,&lt;br /&gt;
               &amp;quot;filterMainId&amp;quot;:&amp;quot;b96447ae98c95858694ca5ec407750c559825930&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;comparison&amp;quot;:&amp;quot;highLow&amp;quot;,&lt;br /&gt;
         &amp;quot;comparisonSortField&amp;quot;:&amp;quot;sellOfferHandlerServiceTag&amp;quot;,&lt;br /&gt;
		 &amp;quot;comparisonSortDataType&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
         &amp;quot;comparisonValue&amp;quot;:&amp;quot;aaaa&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;sortFields&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;fieldName&amp;quot;:&amp;quot;productId&amp;quot;,&lt;br /&gt;
         &amp;quot;dataType&amp;quot;:&amp;quot;string&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;fieldName&amp;quot;:&amp;quot;productId&amp;quot;,&lt;br /&gt;
         &amp;quot;dataType&amp;quot;:&amp;quot;array&amp;quot;,&lt;br /&gt;
         &amp;quot;sortArray&amp;quot;:[&lt;br /&gt;
            &amp;quot;ffff&amp;quot;,&lt;br /&gt;
            &amp;quot;eeee&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
      }&lt;br /&gt;
   ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-17]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-17]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3908</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3908"/>
		<updated>2026-01-09T00:11:00Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as params sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
	// header/footer filterDataField elements reference valueUserTag&lt;br /&gt;
&lt;br /&gt;
	elements: {&lt;br /&gt;
        // add example of pageOutput element that references requiredDataLinkStepObjects and valueUserTags&lt;br /&gt;
    },&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
            valueSource: 'perParentIdentifier',&lt;br /&gt;
            perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         fieldName: &amp;quot;productId&amp;quot;,&lt;br /&gt;
         comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
         valueUserTag: &amp;quot;userTag_1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
        // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
	],&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               fieldName: &amp;quot;locationNodeId&amp;quot;,&lt;br /&gt;
               comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               valueUserTag: &amp;quot;userTag_7&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              fieldName: &amp;quot;sellOfferId&amp;quot;,&lt;br /&gt;
              comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
              valueUserTag: &amp;quot;userTag_8&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
        // userTag_LinkStepObjectC&lt;br /&gt;
        // userTag_LinkStepObjectD&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
           addFilterMain: true, //default: false =&amp;gt; need to add filterMain set = true&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                  comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  valueUserTag: &amp;quot;userTag_2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
          aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
          sortFields: [&lt;br /&gt;
       			{&lt;br /&gt;
            		requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		            dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        		},&lt;br /&gt;
				{&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
		         },&lt;br /&gt;
&lt;br /&gt;
                {&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
                     sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;]&lt;br /&gt;
		        }&lt;br /&gt;
            ],&lt;br /&gt;
          comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
          comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
          comparisonSortDataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
          comparisonValue: &amp;quot;userTag_2&amp;quot;,&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
		{&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		     dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
             sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;]&lt;br /&gt;
		}&lt;br /&gt;
    ],&lt;br /&gt;
	valueUserTags: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueSource: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3907</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3907"/>
		<updated>2026-01-09T00:09:53Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as params sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
	// header/footer filterDataField elements reference valueUserTag&lt;br /&gt;
&lt;br /&gt;
	elements: {&lt;br /&gt;
        // add example of pageOutput element that references requiredDataLinkStepObjects and valueUserTags&lt;br /&gt;
    },&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
            valueSource: 'perParentIdentifier',&lt;br /&gt;
            perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         fieldName: &amp;quot;productId&amp;quot;,&lt;br /&gt;
         comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
         valueUserTag: &amp;quot;userTag_1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
        // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
	],&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               fieldName: &amp;quot;locationNodeId&amp;quot;,&lt;br /&gt;
               comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               valueUserTag: &amp;quot;userTag_7&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              fieldName: &amp;quot;sellOfferId&amp;quot;,&lt;br /&gt;
              comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
              valueUserTag: &amp;quot;userTag_8&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
        // userTag_LinkStepObjectC&lt;br /&gt;
        // userTag_LinkStepObjectD&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
           addFilterMain: true, //default: false =&amp;gt; need to add filterMain set = true&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                  comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  valueUserTag: &amp;quot;userTag_2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
          aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
          sortFields: [&lt;br /&gt;
       			{&lt;br /&gt;
            		requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		            dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        		},&lt;br /&gt;
				{&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
		         },&lt;br /&gt;
&lt;br /&gt;
                {&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
                     sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;]&lt;br /&gt;
		        }&lt;br /&gt;
            ],&lt;br /&gt;
          comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
          comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
          comparisonSortDataType: &amp;quot;string&amp;quot;,&lt;br /&gt;
          comparisonValue: &amp;quot;50&amp;quot;,&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
		{&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		     dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
             sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;]&lt;br /&gt;
		}&lt;br /&gt;
    ],&lt;br /&gt;
	valueUserTags: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueSource: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-17_-_LinkPath_structure_and_examples&amp;diff=3888</id>
		<title>2025-04-17 - LinkPath structure and examples</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-17_-_LinkPath_structure_and_examples&amp;diff=3888"/>
		<updated>2026-01-06T02:40:39Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= reqiuredData normalize structure =&lt;br /&gt;
* component =&amp;gt; requiredDataObjects , linkPathObjects, linkPathSteps&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  requiredDataObjects: {&lt;br /&gt;
     hash_requiredDataObjectA: { //* normal requiredData&lt;br /&gt;
       fieldName: &amp;quot;fieldname if main objType or last fieldName for linkPath&amp;quot;,&lt;br /&gt;
     },&lt;br /&gt;
     hash_requiredDataObjectB: { //* has LinkPath&lt;br /&gt;
       fieldName: &amp;quot;fieldname if main objType or last fieldName for linkPath&amp;quot;,&lt;br /&gt;
       linkPathObjectId: &amp;quot;hash_linkPathA&amp;quot;,&lt;br /&gt;
       complexFilterCombinationIds: [ //* has applyCombinations&lt;br /&gt;
         &amp;quot;xxxxx&amp;quot;,&lt;br /&gt;
         &amp;quot;xxxxx&amp;quot;&lt;br /&gt;
       ]&lt;br /&gt;
     }&lt;br /&gt;
  },&lt;br /&gt;
  linkPathObjects: {&lt;br /&gt;
    hash_linkPathA: {&lt;br /&gt;
      initialObjType: {&lt;br /&gt;
        serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
        objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      linkSteps: [&lt;br /&gt;
        &amp;quot;hash_linkStepB_1&amp;quot;,&lt;br /&gt;
        &amp;quot;hash_linkStepB_2&amp;quot;&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  linkPathSteps: {&lt;br /&gt;
    hash_linkStepB_1: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         relType: {&lt;br /&gt;
           serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
           relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         direction: &amp;quot;from&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      //------ conditions by link ------// : optional&lt;br /&gt;
      filterElementId: &amp;quot;ref_filterMainIdA&amp;quot;,&lt;br /&gt;
      aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
      sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
          dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
    },&lt;br /&gt;
    hash_linkStepB_2: {&lt;br /&gt;
      pathLinkType: {&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         relType: {&lt;br /&gt;
           serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
           relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         direction: &amp;quot;from&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      //------ conditions by link ------//&lt;br /&gt;
      filterElementId: &amp;quot;ref_filterMainIdA&amp;quot;,&lt;br /&gt;
      aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
      sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
          dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      requiredDataObjects: [ //* for use to create linkPath in linkPath&lt;br /&gt;
        {&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
      combine: &amp;quot;true&amp;quot;,&lt;br /&gt;
      comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
      comparisonSortField: &amp;quot;upToValue&amp;quot;,&lt;br /&gt;
      comparisonValue: &amp;quot;50&amp;quot;,&lt;br /&gt;
      requestProperties: {&lt;br /&gt;
        tag_xxxx: &amp;quot;value&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      perParentCombinationIds: [&lt;br /&gt;
        {&lt;br /&gt;
          tag: &amp;quot;tag_xxxxx&amp;quot;,&lt;br /&gt;
          filterMainId: &amp;quot;xxxxx&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      applyCombinations: [&lt;br /&gt;
        {&lt;br /&gt;
          tag: &amp;quot;tag_xxxxx&amp;quot;,&lt;br /&gt;
          filterMainId: &amp;quot;xxxxx&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ProcessSearchResultMessage ==&lt;br /&gt;
* Fetch and Sort Product Sizes by Language with Fallback&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Need to fetch all sizes, sorted by language order 'en', 'th'.&lt;br /&gt;
If a translation is missing for any language in sortArray: ['en', 'th'],&lt;br /&gt;
fallback to the defaultTranslationLink of that productAttribute.&lt;br /&gt;
ProductAttributeLabel with labelId = 'Id_X' represents a size.&lt;br /&gt;
identifiersIdArray contains all productAttributeIds linked to ProductAttributeLabel where labelId='Id_X'.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let processSearchResultMessage = {&lt;br /&gt;
  objType: {&lt;br /&gt;
    serviceTag: 'ProductAttribute',&lt;br /&gt;
    objectType: 'productAttribute'&lt;br /&gt;
  },&lt;br /&gt;
  requiredData: [&lt;br /&gt;
    {&lt;br /&gt;
      fieldName: 'text', //all sizes by languageId, where text is the identifiers of the translation objectType, which is the final link step of this requiredData&lt;br /&gt;
      linkPath: [&lt;br /&gt;
        {&lt;br /&gt;
          link: {&lt;br /&gt;
            relType: {&lt;br /&gt;
              serviceTag: 'Translations',&lt;br /&gt;
              relationshipTag: 'hasTranslationLink'&lt;br /&gt;
              // Must use hasTranslationLink because it will be automatically added by inserting a filterElement with logicalType: &amp;quot;translateIds&amp;quot;&lt;br /&gt;
              // where identifiers come from identifiersIdArray (Process-ComplexFilter), along with a filterElement of type: &amp;quot;logicalOperator&amp;quot; and operator: &amp;quot;and&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            objType: {&lt;br /&gt;
              serviceTag: 'Translations',&lt;br /&gt;
              objectType: 'translationLink'&lt;br /&gt;
            },&lt;br /&gt;
            direction: 'from'&lt;br /&gt;
          },&lt;br /&gt;
          aggregate: 'min',   //if 'min' sorts languages in order 'en', 'th', //if max sorts languages in order 'th', 'en&lt;br /&gt;
          sortFields: {&lt;br /&gt;
            fieldName: 'languageId',&lt;br /&gt;
            dataType: 'array',&lt;br /&gt;
            sortArray: ['en', 'th']  // sorts languages according to sortArray&lt;br /&gt;
          },&lt;br /&gt;
          filterElements: [&lt;br /&gt;
            {&lt;br /&gt;
              type: 'group',&lt;br /&gt;
              elements: [&lt;br /&gt;
                {&lt;br /&gt;
                  type: 'traversal',&lt;br /&gt;
                  traversals: [&lt;br /&gt;
                    {&lt;br /&gt;
                      fields: {&lt;br /&gt;
                        languageId: { anyValue: ['en', 'th'] },&lt;br /&gt;
                        textTag: 'productAttributeValue'&lt;br /&gt;
                      },&lt;br /&gt;
                      link: {&lt;br /&gt;
                        relationshipDirection: 'from',&lt;br /&gt;
                        relType: {&lt;br /&gt;
                          serviceTag: 'Translations',&lt;br /&gt;
                          relationshipTag: 'currentTranslationLink'&lt;br /&gt;
                        }&lt;br /&gt;
                      }&lt;br /&gt;
                    },&lt;br /&gt;
                    {&lt;br /&gt;
                      objType: {&lt;br /&gt;
                        serviceTag: 'ProductAttribute',&lt;br /&gt;
                        objectType: 'productAttribute'&lt;br /&gt;
                      }&lt;br /&gt;
                    }&lt;br /&gt;
                  ]&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                  type: 'logicalOperator', operator: 'or'&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                  type: 'traversal',&lt;br /&gt;
                  traversals: [&lt;br /&gt;
                    {&lt;br /&gt;
                      fields: {&lt;br /&gt;
                        textTag: 'productAttributeValue'&lt;br /&gt;
                      },&lt;br /&gt;
                      link: {&lt;br /&gt;
                        relationshipDirection: 'from',&lt;br /&gt;
                        relType: {&lt;br /&gt;
                          serviceTag: 'Translations',&lt;br /&gt;
                          relationshipTag: 'defaultTranslationLink'&lt;br /&gt;
                        }&lt;br /&gt;
                      }&lt;br /&gt;
                    },&lt;br /&gt;
                    {&lt;br /&gt;
                      objType: {&lt;br /&gt;
                        serviceTag: 'ProductAttribute',&lt;br /&gt;
                        objectType: 'productAttribute'&lt;br /&gt;
                      }&lt;br /&gt;
                    }&lt;br /&gt;
                  ]&lt;br /&gt;
                }&lt;br /&gt;
              ]&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          link: {&lt;br /&gt;
            relType: {&lt;br /&gt;
              serviceTag: 'Translations',&lt;br /&gt;
              relationshipTag: 'isTranslation'&lt;br /&gt;
            },&lt;br /&gt;
            objType: {&lt;br /&gt;
              serviceTag: 'Translations',&lt;br /&gt;
              objectType: 'translation'&lt;br /&gt;
            },&lt;br /&gt;
            direction: 'from'&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  filter: {&lt;br /&gt;
    objType: {&lt;br /&gt;
      serviceTag: 'ProductAttribute',&lt;br /&gt;
      objectType: 'productAttribute'&lt;br /&gt;
    },&lt;br /&gt;
    elements: [&lt;br /&gt;
      {&lt;br /&gt;
        type: 'complexFilter',&lt;br /&gt;
        complexFilter: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: 'ProductAttribute',&lt;br /&gt;
            objectType: 'ProductAttributeLabel'&lt;br /&gt;
          },&lt;br /&gt;
          relType: {&lt;br /&gt;
            serviceTag: 'ProductAttribute',&lt;br /&gt;
            relationshipTag: 'isProductAttributeLabel'&lt;br /&gt;
          },&lt;br /&gt;
          direction: 'from',&lt;br /&gt;
          elements: [&lt;br /&gt;
            {&lt;br /&gt;
              type: 'logical',&lt;br /&gt;
              fieldName: 'labelId',&lt;br /&gt;
              comparison: 'equals',&lt;br /&gt;
              value: 'Id_X'&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  requestProperties: {},&lt;br /&gt;
  identifiersIdArray: [&lt;br /&gt;
    {&lt;br /&gt;
      identifiersId: 'hashOfIdentifiersObject_1',&lt;br /&gt;
      identifiers: {&lt;br /&gt;
        productAttributeId: 'productAttributeId_uuid_1'&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      identifiersId: 'hashOfIdentifiersObject_2',&lt;br /&gt;
      identifiers: {&lt;br /&gt;
        productAttributeId: 'productAttributeId_uuid_2'&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      identifiersId: 'hashOfIdentifiersObject_3',&lt;br /&gt;
      identifiers: {&lt;br /&gt;
        productAttributeId: 'productAttributeId_uuid_3'&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== example search and sort request ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;objType&amp;quot;:{&lt;br /&gt;
      &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
      &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;searchResultId&amp;quot;:&amp;quot;8e5fecd40a27e47f89cd2743916c0044f0f69bc6&amp;quot;,&lt;br /&gt;
   &amp;quot;searchDetailId&amp;quot;:&amp;quot;3462d3248d3af9406554f1c218b63442d26ac2e5&amp;quot;,&lt;br /&gt;
   &amp;quot;requiredDataObjects&amp;quot;:{&lt;br /&gt;
      &amp;quot;4c8e7879d26e6fa7ab85ded25a79a541754c5a3c&amp;quot;:{&lt;br /&gt;
         &amp;quot;fieldName&amp;quot;:&amp;quot;productId&amp;quot;,&lt;br /&gt;
         &amp;quot;linkPathObjectId&amp;quot;:&amp;quot;1a8a3f9c2c3ea5eaad1f42385362de5dd11cde8a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;c799f11507529f0fb6fa712568596d24b6507d40&amp;quot;:{&lt;br /&gt;
         &amp;quot;fieldName&amp;quot;:&amp;quot;sellOfferHandlerServiceTag&amp;quot;,&lt;br /&gt;
         &amp;quot;linkPathObjectId&amp;quot;:&amp;quot;5909f82f27bd6c1f921e95b88a65b6e4727a6532&amp;quot;,&lt;br /&gt;
         &amp;quot;complexFilterCombinationIds&amp;quot;:[&lt;br /&gt;
            &amp;quot;88d9c5b9ab36d8c3ebf17e8322541b9c64cae25b&amp;quot;,&lt;br /&gt;
            &amp;quot;51509dea0a7ba2746dbd24769b8e777f1411f3ff&amp;quot;,&lt;br /&gt;
            &amp;quot;d7a7f875254e856b4205075826631ec042b4c821&amp;quot;,&lt;br /&gt;
            &amp;quot;b96447ae98c95858694ca5ec407750c559825930&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;searchParams&amp;quot;:{&lt;br /&gt;
      &amp;quot;filterObjectId&amp;quot;:&amp;quot;8e5fecd40a27e47f89cd2743916c0044f0f69bc6&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;filterElements&amp;quot;:{&lt;br /&gt;
      &amp;quot;8e5fecd40a27e47f89cd2743916c0044f0f69bc6&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;sellOfferId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;equals&amp;quot;,&lt;br /&gt;
            &amp;quot;value&amp;quot;:&amp;quot;sellOfferId_001&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;d92ca4f68dc0d474cfdc10a6c702a5c7224a822c&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;rateTable&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;rateTableId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;highLow&amp;quot;,&lt;br /&gt;
            &amp;quot;valueType&amp;quot;:&amp;quot;perParentIdentifier&amp;quot;,&lt;br /&gt;
            &amp;quot;perParentIdentifierFieldname&amp;quot;:&amp;quot;sellOfferId&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;cd378bc32fbc9a46929c9a9d590e7d77243a839c&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;rateTable&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;rateTableId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;lessThanEquals&amp;quot;,&lt;br /&gt;
            &amp;quot;value&amp;quot;:&amp;quot;cccc&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;0c287df25d6ff203be7cc9faa2390f6ab0df3878&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;rateTable&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;operation&amp;quot;,&lt;br /&gt;
            &amp;quot;filterElementLeft&amp;quot;:&amp;quot;d92ca4f68dc0d474cfdc10a6c702a5c7224a822c&amp;quot;,&lt;br /&gt;
            &amp;quot;filterElementRight&amp;quot;:&amp;quot;cd378bc32fbc9a46929c9a9d590e7d77243a839c&amp;quot;,&lt;br /&gt;
            &amp;quot;operator&amp;quot;:&amp;quot;AND&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;e0b8534452e98796f144c83a221764ef32db5ab6&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;Locations&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;locationNode&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
            &amp;quot;childFilterElementId&amp;quot;:&amp;quot;0c287df25d6ff203be7cc9faa2390f6ab0df3878&amp;quot;,&lt;br /&gt;
            &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
               &amp;quot;relType&amp;quot;:{&lt;br /&gt;
                  &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
                  &amp;quot;relationshipTag&amp;quot;:&amp;quot;disabledDeliversTolocationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               &amp;quot;objType&amp;quot;:{&lt;br /&gt;
                  &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
                  &amp;quot;objectType&amp;quot;:&amp;quot;rateTable&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               &amp;quot;direction&amp;quot;:&amp;quot;to&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;requestProperties&amp;quot;:{}&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;88d9c5b9ab36d8c3ebf17e8322541b9c64cae25b&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;currencyId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;lessThan&amp;quot;,&lt;br /&gt;
            &amp;quot;value&amp;quot;:&amp;quot;bbbb&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;51509dea0a7ba2746dbd24769b8e777f1411f3ff&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOfferPlanUserPaymentMethodLink&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;sellOfferPlanUserPaymentMethodLinkId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;lessThan&amp;quot;,&lt;br /&gt;
            &amp;quot;value&amp;quot;:&amp;quot;bbbb&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;a5491ba3deb74e523741c8cfeb845f49db444a9c&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;Locations&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;locationNode&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;locationNodeId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;lessThan&amp;quot;,&lt;br /&gt;
            &amp;quot;value&amp;quot;:&amp;quot;cccc&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;7820aef170ae6c3e723382d6bc81d7b12a674974&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;rateTable&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;logical&amp;quot;,&lt;br /&gt;
            &amp;quot;fieldName&amp;quot;:&amp;quot;rateTableId&amp;quot;,&lt;br /&gt;
            &amp;quot;comparison&amp;quot;:&amp;quot;highLow&amp;quot;,&lt;br /&gt;
            &amp;quot;value&amp;quot;:&amp;quot;aaaa&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;554fc368ec36c13a93e3c71c8081951060965bb2&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;Locations&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;locationNode&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
            &amp;quot;childFilterElementId&amp;quot;:&amp;quot;7820aef170ae6c3e723382d6bc81d7b12a674974&amp;quot;,&lt;br /&gt;
            &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
               &amp;quot;relType&amp;quot;:{&lt;br /&gt;
                  &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
                  &amp;quot;relationshipTag&amp;quot;:&amp;quot;deliversToLocationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               &amp;quot;objType&amp;quot;:{&lt;br /&gt;
                  &amp;quot;serviceTag&amp;quot;:&amp;quot;DeliveryMethodRAT&amp;quot;,&lt;br /&gt;
                  &amp;quot;objectType&amp;quot;:&amp;quot;rateTable&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               &amp;quot;direction&amp;quot;:&amp;quot;to&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;requestProperties&amp;quot;:{}&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;d7a7f875254e856b4205075826631ec042b4c821&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;Locations&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;locationNode&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;operation&amp;quot;,&lt;br /&gt;
            &amp;quot;filterElementLeft&amp;quot;:&amp;quot;a5491ba3deb74e523741c8cfeb845f49db444a9c&amp;quot;,&lt;br /&gt;
            &amp;quot;filterElementRight&amp;quot;:&amp;quot;554fc368ec36c13a93e3c71c8081951060965bb2&amp;quot;,&lt;br /&gt;
            &amp;quot;operator&amp;quot;:&amp;quot;OR&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;b96447ae98c95858694ca5ec407750c559825930&amp;quot;:{&lt;br /&gt;
         &amp;quot;objType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOfferPlanUserPaymentMethodLink&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;filterElement&amp;quot;:{&lt;br /&gt;
            &amp;quot;filterType&amp;quot;:&amp;quot;operation&amp;quot;,&lt;br /&gt;
            &amp;quot;filterElementLeft&amp;quot;:&amp;quot;5faa4000cfb72e7aa28603a7740c212f6d6db5e0&amp;quot;,&lt;br /&gt;
            &amp;quot;filterElementRight&amp;quot;:&amp;quot;a1aa8d2907f8b6f24e7b66116129838e978bcaee&amp;quot;,&lt;br /&gt;
            &amp;quot;operator&amp;quot;:&amp;quot;OR&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;linkPathObjects&amp;quot;:{&lt;br /&gt;
      &amp;quot;1a8a3f9c2c3ea5eaad1f42385362de5dd11cde8a&amp;quot;:{&lt;br /&gt;
         &amp;quot;initialObjType&amp;quot;:{&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;linkSteps&amp;quot;:[&lt;br /&gt;
            &amp;quot;fa9a637eb09df71d939b3d914eb9ee27ae83048e&amp;quot;,&lt;br /&gt;
            &amp;quot;d3e2d36cab6d9441db10a7c983834cf9196398b3&amp;quot;,&lt;br /&gt;
            &amp;quot;fa9a637eb09df71d939b3d914eb9ee27ae83048e&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;2794814ec253fc93496bfcb50ea18ebfe640bf4d&amp;quot;:{&lt;br /&gt;
         &amp;quot;initialObjType&amp;quot;:{&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;linkSteps&amp;quot;:[&lt;br /&gt;
            &amp;quot;fa9a637eb09df71d939b3d914eb9ee27ae83048e&amp;quot;,&lt;br /&gt;
            &amp;quot;11704ae9a828b4709300964e2e0361bad13db5c3&amp;quot;,&lt;br /&gt;
            &amp;quot;964050f23f92b45a1ea573a573c50ae3ca2bae18&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;5909f82f27bd6c1f921e95b88a65b6e4727a6532&amp;quot;:{&lt;br /&gt;
         &amp;quot;initialObjType&amp;quot;:{&lt;br /&gt;
            &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
            &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;linkSteps&amp;quot;:[&lt;br /&gt;
            &amp;quot;fa9a637eb09df71d939b3d914eb9ee27ae83048e&amp;quot;,&lt;br /&gt;
            &amp;quot;634dd9295fcb1834de0a6ed1f1ab8a9fa06c4d7f&amp;quot;,&lt;br /&gt;
            &amp;quot;d3fc84fa4444406cef2de49baf53d38ab86cd2e0&amp;quot;,&lt;br /&gt;
            &amp;quot;2b0537fa34ee1d259488fce12204dd549e1c98a3&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;linkPathSteps&amp;quot;:{&lt;br /&gt;
      &amp;quot;fa9a637eb09df71d939b3d914eb9ee27ae83048e&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;product&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;to&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;d3e2d36cab6d9441db10a7c983834cf9196398b3&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;from&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;comparison&amp;quot;:&amp;quot;lessThan&amp;quot;,&lt;br /&gt;
         &amp;quot;comparisonSortField&amp;quot;:&amp;quot;productId&amp;quot;,&lt;br /&gt;
         &amp;quot;comparisonValue&amp;quot;:&amp;quot;eeee&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;634dd9295fcb1834de0a6ed1f1ab8a9fa06c4d7f&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;from&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;aggregate&amp;quot;:&amp;quot;min&amp;quot;,&lt;br /&gt;
         &amp;quot;sortFields&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;fieldName&amp;quot;:&amp;quot;SellOfferManager_CalCombinedPricingUniqueRequestId&amp;quot;,&lt;br /&gt;
               &amp;quot;dataType&amp;quot;:&amp;quot;string&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;requiredDataObjects&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;fieldName&amp;quot;:&amp;quot;SellOfferManager_CalCombinedPricingUniqueRequestId&amp;quot;,&lt;br /&gt;
               &amp;quot;linkPathObjectId&amp;quot;:&amp;quot;2794814ec253fc93496bfcb50ea18ebfe640bf4d&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;d3fc84fa4444406cef2de49baf53d38ab86cd2e0&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;orderPrice&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;from&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;requestProperties&amp;quot;:{&lt;br /&gt;
            &amp;quot;tag_sellOfferPlan&amp;quot;:&amp;quot;bbbb&amp;quot;,&lt;br /&gt;
            &amp;quot;tag_sellOfferPlanDeliveryMethodLink&amp;quot;:&amp;quot;bbbb&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;perParentCombinationIds&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;tag&amp;quot;:&amp;quot;tag_deliverTo&amp;quot;,&lt;br /&gt;
               &amp;quot;filterMainId&amp;quot;:&amp;quot;e0b8534452e98796f144c83a221764ef32db5ab6&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;applyCombinations&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;tag&amp;quot;:&amp;quot;tag_sellOfferPlanUserPaymentMethodLink&amp;quot;,&lt;br /&gt;
               &amp;quot;filterMainId&amp;quot;:&amp;quot;51509dea0a7ba2746dbd24769b8e777f1411f3ff&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;2b0537fa34ee1d259488fce12204dd549e1c98a3&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;to&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;requestProperties&amp;quot;:{&lt;br /&gt;
            &amp;quot;tag_deliverTo&amp;quot;:&amp;quot;aaaa&amp;quot;,&lt;br /&gt;
            &amp;quot;tag_sellOfferPlanDeliveryMethodLink&amp;quot;:&amp;quot;bbbb&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;applyCombinations&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;tag&amp;quot;:&amp;quot;tag_sellOfferPlan&amp;quot;,&lt;br /&gt;
               &amp;quot;filterMainId&amp;quot;:&amp;quot;88d9c5b9ab36d8c3ebf17e8322541b9c64cae25b&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;tag&amp;quot;:&amp;quot;tag_sellOfferPlanUserPaymentMethodLink&amp;quot;,&lt;br /&gt;
               &amp;quot;filterMainId&amp;quot;:&amp;quot;51509dea0a7ba2746dbd24769b8e777f1411f3ff&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;11704ae9a828b4709300964e2e0361bad13db5c3&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;sellOffer&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;from&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;aggregate&amp;quot;:&amp;quot;average&amp;quot;,&lt;br /&gt;
         &amp;quot;sortFields&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;fieldName&amp;quot;:&amp;quot;sellOfferHandlerServiceTag&amp;quot;,&lt;br /&gt;
               &amp;quot;dataType&amp;quot;:&amp;quot;string&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;requiredDataObjects&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;fieldName&amp;quot;:&amp;quot;sellOfferHandlerServiceTag&amp;quot;,&lt;br /&gt;
               &amp;quot;linkPathObjectId&amp;quot;:&amp;quot;cae7f8604e62fd4ac09146f5bdd512d9db668c70&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;combine&amp;quot;:true&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;964050f23f92b45a1ea573a573c50ae3ca2bae18&amp;quot;:{&lt;br /&gt;
         &amp;quot;pathLinkType&amp;quot;:{&lt;br /&gt;
            &amp;quot;relType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;relationshipTag&amp;quot;:&amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;objType&amp;quot;:{&lt;br /&gt;
               &amp;quot;serviceTag&amp;quot;:&amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               &amp;quot;objectType&amp;quot;:&amp;quot;orderPrice&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;direction&amp;quot;:&amp;quot;from&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;requestProperties&amp;quot;:{&lt;br /&gt;
            &amp;quot;tag_sellOfferPlan&amp;quot;:&amp;quot;aaaa&amp;quot;,&lt;br /&gt;
            &amp;quot;tag_sellOfferPlanDeliveryMethodLink&amp;quot;:&amp;quot;bbbb&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         &amp;quot;applyCombinations&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;tag&amp;quot;:&amp;quot;tag_deliverTo&amp;quot;,&lt;br /&gt;
               &amp;quot;filterMainId&amp;quot;:&amp;quot;d7a7f875254e856b4205075826631ec042b4c821&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;tag&amp;quot;:&amp;quot;tag_sellOfferPlanUserPaymentMethodLink&amp;quot;,&lt;br /&gt;
               &amp;quot;filterMainId&amp;quot;:&amp;quot;b96447ae98c95858694ca5ec407750c559825930&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;comparison&amp;quot;:&amp;quot;highLow&amp;quot;,&lt;br /&gt;
         &amp;quot;comparisonSortField&amp;quot;:&amp;quot;sellOfferHandlerServiceTag&amp;quot;,&lt;br /&gt;
         &amp;quot;comparisonValue&amp;quot;:&amp;quot;aaaa&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;sortFields&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;fieldName&amp;quot;:&amp;quot;productId&amp;quot;,&lt;br /&gt;
         &amp;quot;dataType&amp;quot;:&amp;quot;string&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;fieldName&amp;quot;:&amp;quot;productId&amp;quot;,&lt;br /&gt;
         &amp;quot;dataType&amp;quot;:&amp;quot;array&amp;quot;,&lt;br /&gt;
         &amp;quot;values&amp;quot;:[&lt;br /&gt;
            &amp;quot;ffff&amp;quot;,&lt;br /&gt;
            &amp;quot;eeee&amp;quot;&lt;br /&gt;
         ]&lt;br /&gt;
      }&lt;br /&gt;
   ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-17]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-17]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3766</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3766"/>
		<updated>2026-01-01T02:53:36Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as params sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
	// header/footer filterDataField elements reference valueUserTag&lt;br /&gt;
&lt;br /&gt;
	elements: {&lt;br /&gt;
        // add example of pageOutput element that references requiredDataLinkStepObjects and valueUserTags&lt;br /&gt;
    },&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
            valueSource: 'perParentIdentifier',&lt;br /&gt;
            perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         fieldName: &amp;quot;productId&amp;quot;,&lt;br /&gt;
         comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
         valueUserTag: &amp;quot;userTag_1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
        // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
	],&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               fieldName: &amp;quot;locationNodeId&amp;quot;,&lt;br /&gt;
               comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               valueUserTag: &amp;quot;userTag_7&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              fieldName: &amp;quot;sellOfferId&amp;quot;,&lt;br /&gt;
              comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
              valueUserTag: &amp;quot;userTag_8&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
        // userTag_LinkStepObjectC&lt;br /&gt;
        // userTag_LinkStepObjectD&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
           addFilterMain: true, //default: false =&amp;gt; need to add filterMain set = true&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                  comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  valueUserTag: &amp;quot;userTag_2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
          aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
          sortFields: [&lt;br /&gt;
       			{&lt;br /&gt;
            		requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		            dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        		},&lt;br /&gt;
				{&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
		         },&lt;br /&gt;
&lt;br /&gt;
                {&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
                     sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;]&lt;br /&gt;
		        }&lt;br /&gt;
            ],&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
		{&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		     dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
             sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;]&lt;br /&gt;
		}&lt;br /&gt;
    ],&lt;br /&gt;
	valueUserTags: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueSource: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3765</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3765"/>
		<updated>2026-01-01T01:05:07Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as params sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
	// header/footer filterDataField elements reference valueUserTag&lt;br /&gt;
&lt;br /&gt;
	elements: {&lt;br /&gt;
        // add example of pageOutput element that references requiredDataLinkStepObjects and valueUserTags&lt;br /&gt;
    },&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
            valueSource: 'perParentIdentifier',&lt;br /&gt;
            perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         fieldName: &amp;quot;productId&amp;quot;,&lt;br /&gt;
         comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
         valueUserTag: &amp;quot;userTag_1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
        // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
	],&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               fieldName: &amp;quot;locationNodeId&amp;quot;,&lt;br /&gt;
               comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               valueUserTag: &amp;quot;userTag_7&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              fieldName: &amp;quot;sellOfferId&amp;quot;,&lt;br /&gt;
              comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
              valueUserTag: &amp;quot;userTag_8&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
        // userTag_LinkStepObjectC&lt;br /&gt;
        // userTag_LinkStepObjectD&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
           addFilterMain: true, //default: false =&amp;gt; need to add filterMain set = true&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                  comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  valueUserTag: &amp;quot;userTag_2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
          aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
          sortFields: [&lt;br /&gt;
       			{&lt;br /&gt;
            		requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		            dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        		},&lt;br /&gt;
				{&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
		         },&lt;br /&gt;
&lt;br /&gt;
                {&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;array&amp;quot;,&lt;br /&gt;
                     sortByValueUserTags:[&amp;quot;userTag_1&amp;quot;,&amp;quot;userTag_2&amp;quot;]&lt;br /&gt;
		        }&lt;br /&gt;
            ],&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
		{&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
    ],&lt;br /&gt;
	valueUserTags: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueSource: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3625</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3625"/>
		<updated>2025-11-19T23:52:55Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
&lt;br /&gt;
	elements: {&lt;br /&gt;
        // add example of pageOutput element that references requiredDataLinkStepObjects&lt;br /&gt;
    },&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
            valueSource: 'perParentIdentifier',&lt;br /&gt;
            perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         fieldName: &amp;quot;productId&amp;quot;,&lt;br /&gt;
         comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
         value: &amp;quot;userTag_1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
        // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
	],&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               fieldName: &amp;quot;locationNodeId&amp;quot;,&lt;br /&gt;
               comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               value: &amp;quot;userTag_7&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              fieldName: &amp;quot;sellOfferId&amp;quot;,&lt;br /&gt;
              comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
              value: &amp;quot;userTag_8&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
        // userTag_LinkStepObjectC&lt;br /&gt;
        // userTag_LinkStepObjectD&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
           addFilterMain: true, //default: false =&amp;gt; need to add filterMain set = true&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                  comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  value: &amp;quot;userTag_2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
          aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
          sortFields: [&lt;br /&gt;
       			{&lt;br /&gt;
            		requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		            dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        		},&lt;br /&gt;
				{&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
		         }&lt;br /&gt;
            ],&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
		{&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
    ],&lt;br /&gt;
	values: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueSource: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3605</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3605"/>
		<updated>2025-11-10T04:16:13Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
&lt;br /&gt;
	elements: {&lt;br /&gt;
        // add example of pageOutput element that references requiredDataLinkStepObjects&lt;br /&gt;
    },&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;xxId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanDeliveryMethodLinkId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
            valueSource: 'perParentIdentifier',&lt;br /&gt;
            perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         fieldName: &amp;quot;productId&amp;quot;,&lt;br /&gt;
         comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
         value: &amp;quot;userTag_1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
        // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
	],&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               fieldName: &amp;quot;locationNodeId&amp;quot;,&lt;br /&gt;
               comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               value: &amp;quot;userTag_7&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              fieldName: &amp;quot;sellOfferId&amp;quot;,&lt;br /&gt;
              comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
              value: &amp;quot;userTag_8&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
        // userTag_LinkStepObjectC&lt;br /&gt;
        // userTag_LinkStepObjectD&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                  comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  value: &amp;quot;userTag_2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
          aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
          sortFields: [&lt;br /&gt;
       			{&lt;br /&gt;
            		requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		            dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        		},&lt;br /&gt;
				{&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
		         }&lt;br /&gt;
            ],&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
		{&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
    ],&lt;br /&gt;
	values: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueSource: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3604</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3604"/>
		<updated>2025-11-10T00:48:48Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
&lt;br /&gt;
	elements: {&lt;br /&gt;
        // add example of pageOutput element that references requiredDataLinkStepObjects&lt;br /&gt;
    },&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;xxId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanDeliveryMethodLinkId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
            valueSource: 'perParentIdentifier',&lt;br /&gt;
            perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         fieldName: &amp;quot;productId&amp;quot;,&lt;br /&gt;
         comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
         value: &amp;quot;userTag_1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
        // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
	],&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               fieldName: &amp;quot;locationNodeId&amp;quot;,&lt;br /&gt;
               comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               value: &amp;quot;userTag_7&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              fieldName: &amp;quot;sellOfferId&amp;quot;,&lt;br /&gt;
              comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
              value: &amp;quot;userTag_8&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
        // userTag_LinkStepObjectC&lt;br /&gt;
        // userTag_LinkStepObjectD&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                  comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  value: &amp;quot;userTag_2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
          aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
          sortFields: [&lt;br /&gt;
       			{&lt;br /&gt;
            		requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		            dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        		},&lt;br /&gt;
				{&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
		         }&lt;br /&gt;
            ],&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
		{&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
    ],&lt;br /&gt;
	values: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;xxId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueSource: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3603</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3603"/>
		<updated>2025-11-10T00:37:08Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
&lt;br /&gt;
	elements: {&lt;br /&gt;
        // add example of pageOutput element that references requiredDataLinkStepObjects&lt;br /&gt;
    },&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;xxId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanDeliveryMethodLinkId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueType: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         fieldName: &amp;quot;productId&amp;quot;,&lt;br /&gt;
         comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
         value: &amp;quot;userTag_1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
        // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
	],&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               fieldName: &amp;quot;locationNodeId&amp;quot;,&lt;br /&gt;
               comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               value: &amp;quot;userTag_7&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              fieldName: &amp;quot;sellOfferId&amp;quot;,&lt;br /&gt;
              comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
              value: &amp;quot;userTag_8&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
        // userTag_LinkStepObjectC&lt;br /&gt;
        // userTag_LinkStepObjectD&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                  comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  value: &amp;quot;userTag_2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
          aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
          sortFields: [&lt;br /&gt;
       			{&lt;br /&gt;
            		requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		            dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        		},&lt;br /&gt;
				{&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
		         }&lt;br /&gt;
            ],&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
		{&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
    ],&lt;br /&gt;
	values: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;xxId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueSource: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3602</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3602"/>
		<updated>2025-11-10T00:27:08Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
&lt;br /&gt;
	elements: {&lt;br /&gt;
        // add example of pageOutput element that references requiredDataLinkStepObjects&lt;br /&gt;
    },&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;xxId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanDeliveryMethodLinkId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueType: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         fieldName: &amp;quot;productId&amp;quot;,&lt;br /&gt;
         comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
         value: &amp;quot;userTag_1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
        // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
	],&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               fieldName: &amp;quot;locationNodeId&amp;quot;,&lt;br /&gt;
               comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               value: &amp;quot;userTag_7&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              fieldName: &amp;quot;sellOfferId&amp;quot;,&lt;br /&gt;
              comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
              value: &amp;quot;userTag_8&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
        // userTag_LinkStepObjectC&lt;br /&gt;
        // userTag_LinkStepObjectD&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                  comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  value: &amp;quot;userTag_2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
           aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
           sortFields: [&lt;br /&gt;
       			{&lt;br /&gt;
            		requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		            dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        		},&lt;br /&gt;
				{&lt;br /&gt;
        		     requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectD&amp;quot;,&lt;br /&gt;
		             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
		         }&lt;br /&gt;
            ],&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [&lt;br /&gt;
        {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
		{&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
    ],&lt;br /&gt;
	values: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;xxId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueSource: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3601</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3601"/>
		<updated>2025-11-09T23:59:24Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as sent to backend&lt;br /&gt;
	// requiredDataFields not needed in tableConfig as referenced in elements and sortFields&lt;br /&gt;
&lt;br /&gt;
	elements: {&lt;br /&gt;
        // add example of pageOutput element that references requiredDataLinkStepObjects&lt;br /&gt;
    },&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;xxId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanDeliveryMethodLinkId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueType: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         fieldName: &amp;quot;productId&amp;quot;,&lt;br /&gt;
         comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
         value: &amp;quot;userTag_1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: [ //* linkStepObjects to create main sort result's requiredData and sortFields&lt;br /&gt;
        // not needed at tableConfig level because can be built from table's elements and sortFields before sending to lib that converts to backend structure&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectA&amp;quot;, // no link, field in main objType (structure same linkPath but only one step)&lt;br /&gt;
        &amp;quot;userTag_LinkStepObjectB&amp;quot;, // has link&lt;br /&gt;
	],&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               fieldName: &amp;quot;locationNodeId&amp;quot;,&lt;br /&gt;
               comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               value: &amp;quot;userTag_7&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              fieldName: &amp;quot;sellOfferId&amp;quot;,&lt;br /&gt;
              comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
              value: &amp;quot;userTag_8&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		userTag_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        userTag_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                  comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  value: &amp;quot;userTag_2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
           aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
           sortFields: [ //* not sure&lt;br /&gt;
             &amp;quot;hash_sortFieldC&amp;quot;&lt;br /&gt;
           ],&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [&lt;br /&gt;
        &amp;quot;hash_sortFieldA&amp;quot;,&lt;br /&gt;
        &amp;quot;hash_sortFieldB&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    sortFieldObjects: {&lt;br /&gt;
         hash_sortFieldA: {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectB&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         hash_sortFieldB: {&lt;br /&gt;
             requiredDataLinkStepObjectId: &amp;quot;userTag_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
    },&lt;br /&gt;
	values: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;xxId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueSource: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Injecting_requestProperties_into_LinkPath_and_ComplexFilters&amp;diff=3593</id>
		<title>2025-04-14 - Injecting requestProperties into LinkPath and ComplexFilters</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Injecting_requestProperties_into_LinkPath_and_ComplexFilters&amp;diff=3593"/>
		<updated>2025-11-05T10:38:20Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
A standardized schema based method of adding requestProperties and combination filters into LinkPaths, for example for frontend table submission.&lt;br /&gt;
&lt;br /&gt;
Both top level combinationComplexFilters (eg parent location nodes for orderPrices) and perParentComplexFilter that are applied to each parent intermediate id record (eg delMethLink and payMethLink for orderPrices).&lt;br /&gt;
&lt;br /&gt;
* requestProperties can optionally be applied as filters in the main complexFilter, and also used when finding output fields (requiredData linkPaths)&lt;br /&gt;
* frontend sets whether a requestProperty table filter is applied or ignored for the main complexFilter (if ignored is only used in calculating output fields)&lt;br /&gt;
* allow for multiple requestProperty table filters for the same requestProperty, these can be used in different places, such as output fields that calculate the same field but with different requestProperties, or one value used for main complexFilter and another used to calculate output field value&lt;br /&gt;
* some requestProperty values come from the table's filter values, some come from the parent linkStep's intermediateIds&lt;br /&gt;
* requestProperties must be added at any linkStep where linkConfig is storageType=lambda and has requestProperties &lt;br /&gt;
&lt;br /&gt;
= Preparation tasks =&lt;br /&gt;
&lt;br /&gt;
== Backend ==&lt;br /&gt;
&lt;br /&gt;
* normalize filterElements&lt;br /&gt;
* do we send direction to linkConfig storageType=Lambda function, must send&lt;br /&gt;
* can we send different requestProperties per childComplexFilter translateIds process (if the linkConfig has requestProperties)?&lt;br /&gt;
* can we send different requestProperties per linkStep?&lt;br /&gt;
* side note: make sure SellOffer&amp;gt;OrderPrice link can handle both directions for relationship, if is OrderPrice&amp;gt;SellOffer then orderPriceId must exist and is a to-one relationship to sellOfferId&lt;br /&gt;
&lt;br /&gt;
== FrontEnd ==&lt;br /&gt;
&lt;br /&gt;
* each filter has a setting whether it combines with other filters with an AND or OR logicalOperator, OR filters also specify what orGroupId they are grouped together (separate group filterElements)&lt;br /&gt;
* (not sure already done) tableElements should have a fixed uuid elementId so for example we can reference a requestProperty filter inside the settings of a linkPath output field&lt;br /&gt;
* freeText element for header/footer table elements can set to displayOnly or can edit, also allow radio/select/checkbox options. These are not used in generating filters but can be used as the source for requestPropertyType=value requestProperties&lt;br /&gt;
&lt;br /&gt;
= Solution =&lt;br /&gt;
&lt;br /&gt;
== Backend ==&lt;br /&gt;
&lt;br /&gt;
linkConfigs of the storageType &amp;quot;lambda&amp;quot; eg SellOffer&amp;gt;OrderPrice can add requestProperties property that specifies what properties are sent/needed to the translateIds lambda function.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
links: [&lt;br /&gt;
	{&lt;br /&gt;
		storageResourceTags: [&amp;quot;aLambdaType&amp;quot;],&lt;br /&gt;
		from: {&lt;br /&gt;
			objType: {&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferStandard&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;SellOfferStandard&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
		to: {&lt;br /&gt;
			objType: {&lt;br /&gt;
				serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
		}&lt;br /&gt;
		requestProperties: {&lt;br /&gt;
			// to calculate orderPrices we need one identifier for each of the below objTypes&lt;br /&gt;
			tag_deliverTo: {&lt;br /&gt;
				requestPropertyType: &amp;quot;objectIdentifier&amp;quot;,&lt;br /&gt;
				objType: {&lt;br /&gt;
					serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
					objectType: &amp;quot;locationNode&amp;quot; // deliversToLocationNode&lt;br /&gt;
				},&lt;br /&gt;
                identifiersFieldName: &amp;quot;locationNodeId&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			tag_sellOfferPlan: {&lt;br /&gt;
				requestPropertyType: &amp;quot;objectIdentifier&amp;quot;,&lt;br /&gt;
				objType: {&lt;br /&gt;
					serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
					objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
                identifiersFieldName: &amp;quot;sellOfferPlanId&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			tag_sellOfferPlanDeliveryMethodLink: {&lt;br /&gt;
				requestPropertyType: &amp;quot;objectIdentifier&amp;quot;,&lt;br /&gt;
				objType: &lt;br /&gt;
					serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
					objectType: &amp;quot;sellOfferPlanDeliveryMethodLink&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
                identifiersFieldName: &amp;quot;sellOfferPlanDeliveryMethodLinkId&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			tag_sellOfferPlanUserPaymentMethodLink: {&lt;br /&gt;
				requestPropertyType: &amp;quot;objectIdentifier&amp;quot;,&lt;br /&gt;
				objType: &lt;br /&gt;
					serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
					objectType: &amp;quot;sellOfferPlanUserPaymentMethodLink&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
                identifiersFieldName: &amp;quot;sellOfferPlanUserPaymentMethodLinkId&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
		}&lt;br /&gt;
	}, //..&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make findParentLocationNodeIds a custom translateIds flow by adding a LocationNode&amp;lt;&amp;gt;LocationNode linkConfig with storageType &amp;quot;lambda&amp;quot;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
links: [&lt;br /&gt;
	{&lt;br /&gt;
		storageResourceTags: [&amp;quot;aLambdaType&amp;quot;],&lt;br /&gt;
		from: {&lt;br /&gt;
			objType: {&lt;br /&gt;
				serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;LocationNode&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
		to: {&lt;br /&gt;
			objType: {&lt;br /&gt;
				serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;LocationNode&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
		}&lt;br /&gt;
		requestProperties: {&lt;br /&gt;
			tag_traversalType: { // maybe remove requestPropertyTag and use this main tag as name of the requestProperty sent to translateIds&lt;br /&gt;
				requestPropertyType: &amp;quot;value&amp;quot;,&lt;br /&gt;
				requestPropertyTag: &amp;quot;traversalType&amp;quot;, // because name of the requestProperty sent to translateIds&lt;br /&gt;
				fixedOptions: [&amp;quot;parentNodes&amp;quot;, &amp;quot;childNodes&amp;quot;] // can add other types of traversals.&lt;br /&gt;
			},&lt;br /&gt;
		}&lt;br /&gt;
	}, //..&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* if link direction swaps can swap &amp;quot;parentNodes&amp;quot;|&amp;quot;childNodes&amp;quot; in translateIds flow, this allows translateIds both directions, example fixedOptions=parentNodes and direction &amp;quot;to&amp;quot; finds parent locationNodes, if direction swaps to &amp;quot;from&amp;quot; finds child locationNodes&lt;br /&gt;
&lt;br /&gt;
=== requestProperties used by main ComplexFilter ===&lt;br /&gt;
&lt;br /&gt;
requestProperties are used by complexFilter for translateIds requests. Set this per childComplexFilter would be best, then for each table filter that passes a linkConfig that has requestProperties we select which filter sets the requestProperty value (same as output fields below).&lt;br /&gt;
&lt;br /&gt;
If cannot set per childComplexFilter, probably need to set it for the main complexFilter request, so frontend tableConfig page will need to record all requestProperties used from all table filters and select which filter sets the requestProperty value.&lt;br /&gt;
&lt;br /&gt;
== Backend lib ==&lt;br /&gt;
&lt;br /&gt;
When building the filter from the frontend's array of filters, consider  &amp;quot;orGroupId&amp;quot; groupings.&lt;br /&gt;
&lt;br /&gt;
== Frontend ==&lt;br /&gt;
&lt;br /&gt;
=== Additional filter types ===&lt;br /&gt;
&lt;br /&gt;
The leaf setting of table filters that have links currently uses fieldname which filters by a field in the final objType. Add an &amp;quot;identifiers&amp;quot; setting, when chosen the value of the filter is considered the identifier value, and will be added to the filterElements as an &amp;quot;identifiers&amp;quot; type.&lt;br /&gt;
&lt;br /&gt;
=== Table filter config ===&lt;br /&gt;
&lt;br /&gt;
Use table filters to set values for requestProperties, normally these will filter the main complexFilter to only return main results that match the requestProperty values but allow filters to be ignored, when set to ignore they are not sent as filters for the main complexFilter.&lt;br /&gt;
&lt;br /&gt;
A table filter can then be applied within output field linkPaths by referencing the filters elementId.&lt;br /&gt;
&lt;br /&gt;
=== Table output field config ===&lt;br /&gt;
&lt;br /&gt;
When output field selects a linkConfig that has requestProperties we select where the requestPropertySource comes from, the top level options are requestPropertyValue, combinationComplexFilter, or perParentComplexFilter.&lt;br /&gt;
&lt;br /&gt;
==== requestPropertyValue ====&lt;br /&gt;
&lt;br /&gt;
If the requestPropertyType=objectIdentifier, for each requestProperties objType identifier fields iterate filter elements for any that match, need to select a filter elementId for all of the requestProperties identifier fields.&lt;br /&gt;
&lt;br /&gt;
If the requestPropertyType=value reference any table element that has a value.&lt;br /&gt;
&lt;br /&gt;
Example: LocationNode&amp;lt;&amp;gt;LocationNode link's traversalType requestProperty is set using a freeText editable table element. &lt;br /&gt;
&lt;br /&gt;
==== combinationComplexFilter ====&lt;br /&gt;
&lt;br /&gt;
Select initial objType from all objTypes.&lt;br /&gt;
&lt;br /&gt;
Build array of filters in the same structure as table filters, each filter has a path to the field being filtered, these get combined in new backend/frontend lib same as table filters to create filter elements.&lt;br /&gt;
&lt;br /&gt;
Values come from requestProperties rather than submitted filter values.&lt;br /&gt;
&lt;br /&gt;
Each filter element that passes a storageType &amp;quot;lambda&amp;quot; linkConfig sets where requestProperties come from same [[#Table output field config]].&lt;br /&gt;
&lt;br /&gt;
Example: to find parent locationNodes for SellOffer&amp;gt;OrderPrice linkStep we set the requestPropertySource=combinationComplexFilter, the initial objType is LocationNode, with one link to LocationNode using LocationNode&amp;lt;&amp;gt;LocationNode link. traversalType requestPropertySource=requestProperty pointing to a freeText editable filter in the main table.&lt;br /&gt;
&lt;br /&gt;
This link to LocationNode is the final step and sets it's value as an &amp;quot;identifiers&amp;quot; and points to a table level filter element to find the deliversTo LocationNodeId.&lt;br /&gt;
&lt;br /&gt;
The complexFilter will enter the first and only filter element which is a childComplexFilter, so it passes down to that filterElement. Inside the childComplexFilter is one filterElement that sets the one &amp;quot;identifiers&amp;quot;. The childComplexFilter then translates up to the top level complexFilter which performs the traversal to find parents starting from the childComplexFilter's locationNodeId as the source indentifier and traversalType from freeText filter.&lt;br /&gt;
&lt;br /&gt;
==== perParentComplexFilter ====&lt;br /&gt;
&lt;br /&gt;
Similar to combinationComplexFilter, create a complexFilter with array of filters.&lt;br /&gt;
&lt;br /&gt;
Has additional &amp;quot;parentIdentifier&amp;quot; leaf setting when the linkConfig target objType matches the main output fields parent objType, this is how we add the parentIdentifier anywhere into the complexFilter.&lt;br /&gt;
&lt;br /&gt;
Example: to find sellOfferPlanDeliveryMethodLinkIds create perParentComplexFilter with initial objType=sellOfferPlanDeliveryMethodLink.&lt;br /&gt;
&lt;br /&gt;
The main output field is using linkConfig sellOffers&amp;gt;OrderPrice, the main output field's parent objType is sellOffer.&lt;br /&gt;
&lt;br /&gt;
First filter for sellOfferPlanDeliveryMethodLink goes sellOfferPlanDeliveryMethodLink &amp;gt; SellOfferPlan &amp;gt; SellOffer, at this point the linkConfig target (SellOffer) matches the main output fields parent objType, so &amp;quot;parentIdentifier&amp;quot; becomes an option, this is selected, ensuring only sellOfferPlanDeliveryMethodLinks that connect to the parent sellOfferId will be returned.&lt;br /&gt;
&lt;br /&gt;
Second filter for sellOfferPlanDeliveryMethodLink goes sellOfferPlanDeliveryMethodLink &amp;gt; deliveryMethodStandard, and sets it's value as an &amp;quot;identifiers&amp;quot; and points to a table level filter element to find the deliversMethodId (try to allow array of deliversMethodIds).&lt;br /&gt;
&lt;br /&gt;
Third filter for sellOfferPlanDeliveryMethodLink goes sellOfferPlanDeliveryMethodLink &amp;gt; deliveryMethodStandard &amp;gt; rateTable &amp;gt; locationNode &amp;gt; locationNode, and is setup same as combinationComplexFilter example. This returns list of parent LocationNodeIds, rateTables that deliver there, and so on. &lt;br /&gt;
&lt;br /&gt;
Backend/frontend lib will combine the sections of Second and Third filters so they are separated by an &amp;quot;and&amp;quot; operator at the deliveryMethod level.&lt;br /&gt;
&lt;br /&gt;
= Optional =&lt;br /&gt;
&lt;br /&gt;
* (try to get this done) tableConfig has hidden/fixed filters that do not present as outputted table Elements (also outputted table Elements that cannot be edited)&lt;br /&gt;
* could add hops and weight requestProperties to LocationNode&amp;lt;&amp;gt;LocationNode translateIds request&lt;br /&gt;
* build in environment defaults, so for example shipTo locationNodeId comes from the lowest level locationNodeId in the current users primary address&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-13]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-13]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3589</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3589"/>
		<updated>2025-10-20T01:47:34Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as sent to backend&lt;br /&gt;
	&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;xxId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanDeliveryMethodLinkId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueType: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },,&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         fieldName: &amp;quot;productId&amp;quot;,&lt;br /&gt;
         comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
         value: &amp;quot;userTag_1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: { //* fields to create requiredData including linkPaths&lt;br /&gt;
		//* no link, field in main objType&lt;br /&gt;
		hash_requiredDataFieldA: {&lt;br /&gt;
		   linkStepObject: &amp;quot;hash_LinkStepObjectA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		//* has link&lt;br /&gt;
		hash_requiredDataFieldB: {&lt;br /&gt;
		   linkStepObject: &amp;quot;hash_LinkStepObjectB&amp;quot;,&lt;br /&gt;
			complexFilterCombinations: [&amp;quot;hash_complexFilterCombinationA&amp;quot;],&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
	},&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               fieldName: &amp;quot;locationNodeId&amp;quot;,&lt;br /&gt;
               comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               value: &amp;quot;userTag_7&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              fieldName: &amp;quot;sellOfferId&amp;quot;,&lt;br /&gt;
              comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
              value: &amp;quot;userTag_8&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		hash_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        hash_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                  comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  value: &amp;quot;userTag_2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
           aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
           sortFields: [ //* not sure&lt;br /&gt;
             &amp;quot;hash_sortFieldC&amp;quot;&lt;br /&gt;
           ],&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [ //* sortField main ==&amp;gt; not sure&lt;br /&gt;
       &amp;quot;hash_sortFieldA&amp;quot;,&lt;br /&gt;
    &amp;quot;hash_sortFieldB&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    sortFieldObjects: { //* not sure&lt;br /&gt;
      hash_sortFieldA: {&lt;br /&gt;
        fieldName: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
        dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hash_sortFieldB: {&lt;br /&gt;
        fieldName: &amp;quot;yyy&amp;quot;,&lt;br /&gt;
        dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hash_sortFieldC: {&lt;br /&gt;
        fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
	values: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;xxId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueType: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3588</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3588"/>
		<updated>2025-10-17T00:53:10Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as sent to backend&lt;br /&gt;
	&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;xxId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanDeliveryMethodLinkId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_8:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         fieldName: &amp;quot;productId&amp;quot;,&lt;br /&gt;
         comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
         value: &amp;quot;userTag_1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: { //* fields to create requiredData including linkPaths&lt;br /&gt;
		//* no link, field in main objType&lt;br /&gt;
		hash_requiredDataFieldA: {&lt;br /&gt;
		   linkStepObject: &amp;quot;hash_LinkStepObjectA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		//* has link&lt;br /&gt;
		hash_requiredDataFieldB: {&lt;br /&gt;
		   linkStepObject: &amp;quot;hash_LinkStepObjectB&amp;quot;,&lt;br /&gt;
			complexFilterCombinations: [&amp;quot;hash_complexFilterCombinationA&amp;quot;],&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
	},&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               fieldName: &amp;quot;locationNodeId&amp;quot;,&lt;br /&gt;
               comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               value: &amp;quot;userTag_7&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              fieldName: &amp;quot;sellOfferId&amp;quot;,&lt;br /&gt;
              comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
              value: &amp;quot;userTag_8&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		hash_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        hash_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                  comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  value: &amp;quot;userTag_2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
           aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
           sortFields: [ //* not sure&lt;br /&gt;
             &amp;quot;hash_sortFieldC&amp;quot;&lt;br /&gt;
           ],&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [ //* sortField main ==&amp;gt; not sure&lt;br /&gt;
       &amp;quot;hash_sortFieldA&amp;quot;,&lt;br /&gt;
    &amp;quot;hash_sortFieldB&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    sortFieldObjects: { //* not sure&lt;br /&gt;
      hash_sortFieldA: {&lt;br /&gt;
        fieldName: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
        dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hash_sortFieldB: {&lt;br /&gt;
        fieldName: &amp;quot;yyy&amp;quot;,&lt;br /&gt;
        dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hash_sortFieldC: {&lt;br /&gt;
        fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
	values: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;xxId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          valueType: 'perParentIdentifier',&lt;br /&gt;
          perParentIdentifierFieldname: 'sellOfferId'&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3585</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3585"/>
		<updated>2025-09-30T09:53:46Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as sent to backend&lt;br /&gt;
	&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;xxId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanDeliveryMethodLinkId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_8:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         fieldName: &amp;quot;productId&amp;quot;,&lt;br /&gt;
         comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
         value: &amp;quot;userTag_1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: { //* fields to create requiredData including linkPaths&lt;br /&gt;
		//* no link, field in main objType&lt;br /&gt;
		hash_requiredDataFieldA: {&lt;br /&gt;
		   linkStepObject: &amp;quot;hash_LinkStepObjectA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		//* has link&lt;br /&gt;
		hash_requiredDataFieldB: {&lt;br /&gt;
		   linkStepObject: &amp;quot;hash_LinkStepObjectB&amp;quot;,&lt;br /&gt;
			complexFilterCombinations: [&amp;quot;hash_complexFilterCombinationA&amp;quot;],&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
	},&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               fieldName: &amp;quot;locationNodeId&amp;quot;,&lt;br /&gt;
               comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               value: &amp;quot;userTag_7&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              fieldName: &amp;quot;sellOfferId&amp;quot;,&lt;br /&gt;
              comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
              value: &amp;quot;userTag_8&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		hash_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        hash_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           pathLinkType: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             direction: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                  comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  value: &amp;quot;userTag_2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
           aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
           sortFields: [ //* not sure&lt;br /&gt;
             &amp;quot;hash_sortFieldC&amp;quot;&lt;br /&gt;
           ],&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [ //* sortField main ==&amp;gt; not sure&lt;br /&gt;
       &amp;quot;hash_sortFieldA&amp;quot;,&lt;br /&gt;
    &amp;quot;hash_sortFieldB&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    sortFieldObjects: { //* not sure&lt;br /&gt;
      hash_sortFieldA: {&lt;br /&gt;
        fieldName: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
        dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hash_sortFieldB: {&lt;br /&gt;
        fieldName: &amp;quot;yyy&amp;quot;,&lt;br /&gt;
        dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hash_sortFieldC: {&lt;br /&gt;
        fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
	values: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;xxId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          value: null,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3584</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3584"/>
		<updated>2025-09-30T08:12:28Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as sent to backend&lt;br /&gt;
	&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;xxId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanDeliveryMethodLinkId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_8:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         fieldName: &amp;quot;productId&amp;quot;,&lt;br /&gt;
         comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
         value: &amp;quot;userTag_1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: { //* fields to create requiredData including linkPaths&lt;br /&gt;
		//* no link, field in main objType&lt;br /&gt;
		hash_requiredDataFieldA: {&lt;br /&gt;
		   linkStepObject: &amp;quot;hash_LinkStepObjectA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		//* has link&lt;br /&gt;
		hash_requiredDataFieldB: {&lt;br /&gt;
		   linkStepObject: &amp;quot;hash_LinkStepObjectB&amp;quot;,&lt;br /&gt;
			complexFilterCombinations: [&amp;quot;hash_complexFilterCombinationA&amp;quot;],&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
	},&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_localtionNode: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_locationNode&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;hasParentLocationNode&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
            },&lt;br /&gt;
            logical_locationNode: {&lt;br /&gt;
               logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
               previousLogicalElementId: &amp;quot;child_complexFilter_localtionNode&amp;quot;,&lt;br /&gt;
               nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
               objType: {&lt;br /&gt;
                serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;locationNode&amp;quot;&lt;br /&gt;
               },&lt;br /&gt;
               fieldName: &amp;quot;locationNodeId&amp;quot;,&lt;br /&gt;
               comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
               value: &amp;quot;userTag_7&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
       },&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
          objType: {&lt;br /&gt;
            serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
            objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          initialLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
          logicalElements: {&lt;br /&gt;
            child_complexFilter_1: {&lt;br /&gt;
              logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: null,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              childLogicalElementId: &amp;quot;logical_sellOffer&amp;quot;,&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              pathLinkType: {&lt;br /&gt;
                objType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
                }, &lt;br /&gt;
                relType: {&lt;br /&gt;
                  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                direction: &amp;quot;to&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              requestProperties: {&lt;br /&gt;
                tag_orderQuantity: &amp;quot;userTag_9&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
           },&lt;br /&gt;
           logical_sellOffer: {&lt;br /&gt;
              logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
              previousLogicalElementId: &amp;quot;child_complexFilter_1&amp;quot;,&lt;br /&gt;
              nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
              objType: {&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              fieldName: &amp;quot;sellOfferId&amp;quot;,&lt;br /&gt;
              comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
              value: &amp;quot;userTag_8&amp;quot;&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		hash_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        hash_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          link: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           link: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                  comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  value: &amp;quot;userTag_2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
           aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
           sortFields: [ //* not sure&lt;br /&gt;
             &amp;quot;hash_sortFieldC&amp;quot;&lt;br /&gt;
           ],&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [ //* sortField main ==&amp;gt; not sure&lt;br /&gt;
       &amp;quot;hash_sortFieldA&amp;quot;,&lt;br /&gt;
    &amp;quot;hash_sortFieldB&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    sortFieldObjects: { //* not sure&lt;br /&gt;
      hash_sortFieldA: {&lt;br /&gt;
        fieldName: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
        dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hash_sortFieldB: {&lt;br /&gt;
        fieldName: &amp;quot;yyy&amp;quot;,&lt;br /&gt;
        dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hash_sortFieldC: {&lt;br /&gt;
        fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
	values: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;xxId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          value: null,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3583</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3583"/>
		<updated>2025-09-30T08:07:15Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params in tableConfig =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
&lt;br /&gt;
	// .. other properties same as sent to backend&lt;br /&gt;
	&lt;br /&gt;
	values: {&lt;br /&gt;
		// values are shared between requestProperties and filter values. This set can be iterated to overwrite values using userTag to identify&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_5:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_6:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;xxId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanDeliveryMethodLinkId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_8:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_9:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_10:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_11:{&lt;br /&gt;
			defaultValue: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example params sent to backend =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
    initialLogicalElementId: &amp;quot;uuid_logical_1&amp;quot;,&lt;br /&gt;
    logicalElements: {&lt;br /&gt;
       uuid_logical_1: {&lt;br /&gt;
         logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
         previousLogicalElementId: null,&lt;br /&gt;
         nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
         objType: {&lt;br /&gt;
           serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
           objectType: &amp;quot;product&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
         fieldName: &amp;quot;productId&amp;quot;,&lt;br /&gt;
         comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
         value: &amp;quot;userTag_1&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
    },&lt;br /&gt;
	requiredDataFields: { //* fields to create requiredData including linkPaths&lt;br /&gt;
		//* no link, field in main objType&lt;br /&gt;
		hash_requiredDataFieldA: {&lt;br /&gt;
		   linkStepObject: &amp;quot;hash_LinkStepObjectA&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		//* has link&lt;br /&gt;
		hash_requiredDataFieldB: {&lt;br /&gt;
		   linkStepObject: &amp;quot;hash_LinkStepObjectB&amp;quot;,&lt;br /&gt;
			complexFilterCombinations: [&amp;quot;hash_complexFilterCombinationA&amp;quot;],&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
	},&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
			linkStepObjectA: &amp;quot;hash_LinkStepObjectB&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
			linkStepObjectA: &amp;quot;hash_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		hash_LinkStepObjectA: { //* requiredData no linkPath&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_1&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        hash_LinkStepObjectB: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_1&amp;quot;, &amp;quot;hash_linkStepB_2&amp;quot;, &amp;quot;hash_linkStepB_3&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepA_1:{&lt;br /&gt;
          fieldName: &amp;quot;xxx&amp;quot; &lt;br /&gt;
        },&lt;br /&gt;
        hash_linkStepB_1:{&lt;br /&gt;
          link: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
          },&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_2: {&lt;br /&gt;
           link: {&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relType: {&lt;br /&gt;
               serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
               relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
           },&lt;br /&gt;
           filterElements: { //* filter in linkPath&lt;br /&gt;
             objType: {&lt;br /&gt;
               serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
               objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
             },&lt;br /&gt;
             initialLogicalElementId: &amp;quot;logical_sellOffer_in_link&amp;quot;,&lt;br /&gt;
             logicalElements: {&lt;br /&gt;
               logical_sellOffer_in_link: {&lt;br /&gt;
                  logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
                  previousLogicalElementId: null,&lt;br /&gt;
                  nextLogicalElementId: null,&lt;br /&gt;
&lt;br /&gt;
                  objType: {&lt;br /&gt;
                    serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
                    objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  fieldName: &amp;quot;userId&amp;quot;,&lt;br /&gt;
                  comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
                  value: &amp;quot;userTag_2&amp;quot;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
          },&lt;br /&gt;
          requestProperties: {&lt;br /&gt;
            tag_deliverTo: &amp;quot;userTag_3&amp;quot;,&lt;br /&gt;
            tag_sellOfferPlan: &amp;quot;userTag_4&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanDeliveryMethodLink: &amp;quot;userTag_5&amp;quot;,&lt;br /&gt;
            // tag_sellOfferPlanUserPaymentMethodLink: &amp;quot;userTag_6&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        }, &lt;br /&gt;
        hash_linkStepB_3: {&lt;br /&gt;
           fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
           aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
           sortFields: [ //* not sure&lt;br /&gt;
             &amp;quot;hash_sortFieldC&amp;quot;&lt;br /&gt;
           ],&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	sortFields: [ //* sortField main ==&amp;gt; not sure&lt;br /&gt;
       &amp;quot;hash_sortFieldA&amp;quot;,&lt;br /&gt;
    &amp;quot;hash_sortFieldB&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    sortFieldObjects: { //* not sure&lt;br /&gt;
      hash_sortFieldA: {&lt;br /&gt;
        fieldName: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
        dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hash_sortFieldB: {&lt;br /&gt;
        fieldName: &amp;quot;yyy&amp;quot;,&lt;br /&gt;
        dataType: &amp;quot;number&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      hash_sortFieldC: {&lt;br /&gt;
        fieldName: &amp;quot;zzz&amp;quot;,&lt;br /&gt;
        dataType: &amp;quot;string&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
	values: {&lt;br /&gt;
		userTag_1:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_2:{&lt;br /&gt;
			value: &amp;quot;yy&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		userTag_3:{&lt;br /&gt;
			valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
            complexFilterCombinationId: &amp;quot;hash_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;xxId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_4:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		userTag_7: {&lt;br /&gt;
          value: &amp;quot;zz&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_8: {&lt;br /&gt;
          value: null,&lt;br /&gt;
        },&lt;br /&gt;
        userTag_9: {&lt;br /&gt;
          value: 2,&lt;br /&gt;
        },&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-08-21_-_ComplexFilter_SearchResult_Frontend_structure&amp;diff=3537</id>
		<title>2025-08-21 - ComplexFilter SearchResult Frontend structure</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-08-21_-_ComplexFilter_SearchResult_Frontend_structure&amp;diff=3537"/>
		<updated>2025-08-29T00:17:30Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Complex Filter]]&lt;br /&gt;
&lt;br /&gt;
[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
[[2024-06-26 - SearchResult linkpath]]&lt;br /&gt;
&lt;br /&gt;
[[2024-11-28 - OrderPrice using linkPath flows]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Creating visual representation of ComplexFilters for allowing frontend to create and manage.&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
&lt;br /&gt;
* Main complex filter used in tableData&lt;br /&gt;
* filters used at each level of LinkSteps in requiredData/Linkpaths&lt;br /&gt;
* perParentComplexFilters and combinationComplexFilters used in LinkPaths&lt;br /&gt;
* complexFilters used in categoryLinks&lt;br /&gt;
&lt;br /&gt;
= Considerations =&lt;br /&gt;
&lt;br /&gt;
* Want to be able to achieve all features of complexFilters including childComplexFilters, grouping and (and/or) operations&lt;br /&gt;
* all elementTypes such as identifier/translateIds/traversals&lt;br /&gt;
* tableOutput currently separates each filterDataField to have it's own filter path&lt;br /&gt;
* operations and grouping or operations can happen at any childComplexFilter level and between filters&lt;br /&gt;
&lt;br /&gt;
= Option 1: OrGroups =&lt;br /&gt;
&lt;br /&gt;
Attempted this approach but became too complex and messy when creating multiple levels of grouped and/or statements.&lt;br /&gt;
&lt;br /&gt;
* have an array of filters, each is a single path with an optional array of filterElements at each step&lt;br /&gt;
* each filter path sets its orGroup&lt;br /&gt;
* orGroups can be child of another orGroup, child orGroups only exist/group underneath their parent hierarchy&lt;br /&gt;
* orGroups group all filter paths using an OR operator&lt;br /&gt;
* however multiple filters at the same level within an orGroup (with a single filter path are considered the same orGroup) use AND operator&lt;br /&gt;
* if same level filters need to be separated by OR need to be separate *****check with Praew*****&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
Every frontend complexFilter case must:&lt;br /&gt;
&lt;br /&gt;
* allow adding multiple filter paths&lt;br /&gt;
* have orGroup hierarchy for filter paths&lt;br /&gt;
&lt;br /&gt;
= Option 2: OperationFilters =&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
* starts with the initial filter, choose type, eg logical or operation&lt;br /&gt;
* operation filter must go into each side and set with filter type and settings to use&lt;br /&gt;
* each side can then be an operation or a childComplexFilter&lt;br /&gt;
* adding operations chain filters at the same level&lt;br /&gt;
* childComplexFilters create a new level with a link&lt;br /&gt;
* Each operation sets it's operator (or/and)&lt;br /&gt;
* can open a new group (opening bracket) and close a group (closing bracket) at any point&lt;br /&gt;
* validate all groups at each level are opened and closed&lt;br /&gt;
* probably validate have at least one filterElement before closing&lt;br /&gt;
&lt;br /&gt;
== tableConfig ==&lt;br /&gt;
&lt;br /&gt;
* Build a single filter structure&lt;br /&gt;
* filterDataFields point to a filterElement, with additional settings if needed (eg identifying a value inside a traversal filterElement)&lt;br /&gt;
* 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&lt;br /&gt;
* 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&lt;br /&gt;
&lt;br /&gt;
== notes ==&lt;br /&gt;
&lt;br /&gt;
* separate validate uiFilter from saving final filterElement structure, so can validate while building the filter&lt;br /&gt;
* have a breadcrumb or other representation of the childComplexFilter steps that can be navigated through&lt;br /&gt;
* each childComplexFilter step have a list of the added uiFilterElements, each can be clicked on to edit (or list them all)&lt;br /&gt;
* when click on a childComplexFilter move to it's level of uiFilterElements&lt;br /&gt;
* whenever adding a component we input the previous element which allows us to shuffle references&lt;br /&gt;
* cannot add closeBracket when previousLogicalElementId type openBracket, childComplexFilter, or null&lt;br /&gt;
* must choose operator when previousLogicalElementId type not openBracket, childComplexFilter, or null&lt;br /&gt;
&lt;br /&gt;
Validate:&lt;br /&gt;
* all opening brackets at each level have equal number of closing brackets&lt;br /&gt;
* all element types have required data&lt;br /&gt;
* all childComplexFilters have at least 1 uiFilterElement (childLogicalElementId != null)&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
* Click to buildFilter, no filterElements exists&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: null,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_openBracket_1&lt;br /&gt;
* previousLogicalElementId = null&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: {&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_childComplex_1&lt;br /&gt;
* previousLogicalElementId = uuid_openBracket_1&lt;br /&gt;
* must choose link detail when adding childComplexFilter (relType/direction)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: {&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: {&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: null,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_childComplex_2&lt;br /&gt;
* OR operator&lt;br /&gt;
* previousLogicalElementId = uuid_childComplex_1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_1,&lt;br /&gt;
			childLogicalElementId: null,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_2: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_1,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: null,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_logical_1&lt;br /&gt;
* previousLogicalElementId = uuid_childComplex_1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_1,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_1: { // level: product&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_2: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_1,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: null,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_1: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_logical_2&lt;br /&gt;
* previousLogicalElementId = uuid_childComplex_1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_1,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_1: { // level: product&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_2: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_1,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_2,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_1: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_2: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_childComplex_3&lt;br /&gt;
* previousLogicalElementId = uuid_childComplex_2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_1,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_1: { // level: product&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_2: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_1,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_2,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_1: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_2: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_2: { // level: sellOffer&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_3&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_3: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_2,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: null,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOfferPlan&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_childComplex_4 and add uuid_logical_3&lt;br /&gt;
* previousLogicalElementId = uuid_childComplex_3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_1,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_1: { // level: product&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_2: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_1,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_2,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_1: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_2: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_2: { // level: sellOffer&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_3&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_3: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_2,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_childComplex_4,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOfferPlan&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_4: { // level: sellOfferPlan&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_3,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_3,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_3: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_4&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_logical_4&lt;br /&gt;
* OR operator&lt;br /&gt;
* previousLogicalElementId = uuid_logical_3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_1,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_1: { // level: product&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_2: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_1,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_2,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_1: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_2: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_2: { // level: sellOffer&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_3&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_3: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_2,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_childComplex_4,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOfferPlan&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_4: { // level: sellOfferPlan&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_3,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_3,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;deliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_3: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_4&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_3: { // level: deliveryMethodLink&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_3&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_logical_4&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_4: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_childComplex_5 and uuid_childComplex_6 and uuid_logical_5&lt;br /&gt;
* AND operator&lt;br /&gt;
* previousLogicalElementId = uuid_childComplex_3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_1,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_1: { // level: product&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_2: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_1,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_2,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_1: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_2: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_2: { // level: sellOffer&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_3&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_3: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_2,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_4,&lt;br /&gt;
			childLogicalElementId: uuid_childComplex_4,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOfferPlan&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_4: { // level: sellOfferPlan&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_3,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_3,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;deliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_3: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_4&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_3: { // level: deliveryMethodLink&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_3&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_logical_4&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_4: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
 		uuid_operation_4: { // level: sellOffer&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_3&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_5&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_5: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_4,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_childComplex_6,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOfferPlan&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_6: { // level: sellOfferPlan&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_5,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_5,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;deliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_5: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_6&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add closeBracket&lt;br /&gt;
* previousLogicalElementId = uuid_childComplex_2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_1,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_1: { // level: product&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_2: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_1,&lt;br /&gt;
			nextLogicalElementId: uuid_closeBracket_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_2,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_1: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_2: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_2: { // level: sellOffer&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_3&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_3: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_2,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_4,&lt;br /&gt;
			childLogicalElementId: uuid_childComplex_4,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOfferPlan&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_4: { // level: sellOfferPlan&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_3,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_3,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;deliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_3: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_4&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_3: { // level: deliveryMethodLink&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_3&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_logical_4&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_4: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
 		uuid_operation_4: { // level: sellOffer&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_3&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_5&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_5: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_4,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_childComplex_6,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOfferPlan&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_6: { // level: sellOfferPlan&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_5,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_5,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;deliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_5: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_6&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_closeBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;closeBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_2,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_childComplex_7 and uuid_logical_6&lt;br /&gt;
* AND operator&lt;br /&gt;
* previousLogicalElementId = uuid_closeBracket_1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: { // level: product&lt;br /&gt;
            objTyp: {&lt;br /&gt;
                objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
                serviceTag: &amp;quot;ProductManager&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_1,&lt;br /&gt;
            pathLinkType: {&lt;br /&gt;
              objTyp: {&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			  },&lt;br /&gt;
			  direction: &amp;quot;from&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_1: { // level: product&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_2: { // level: product&lt;br /&gt;
            objTyp: {&lt;br /&gt;
                objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
                serviceTag: &amp;quot;ProductManager&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_1,&lt;br /&gt;
			nextLogicalElementId: uuid_closeBracket_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_2,&lt;br /&gt;
            pathLinkType: {&lt;br /&gt;
              objTyp: {&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			  },&lt;br /&gt;
			  direction: &amp;quot;from&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_1: { // level: sellOffer&lt;br /&gt;
            objType: {&lt;br /&gt;
              objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_2: { // level: sellOffer&lt;br /&gt;
            objType: {&lt;br /&gt;
              objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_2: { // level: sellOffer&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_3&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_3: { // level: sellOffer&lt;br /&gt;
            objTyp: {&lt;br /&gt;
              objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_2,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_4,&lt;br /&gt;
			childLogicalElementId: uuid_childComplex_4,&lt;br /&gt;
            pathLinkType: {&lt;br /&gt;
              objTyp: {&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;,&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOfferPlan&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			  },&lt;br /&gt;
			  direction: &amp;quot;from&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_4: { // level: sellOfferPlan&lt;br /&gt;
            objTyp: {&lt;br /&gt;
              objectType: &amp;quot;sellOfferPlan&amp;quot;,&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferPlan&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_3,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_3,&lt;br /&gt;
            pathLinkType: {&lt;br /&gt;
              objTyp: {&lt;br /&gt;
                objectType: &amp;quot;deliveryMethodLink&amp;quot;,&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
              relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;deliveryMethodLink&amp;quot;&lt;br /&gt;
			  },&lt;br /&gt;
			  direction: &amp;quot;from&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_3: { // level: deliveryMethodLink&lt;br /&gt;
            objTyp: {&lt;br /&gt;
              objectType: &amp;quot;deliveryMethodLink&amp;quot;,&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferPlan&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_4&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_3: { // level: deliveryMethodLink&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_3&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_logical_4&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_4: { // level: deliveryMethodLink&lt;br /&gt;
            objTyp: {&lt;br /&gt;
              objectType: &amp;quot;deliveryMethodLink&amp;quot;,&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferPlan&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
 		uuid_operation_4: { // level: sellOffer&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_3&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_5&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_5: { // level: sellOffer&lt;br /&gt;
            objTyp: {&lt;br /&gt;
              objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_4,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_childComplex_6,&lt;br /&gt;
            pathLinkType: {&lt;br /&gt;
              objTyp: {&lt;br /&gt;
                objectType: &amp;quot;sellOfferPlan&amp;quot;,&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
			  relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOfferPlan&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			  },&lt;br /&gt;
			  direction: &amp;quot;from&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_6: { // level: sellOfferPlan&lt;br /&gt;
            objTyp: {&lt;br /&gt;
              objectType: &amp;quot;sellOfferPlan&amp;quot;,&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferPlan&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_5,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_5,&lt;br /&gt;
            pathLinkType: {&lt;br /&gt;
              objTyp: {&lt;br /&gt;
                objectType: &amp;quot;deliveryMethodLink&amp;quot;,&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferPlan&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
			  relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;deliveryMethodLink&amp;quot;&lt;br /&gt;
			  },&lt;br /&gt;
			  direction: &amp;quot;from&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_5: { // level: deliveryMethodLink&lt;br /&gt;
            objTyp: {&lt;br /&gt;
              objectType: &amp;quot;deliveryMethodLink&amp;quot;,&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferPlan&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_6&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_closeBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;closeBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_2,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		uuid_operation_5: { // level: product&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_closeBracket_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_7&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_7: { // level: product&lt;br /&gt;
            objTyp: {&lt;br /&gt;
                objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
                serviceTag: &amp;quot;ProductManager&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_5,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_6,&lt;br /&gt;
            pathLinkType: {&lt;br /&gt;
              objTyp: {&lt;br /&gt;
                objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
                serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
              },&lt;br /&gt;
			  relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			  },&lt;br /&gt;
			  direction: &amp;quot;from&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_6: { // level: sellOffer&lt;br /&gt;
            objTyp: {&lt;br /&gt;
              objectType: &amp;quot;sellOffer&amp;quot;,&lt;br /&gt;
              serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_7&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-08-21]]&lt;br /&gt;
[[Category:Working_documents - Complex Filter| 2025-08-21]]&lt;br /&gt;
[[Category:Working_documents - Search Results| 2025-08-21]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-08-21_-_ComplexFilter_SearchResult_Frontend_structure&amp;diff=3534</id>
		<title>2025-08-21 - ComplexFilter SearchResult Frontend structure</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-08-21_-_ComplexFilter_SearchResult_Frontend_structure&amp;diff=3534"/>
		<updated>2025-08-27T02:57:40Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Complex Filter]]&lt;br /&gt;
&lt;br /&gt;
[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
[[2024-06-26 - SearchResult linkpath]]&lt;br /&gt;
&lt;br /&gt;
[[2024-11-28 - OrderPrice using linkPath flows]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Creating visual representation of ComplexFilters for allowing frontend to create and manage.&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
&lt;br /&gt;
* Main complex filter used in tableData&lt;br /&gt;
* filters used at each level of LinkSteps in requiredData/Linkpaths&lt;br /&gt;
* perParentComplexFilters and combinationComplexFilters used in LinkPaths&lt;br /&gt;
* complexFilters used in categoryLinks&lt;br /&gt;
&lt;br /&gt;
= Considerations =&lt;br /&gt;
&lt;br /&gt;
* Want to be able to achieve all features of complexFilters including childComplexFilters, grouping and (and/or) operations&lt;br /&gt;
* all elementTypes such as identifier/translateIds/traversals&lt;br /&gt;
* tableOutput currently separates each filterDataField to have it's own filter path&lt;br /&gt;
* operations and grouping or operations can happen at any childComplexFilter level and between filters&lt;br /&gt;
&lt;br /&gt;
= Option 1: OrGroups =&lt;br /&gt;
&lt;br /&gt;
Attempted this approach but became too complex and messy when creating multiple levels of grouped and/or statements.&lt;br /&gt;
&lt;br /&gt;
* have an array of filters, each is a single path with an optional array of filterElements at each step&lt;br /&gt;
* each filter path sets its orGroup&lt;br /&gt;
* orGroups can be child of another orGroup, child orGroups only exist/group underneath their parent hierarchy&lt;br /&gt;
* orGroups group all filter paths using an OR operator&lt;br /&gt;
* however multiple filters at the same level within an orGroup (with a single filter path are considered the same orGroup) use AND operator&lt;br /&gt;
* if same level filters need to be separated by OR need to be separate *****check with Praew*****&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
Every frontend complexFilter case must:&lt;br /&gt;
&lt;br /&gt;
* allow adding multiple filter paths&lt;br /&gt;
* have orGroup hierarchy for filter paths&lt;br /&gt;
&lt;br /&gt;
= Option 2: OperationFilters =&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
* starts with the initial filter, choose type, eg logical or operation&lt;br /&gt;
* operation filter must go into each side and set with filter type and settings to use&lt;br /&gt;
* each side can then be an operation or a childComplexFilter&lt;br /&gt;
* adding operations chain filters at the same level&lt;br /&gt;
* childComplexFilters create a new level with a link&lt;br /&gt;
* Each operation sets it's operator (or/and)&lt;br /&gt;
* can open a new group (opening bracket) and close a group (closing bracket) at any point&lt;br /&gt;
* validate all groups at each level are opened and closed&lt;br /&gt;
* probably validate have at least one filterElement before closing&lt;br /&gt;
&lt;br /&gt;
== tableConfig ==&lt;br /&gt;
&lt;br /&gt;
* Build a single filter structure&lt;br /&gt;
* filterDataFields point to a filterElement, with additional settings if needed (eg identifying a value inside a traversal filterElement)&lt;br /&gt;
* 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&lt;br /&gt;
* 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&lt;br /&gt;
&lt;br /&gt;
== notes ==&lt;br /&gt;
&lt;br /&gt;
* separate validate uiFilter from saving final filterElement structure, so can validate while building the filter&lt;br /&gt;
* have a breadcrumb or other representation of the childComplexFilter steps that can be navigated through&lt;br /&gt;
* each childComplexFilter step have a list of the added uiFilterElements, each can be clicked on to edit (or list them all)&lt;br /&gt;
* when click on a childComplexFilter move to it's level of uiFilterElements&lt;br /&gt;
* whenever adding a component we input the previous element which allows us to shuffle references&lt;br /&gt;
* cannot add closeBracket when previousLogicalElementId type openBracket, childComplexFilter, or null&lt;br /&gt;
* must choose operator when previousLogicalElementId type not openBracket, childComplexFilter, or null&lt;br /&gt;
&lt;br /&gt;
Validate:&lt;br /&gt;
* all opening brackets at each level have equal number of closing brackets&lt;br /&gt;
* all element types have required data&lt;br /&gt;
* all childComplexFilters have at least 1 uiFilterElement (childLogicalElementId != null)&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
* Click to buildFilter, no filterElements exists&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: null,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_openBracket_1&lt;br /&gt;
* previousLogicalElementId = null&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: {&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_childComplex_1&lt;br /&gt;
* previousLogicalElementId = uuid_openBracket_1&lt;br /&gt;
* must choose link detail when adding childComplexFilter (relType/direction)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: {&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: {&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: null,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_childComplex_2&lt;br /&gt;
* OR operator&lt;br /&gt;
* previousLogicalElementId = uuid_childComplex_1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_1,&lt;br /&gt;
			childLogicalElementId: null,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_2: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_1,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: null,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_logical_1&lt;br /&gt;
* previousLogicalElementId = uuid_childComplex_1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_1,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_1: { // level: product&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_2: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_1,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: null,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_1: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_logical_2&lt;br /&gt;
* previousLogicalElementId = uuid_childComplex_1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_1,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_1: { // level: product&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_2: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_1,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_2,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_1: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_2: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_childComplex_3&lt;br /&gt;
* previousLogicalElementId = uuid_childComplex_2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_1,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_1: { // level: product&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_2: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_1,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_2,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_1: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_2: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_2: { // level: sellOffer&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_3&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_3: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_2,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: null,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOfferPlan&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_childComplex_4 and add uuid_logical_3&lt;br /&gt;
* previousLogicalElementId = uuid_childComplex_3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_1,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_1: { // level: product&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_2: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_1,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_2,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_1: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_2: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_2: { // level: sellOffer&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_3&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_3: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_2,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_childComplex_4,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOfferPlan&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_4: { // level: sellOfferPlan&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_3,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_3,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_3: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_4&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_logical_4&lt;br /&gt;
* OR operator&lt;br /&gt;
* previousLogicalElementId = uuid_logical_3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_1,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_1: { // level: product&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_2: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_1,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_2,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_1: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_2: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_2: { // level: sellOffer&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_3&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_3: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_2,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_childComplex_4,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOfferPlan&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_4: { // level: sellOfferPlan&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_3,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_3,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;deliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_3: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_4&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_3: { // level: deliveryMethodLink&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_3&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_logical_4&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_4: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_childComplex_5 and uuid_childComplex_6 and uuid_logical_5&lt;br /&gt;
* AND operator&lt;br /&gt;
* previousLogicalElementId = uuid_childComplex_3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_1,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_1: { // level: product&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_2: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_1,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_2,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_1: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_2: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_2: { // level: sellOffer&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_3&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_3: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_2,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_4,&lt;br /&gt;
			childLogicalElementId: uuid_childComplex_4,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOfferPlan&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_4: { // level: sellOfferPlan&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_3,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_3,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;deliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_3: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_4&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_3: { // level: deliveryMethodLink&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_3&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_logical_4&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_4: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
 		uuid_operation_4: { // level: sellOffer&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_3&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_5&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_5: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_4,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_childComplex_6,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOfferPlan&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_6: { // level: sellOfferPlan&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_5,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_5,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;deliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_5: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_6&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add closeBracket&lt;br /&gt;
* previousLogicalElementId = uuid_childComplex_2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_1,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_1: { // level: product&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_2: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_1,&lt;br /&gt;
			nextLogicalElementId: uuid_closeBracket_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_2,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_1: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_2: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_2: { // level: sellOffer&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_3&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_3: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_2,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_4,&lt;br /&gt;
			childLogicalElementId: uuid_childComplex_4,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOfferPlan&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_4: { // level: sellOfferPlan&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_3,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_3,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;deliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_3: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_4&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_3: { // level: deliveryMethodLink&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_3&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_logical_4&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_4: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
 		uuid_operation_4: { // level: sellOffer&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_3&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_5&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_5: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_4,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_childComplex_6,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOfferPlan&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_6: { // level: sellOfferPlan&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_5,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_5,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;deliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_5: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_6&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_closeBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_2,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add uuid_childComplex_7 and uuid_logical_6&lt;br /&gt;
* AND operator&lt;br /&gt;
* previousLogicalElementId = uuid_closeBracket_1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
let exampleData = {&lt;br /&gt;
	objType {&lt;br /&gt;
		objectType: &amp;quot;product&amp;quot;,&lt;br /&gt;
		serviceTag: &amp;quot;productManager&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    initialLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
	logicalElements: {&lt;br /&gt;
		uuid_openBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: null,&lt;br /&gt;
			nextLogicalElementId: uuid_childComplex_1,&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_openBracket_1,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_1,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_1: { // level: product&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_2: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_1,&lt;br /&gt;
			nextLogicalElementId: uuid_closeBracket_1,&lt;br /&gt;
			childLogicalElementId: uuid_logical_2,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_1: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_2: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_2: { // level: sellOffer&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_3&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_3: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_2,&lt;br /&gt;
			nextLogicalElementId: uuid_operation_4,&lt;br /&gt;
			childLogicalElementId: uuid_childComplex_4,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOfferPlan&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_4: { // level: sellOfferPlan&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_3,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_3,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;deliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_3: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_4&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_operation_3: { // level: deliveryMethodLink&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_logical_3&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_logical_4&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_4: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_operation_2&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
 		uuid_operation_4: { // level: sellOffer&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_3&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_5&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_5: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_4,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_childComplex_6,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOfferPlan&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;sellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_6: { // level: sellOfferPlan&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_5,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_5,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;deliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_5: { // level: deliveryMethodLink&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_6&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
		uuid_closeBracket_1: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;openBracket&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_childComplex_2,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		uuid_operation_5: { // level: product&lt;br /&gt;
    		logicalElementType: &amp;quot;operation&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_closeBracket_1&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;uuid_childComplex_7&amp;quot;,&lt;br /&gt;
			operation: &amp;quot;or&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_childComplex_7: { // level: product&lt;br /&gt;
			logicalElementType: &amp;quot;childComplexFilter&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: uuid_operation_5,&lt;br /&gt;
			nextLogicalElementId: null,&lt;br /&gt;
			childLogicalElementId: uuid_logical_6,&lt;br /&gt;
			relType: {&lt;br /&gt;
				relationshipTag: &amp;quot;hasSellOffer&amp;quot;,&lt;br /&gt;
				serviceTag: &amp;quot;SellOfferManager&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			direction: &amp;quot;from&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		uuid_logical_6: { // level: sellOffer&lt;br /&gt;
			logicalElementType: &amp;quot;logical&amp;quot;,&lt;br /&gt;
			previousLogicalElementId: &amp;quot;uuid_childComplex_7&amp;quot;,&lt;br /&gt;
			nextLogicalElementId: &amp;quot;null&amp;quot;,&lt;br /&gt;
            fieldName: &amp;quot;fieldx&amp;quot;,&lt;br /&gt;
            comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
            defaultValue: 50&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-08-21]]&lt;br /&gt;
[[Category:Working_documents - Complex Filter| 2025-08-21]]&lt;br /&gt;
[[Category:Working_documents - Search Reasults| 2025-08-21]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3390</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3390"/>
		<updated>2025-07-22T05:08:59Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	mainComplexFilterUnits: { // used to create main complexFilter&lt;br /&gt;
		uuid_FilterUnitA: { // select link step from main objType&lt;br /&gt;
			linkStepObject: &amp;quot;hash_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             parentOrGroup: &amp;quot;uuid_OrGroupA&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
        uuid_FilterUnitB: { // select own fieldname of main objType&lt;br /&gt;
          linkStepObject: &amp;quot;hash_LinkStepObjectD&amp;quot;,&lt;br /&gt;
          parentOrGtoup: &amp;quot;uuid_orGroupA&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
	},&lt;br /&gt;
	mainComplexFilterOrGroups: { //* group and operation filters for each mainComplexFilterUnits&lt;br /&gt;
		uuid_OrGroupA: {&lt;br /&gt;
			filterUnitIds: [&amp;quot;uuid_FilterUnitA&amp;quot;, &amp;quot;uuid_FilterUnitB&amp;quot;],&lt;br /&gt;
			parentOrGroup: &amp;quot;&amp;quot;,&lt;br /&gt;
			childOrGroups: []&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	filterLinkStepObjects: {&lt;br /&gt;
		hash_LinkStepObjectA: { // main complexFilter find orderPrice&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_A&amp;quot;, &amp;quot;hash_linkStepA_B&amp;quot;, &amp;quot;hash_linkStepA_C&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
		hash_LinkStepObjectB: { // complexFilterCombinations for parentLocationNodes&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;locatons&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;LocationNode&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_A&amp;quot;,&amp;quot;hash_linkStepB_B&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
		hash_LinkStepObjectC: { // perParentCombinations&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;SellOffer&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepC_A&amp;quot;, &amp;quot;hash_linkStepC_B&amp;quot;, &amp;quot;hash_linkStepC_C&amp;quot;, &amp;quot;hash_linkStepC_D&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        hash_LinkStepObjectD:{&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepD_A&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	filterLinkSteps: {&lt;br /&gt;
		hash_linkStepA_A: { //one step: Product &amp;gt; SellOffer&lt;br /&gt;
		  link: {&lt;br /&gt;
			objType: {&lt;br /&gt;
			  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
			  objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
		  },&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepA_B: { //one step: SellOffer &amp;gt; OrderPrice&lt;br /&gt;
			link: {&lt;br /&gt;
				objType: {&lt;br /&gt;
				  serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
				  objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				relType: {&lt;br /&gt;
				  serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
				  relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			// tableConfig sets &amp;quot;defaultRequestPropertyValues&amp;quot; for each, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultRequestPropertyValues&lt;br /&gt;
			requestProperties:{&lt;br /&gt;
				tag_deliverTo: hash_requestPropertyA,&lt;br /&gt;
				tag_sellOfferPlan: hash_requestPropertyB,&lt;br /&gt;
				tag_sellOfferPlanDeliveryMethodLink: hash_requestPropertyC,&lt;br /&gt;
				tag_sellOfferPlanUserPaymentMethodLink: hash_requestPropertyD,&lt;br /&gt;
			},&lt;br /&gt;
            filterElementUnitIds: [&amp;quot;hash_filterElementUnitF&amp;quot;]&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepA_C: { //final OrderPrice step&lt;br /&gt;
			filterElementUnitIds: [&amp;quot;hash_filterElementUnitA&amp;quot;]&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepB_A: { //one step: LocationNode &amp;gt; LocationNode&lt;br /&gt;
		  link: {&lt;br /&gt;
			objType: {&lt;br /&gt;
			  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			  objectType: &amp;quot;LocationNode&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;isParentLocationNode&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
		  },&lt;br /&gt;
		  // tableConfig sets &amp;quot;defaultRequestPropertyValues&amp;quot; for each, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultRequestPropertyValues&lt;br /&gt;
		  requestProperties:{&lt;br /&gt;
				tag_traversalType: hash_requestPropertyE,&lt;br /&gt;
		  }&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepB_B: { //final parent LocationNodes step&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepC_A: { //one step: SellOffer &amp;gt; SellOfferPlan&lt;br /&gt;
		  link: {&lt;br /&gt;
			objType: {&lt;br /&gt;
			  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
			  objectType: &amp;quot;SellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
		  },&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepC_B: { //one step: SellOfferPlan &amp;gt; DeliveryMethodLink&lt;br /&gt;
		  link: {&lt;br /&gt;
			objType: {&lt;br /&gt;
			  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
			  objectType: &amp;quot;DeliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
		  },&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepC_C: { //one step: SellOfferPlan &amp;gt; DeliveryMethodLink&lt;br /&gt;
		  link: {&lt;br /&gt;
			objType: {&lt;br /&gt;
			  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
			  objectType: &amp;quot;DeliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
		  },&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepC_D: { //one step: DeliveryMethodLink &amp;gt; DeliveryMethod&lt;br /&gt;
		  link: {&lt;br /&gt;
			objType: {&lt;br /&gt;
			  serviceTag: &amp;quot;DeliveryMethodManager&amp;quot;,&lt;br /&gt;
			  objectType: &amp;quot;DeliveryMethod&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;isDeliveryMethod&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
		  },&lt;br /&gt;
		  filterElementUnitIds: [&amp;quot;hash_filterElementUnitB&amp;quot;]&lt;br /&gt;
		},&lt;br /&gt;
        hash_linkStepD_A:{&lt;br /&gt;
           filterElementUnitIds: [&amp;quot;hash_filterElementUnitE&amp;quot;]&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	requiredDataFields: { //* fields to create requiredData including linkPaths&lt;br /&gt;
		//* no link, field in main objType&lt;br /&gt;
		hash_requiredDataFieldA: {&lt;br /&gt;
			fieldname: &amp;quot;&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		//* has link&lt;br /&gt;
		hash_requiredDataFieldB: {&lt;br /&gt;
			linkStepObject: &amp;quot;hash_LinkStepObjectD&amp;quot;,&lt;br /&gt;
            fieldname: &amp;quot; &amp;quot;,&lt;br /&gt;
			complexFilterCombinations: [&amp;quot;hash_complexFilterCombinationA&amp;quot;],&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
	},&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
			linkStepObjectA: &amp;quot;hash_LinkStepObjectB&amp;quot;,&lt;br /&gt;
			initialIdentifiers: { // tableConfig sets &amp;quot;defaultInitialIdentifiers, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultInitialIdentifiers&lt;br /&gt;
				&amp;quot;locationNodeId&amp;quot;: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
			linkStepObjectA: &amp;quot;hash_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		hash_LinkStepObjectD: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepD_A&amp;quot;, &amp;quot;hash_linkStepD_B&amp;quot;, &amp;quot;hash_linkStepA_C&amp;quot;],&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepD_A: { //one step: Product &amp;gt; SellOffer&lt;br /&gt;
		  link: {&lt;br /&gt;
			objType: {&lt;br /&gt;
			  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
			  objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
		  },&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepD_B: { //one step: SellOffer &amp;gt; OrderPrice&lt;br /&gt;
			link: {&lt;br /&gt;
				objType: {&lt;br /&gt;
				  serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
				  objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				relType: {&lt;br /&gt;
				  serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
				  relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			// tableConfig sets &amp;quot;defaultRequestPropertyValues&amp;quot; for each, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultRequestPropertyValues&lt;br /&gt;
			requestProperties:{&lt;br /&gt;
				tag_deliverTo: hash_requestPropertyF,&lt;br /&gt;
				tag_sellOfferPlanDeliveryMethodLink: hash_requestPropertyG,&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepA_C: { //final OrderPrice step&lt;br /&gt;
			filterElementUnitIds: [&amp;quot;hash_filterElementUnitA&amp;quot;]&lt;br /&gt;
			aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
			sortFields: &amp;quot;hash_sortFieldA&amp;quot;,&lt;br /&gt;
			// ... other linkPath.linkStep settings here&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	sortFields:{&lt;br /&gt;
		hash_sortFieldA: {&lt;br /&gt;
			// ..&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	filterElementUnits: {&lt;br /&gt;
		hash_filterElementUnitA:{&lt;br /&gt;
			objType: { &lt;br /&gt;
				serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
			},		&lt;br /&gt;
			fieldname: &amp;quot;orderTotal&amp;quot;,&lt;br /&gt;
			comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
			value: &amp;quot;xxx&amp;quot;, // tableConfig sets &amp;quot;defaultFilterElementUnitValue&amp;quot;, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultFilterElementUnitValue&lt;br /&gt;
		},&lt;br /&gt;
		hash_filterElementUnitB:{&lt;br /&gt;
			objType: { &lt;br /&gt;
				serviceTag: &amp;quot;DeliveryMethodManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;deliveryMethod&amp;quot;&lt;br /&gt;
			},		&lt;br /&gt;
			fieldname: &amp;quot;deliveryMethodId&amp;quot;,&lt;br /&gt;
			comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
			value: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        hash_filterElementUnitD: {&lt;br /&gt;
			objType: { &lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},		&lt;br /&gt;
         	fieldname: &amp;quot;productId&amp;quot;,&lt;br /&gt;
			comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
			value: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
       },&lt;br /&gt;
        hash_filterElementUnitE: {&lt;br /&gt;
			objType: { &lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},		&lt;br /&gt;
         	fieldname: &amp;quot;productId&amp;quot;,&lt;br /&gt;
			comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
			value: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
       }&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	requestProperties: {&lt;br /&gt;
		hash_requestPropertyA:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		hash_requestPropertyB:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		hash_requestPropertyC:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		hash_requestPropertyD:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		hash_requestPropertyE:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		hash_requestPropertyF:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		hash_requestPropertyG:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanDeliveryMethodLinkId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3370</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3370"/>
		<updated>2025-07-18T04:27:47Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	mainComplexFilterUnits: { // used to create main complexFilter&lt;br /&gt;
		uuid_FilterUnitA: { // select link step from main objType&lt;br /&gt;
			linkStepObject: &amp;quot;hash_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             parentOrGroup: &amp;quot;uuid_OrGroupA&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
        uuid_FilterUnitB: { // select own fieldname of main objType&lt;br /&gt;
          linkStepObject: &amp;quot;hash_LinkStepObjectD&amp;quot;,&lt;br /&gt;
          parentOrGtoup: &amp;quot;uuid_orGroupA&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
	},&lt;br /&gt;
	mainComplexFilterOrGroups: { //* group and operation filters for each mainComplexFilterUnits&lt;br /&gt;
		uuid_OrGroupA: {&lt;br /&gt;
			filterElementUnitIds: [&amp;quot;uuid_FilterA&amp;quot;, &amp;quot;uuid_FilterUnitB&amp;quot;],&lt;br /&gt;
			parentOrGroup: &amp;quot;&amp;quot;,&lt;br /&gt;
			childOrGroup: []&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	filterLinkStepObjects: {&lt;br /&gt;
		hash_LinkStepObjectA: { // main complexFilter find orderPrice&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepA_A&amp;quot;, &amp;quot;hash_linkStepA_B&amp;quot;, &amp;quot;hash_linkStepA_C&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
		hash_LinkStepObjectB: { // complexFilterCombinations for parentLocationNodes&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;locatons&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;LocationNode&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepB_A&amp;quot;,&amp;quot;hash_linkStepB_B&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
		hash_LinkStepObjectC: { // perParentCombinations&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;SellOffer&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepC_A&amp;quot;, &amp;quot;hash_linkStepC_B&amp;quot;, &amp;quot;hash_linkStepC_C&amp;quot;, &amp;quot;hash_linkStepC_D&amp;quot;],&lt;br /&gt;
		},&lt;br /&gt;
        hash_LinkStepObjectD:{&lt;br /&gt;
            initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepD_A&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	filterLinkSteps: {&lt;br /&gt;
		hash_linkStepA_A: { //one step: Product &amp;gt; SellOffer&lt;br /&gt;
		  link: {&lt;br /&gt;
			objType: {&lt;br /&gt;
			  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
			  objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
		  },&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepA_B: { //one step: SellOffer &amp;gt; OrderPrice&lt;br /&gt;
			link: {&lt;br /&gt;
				objType: {&lt;br /&gt;
				  serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
				  objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				relType: {&lt;br /&gt;
				  serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
				  relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			// tableConfig sets &amp;quot;defaultRequestPropertyValues&amp;quot; for each, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultRequestPropertyValues&lt;br /&gt;
			requestProperties:{&lt;br /&gt;
				tag_deliverTo: hash_requestPropertyA,&lt;br /&gt;
				tag_sellOfferPlan: hash_requestPropertyB,&lt;br /&gt;
				tag_sellOfferPlanDeliveryMethodLink: hash_requestPropertyC,&lt;br /&gt;
				tag_sellOfferPlanUserPaymentMethodLink: hash_requestPropertyD,&lt;br /&gt;
			},&lt;br /&gt;
            filterElementUnitIds: [&amp;quot;hash_filterElementUnitF&amp;quot;]&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepA_C: { //final OrderPrice step&lt;br /&gt;
			filterElementUnitIds: [&amp;quot;hash_filterElementUnitA&amp;quot;]&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepB_A: { //one step: LocationNode &amp;gt; LocationNode&lt;br /&gt;
		  link: {&lt;br /&gt;
			objType: {&lt;br /&gt;
			  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			  objectType: &amp;quot;LocationNode&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;isParentLocationNode&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
		  },&lt;br /&gt;
		  // tableConfig sets &amp;quot;defaultRequestPropertyValues&amp;quot; for each, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultRequestPropertyValues&lt;br /&gt;
		  requestProperties:{&lt;br /&gt;
				tag_traversalType: hash_requestPropertyE,&lt;br /&gt;
		  }&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepB_B: { //final parent LocationNodes step&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepC_A: { //one step: SellOffer &amp;gt; SellOfferPlan&lt;br /&gt;
		  link: {&lt;br /&gt;
			objType: {&lt;br /&gt;
			  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
			  objectType: &amp;quot;SellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
		  },&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepC_B: { //one step: SellOfferPlan &amp;gt; DeliveryMethodLink&lt;br /&gt;
		  link: {&lt;br /&gt;
			objType: {&lt;br /&gt;
			  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
			  objectType: &amp;quot;DeliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
		  },&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepC_C: { //one step: SellOfferPlan &amp;gt; DeliveryMethodLink&lt;br /&gt;
		  link: {&lt;br /&gt;
			objType: {&lt;br /&gt;
			  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
			  objectType: &amp;quot;DeliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
		  },&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepC_D: { //one step: DeliveryMethodLink &amp;gt; DeliveryMethod&lt;br /&gt;
		  link: {&lt;br /&gt;
			objType: {&lt;br /&gt;
			  serviceTag: &amp;quot;DeliveryMethodManager&amp;quot;,&lt;br /&gt;
			  objectType: &amp;quot;DeliveryMethod&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;isDeliveryMethod&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
		  },&lt;br /&gt;
		  filterElementUnitIds: [&amp;quot;hash_filterElementUnitB&amp;quot;]&lt;br /&gt;
		},&lt;br /&gt;
        hash_linkStepD_A:{&lt;br /&gt;
           filterElementUnitIds: [&amp;quot;hash_filterElementUnitE&amp;quot;]&lt;br /&gt;
        }&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	requiredDataFields: { //* fields to create requiredData including linkPaths&lt;br /&gt;
		//* no link, field in main objType&lt;br /&gt;
		hash_requiredDataFieldA: {&lt;br /&gt;
			fieldname: &amp;quot;&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		//* has link&lt;br /&gt;
		hash_requiredDataFieldB: {&lt;br /&gt;
			linkStepObject: &amp;quot;hash_LinkStepObjectD&amp;quot;,&lt;br /&gt;
            fieldname: &amp;quot; &amp;quot;,&lt;br /&gt;
			complexFilterCombinations: [&amp;quot;hash_complexFilterCombinationA&amp;quot;],&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
	},&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		hash_complexFilterCombinationA: {&lt;br /&gt;
			linkStepObjectA: &amp;quot;hash_LinkStepObjectB&amp;quot;,&lt;br /&gt;
			initialIdentifiers: { // tableConfig sets &amp;quot;defaultInitialIdentifiers, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultInitialIdentifiers&lt;br /&gt;
				&amp;quot;locationNodeId&amp;quot;: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		hash_perParentCombinationA: {&lt;br /&gt;
			linkStepObjectA: &amp;quot;hash_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		hash_LinkStepObjectD: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			linkSteps: [&amp;quot;hash_linkStepD_A&amp;quot;, &amp;quot;hash_linkStepD_B&amp;quot;, &amp;quot;hash_linkStepA_C&amp;quot;],&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkSteps: {&lt;br /&gt;
		hash_linkStepD_A: { //one step: Product &amp;gt; SellOffer&lt;br /&gt;
		  link: {&lt;br /&gt;
			objType: {&lt;br /&gt;
			  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
			  objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relType: {&lt;br /&gt;
			  serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
			  relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
		  },&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepD_B: { //one step: SellOffer &amp;gt; OrderPrice&lt;br /&gt;
			link: {&lt;br /&gt;
				objType: {&lt;br /&gt;
				  serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
				  objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				relType: {&lt;br /&gt;
				  serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
				  relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
				},&lt;br /&gt;
				relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
			},&lt;br /&gt;
			// tableConfig sets &amp;quot;defaultRequestPropertyValues&amp;quot; for each, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultRequestPropertyValues&lt;br /&gt;
			requestProperties:{&lt;br /&gt;
				tag_deliverTo: hash_requestPropertyF,&lt;br /&gt;
				tag_sellOfferPlanDeliveryMethodLink: hash_requestPropertyG,&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		hash_linkStepA_C: { //final OrderPrice step&lt;br /&gt;
			filterElementUnitIds: [&amp;quot;hash_filterElementUnitA&amp;quot;]&lt;br /&gt;
			aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
			sortFields: &amp;quot;hash_sortFieldA&amp;quot;,&lt;br /&gt;
			// ... other linkPath.linkStep settings here&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	sortFields:{&lt;br /&gt;
		hash_sortFieldA: {&lt;br /&gt;
			// ..&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	filterElementUnits: {&lt;br /&gt;
		hash_filterElementUnitA:{&lt;br /&gt;
			objType: { &lt;br /&gt;
				serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
			},		&lt;br /&gt;
			fieldname: &amp;quot;orderTotal&amp;quot;,&lt;br /&gt;
			comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
			value: &amp;quot;xxx&amp;quot;, // tableConfig sets &amp;quot;defaultFilterElementUnitValue&amp;quot;, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultFilterElementUnitValue&lt;br /&gt;
		},&lt;br /&gt;
		hash_filterElementUnitB:{&lt;br /&gt;
			objType: { &lt;br /&gt;
				serviceTag: &amp;quot;DeliveryMethodManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;deliveryMethod&amp;quot;&lt;br /&gt;
			},		&lt;br /&gt;
			fieldname: &amp;quot;deliveryMethodId&amp;quot;,&lt;br /&gt;
			comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
			value: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        hash_filterElementUnitD: {&lt;br /&gt;
			objType: { &lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},		&lt;br /&gt;
         	fieldname: &amp;quot;productId&amp;quot;,&lt;br /&gt;
			comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
			value: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
       },&lt;br /&gt;
        hash_filterElementUnitE: {&lt;br /&gt;
			objType: { &lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},		&lt;br /&gt;
         	fieldname: &amp;quot;productId&amp;quot;,&lt;br /&gt;
			comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
			value: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
       }&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	requestProperties: {&lt;br /&gt;
		hash_requestPropertyA:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		hash_requestPropertyB:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		hash_requestPropertyC:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		hash_requestPropertyD:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		hash_requestPropertyE:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		hash_requestPropertyF:{&lt;br /&gt;
			value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		hash_requestPropertyG:{&lt;br /&gt;
			valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
            perParentCombinationId: &amp;quot;hash_perParentCombinationA&amp;quot;,&lt;br /&gt;
            identifierFieldName: &amp;quot;sellOfferPlanDeliveryMethodLinkId&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-04-14]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-04-14]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3310</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3310"/>
		<updated>2025-07-02T06:45:28Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	mainComplexFilterUnits: { // used to create main complexFilter&lt;br /&gt;
		uuid_FilterUnitA: { // select link step from main objType&lt;br /&gt;
			linkStepObject: &amp;quot;uuid_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             parentOrGroup: &amp;quot;uuid_OrGroupA&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
        uuid_FilterUnitB: { // select own fieldname of main objType&lt;br /&gt;
          filterElementUnits: [ &amp;quot;uuid_filterElementUnitD&amp;quot; ],&lt;br /&gt;
          parentOrGtoup: &amp;quot;uuid_orGroupA&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
	},&lt;br /&gt;
	mainComplexFilterOrGroups: { //* group and operation filters for each mainComplexFilterUnits&lt;br /&gt;
		uuid_OrGroupA: {&lt;br /&gt;
			FilterIds: [&amp;quot;uuid_FilterA&amp;quot;],&lt;br /&gt;
			parentOrGroup: &amp;quot;&amp;quot;,&lt;br /&gt;
			childOrGroup: []&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	filterLinkStepObjects: {&lt;br /&gt;
		uuid_LinkStepObjectA: { // main complexFilter find orderPrice&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			initialLinkStep: &amp;quot;uuid_linkStepA_A&amp;quot;,&lt;br /&gt;
			linkSteps: {&lt;br /&gt;
				uuid_linkStepA_A: { //one step: Product &amp;gt; SellOffer&lt;br /&gt;
				  link: {&lt;br /&gt;
					objType: {&lt;br /&gt;
					  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
					  objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relType: {&lt;br /&gt;
					  serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
					  relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
				  },&lt;br /&gt;
				  childLinkStep: &amp;quot;uuid_linkStepA_B&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				uuid_linkStepA_B: { //one step: SellOffer &amp;gt; OrderPrice&lt;br /&gt;
					link: {&lt;br /&gt;
						objType: {&lt;br /&gt;
						  serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
						  objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
						},&lt;br /&gt;
						relType: {&lt;br /&gt;
						  serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
						  relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
						},&lt;br /&gt;
						relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
					},&lt;br /&gt;
					parentLinkStep: &amp;quot;uuid_linkStepA_A&amp;quot;,&lt;br /&gt;
					childLinkStep: &amp;quot;uuid_linkStepA_C&amp;quot;,&lt;br /&gt;
					// tableConfig sets &amp;quot;defaultRequestPropertyValues&amp;quot; for each, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultRequestPropertyValues&lt;br /&gt;
					requestProperties:{&lt;br /&gt;
						tag_deliverTo: {// tag_deliverTo comes from linkConfig&lt;br /&gt;
							valueSource: &amp;quot;value&amp;quot;,&lt;br /&gt;
							value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						tag_sellOfferPlan: {&lt;br /&gt;
							valueSource: &amp;quot;value&amp;quot;,&lt;br /&gt;
							value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						tag_sellOfferPlanDeliveryMethodLink: {&lt;br /&gt;
							valueSource: &amp;quot;value&amp;quot;,&lt;br /&gt;
							value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						tag_sellOfferPlanUserPaymentMethodLink: {&lt;br /&gt;
							valueSource: &amp;quot;value&amp;quot;,&lt;br /&gt;
							value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
					}&lt;br /&gt;
				},&lt;br /&gt;
				uuid_linkStepA_C: { //final OrderPrice step&lt;br /&gt;
					parentLinkStep: &amp;quot;uuid_linkStepA_B&amp;quot;,&lt;br /&gt;
					filterElementUnits: [&amp;quot;uuid_filterElementUnitA&amp;quot;]&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		uuid_LinkStepObjectB: { // complexFilterCombinations for parentLocationNodes&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;locatons&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;LocationNode&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			initialLinkStep: &amp;quot;uuid_linkStepB_A&amp;quot;,&lt;br /&gt;
			linkSteps: {&lt;br /&gt;
				uuid_linkStepB_A: { //one step: LocationNode &amp;gt; LocationNode&lt;br /&gt;
				  link: {&lt;br /&gt;
					objType: {&lt;br /&gt;
					  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
					  objectType: &amp;quot;LocationNode&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relType: {&lt;br /&gt;
					  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
					  relationshipTag: &amp;quot;isParentLocationNode&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
				  },&lt;br /&gt;
				  childLinkStep: &amp;quot;uuid_linkStepB_B&amp;quot;,&lt;br /&gt;
				  // tableConfig sets &amp;quot;defaultRequestPropertyValues&amp;quot; for each, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultRequestPropertyValues&lt;br /&gt;
				  requestProperties:{&lt;br /&gt;
						tag_traversalType: {&lt;br /&gt;
							valueSource: &amp;quot;value&amp;quot;,&lt;br /&gt;
							value: &amp;quot;parentNodes&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
					}&lt;br /&gt;
				},&lt;br /&gt;
				uuid_linkStepB_B: { //final parent LocationNodes step&lt;br /&gt;
				  parentLinkStep: &amp;quot;uuid_linkStepB_A&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		uuid_LinkStepObjectC: { // perParentCombinations&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;SellOffer&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			initialLinkStep: &amp;quot;uuid_linkStepC_A&amp;quot;,&lt;br /&gt;
			linkSteps: {&lt;br /&gt;
				uuid_linkStepC_A: { //one step: SellOffer &amp;gt; SellOfferPlan&lt;br /&gt;
				  link: {&lt;br /&gt;
					objType: {&lt;br /&gt;
					  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
					  objectType: &amp;quot;SellOfferPlan&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relType: {&lt;br /&gt;
					  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
					  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
				  },&lt;br /&gt;
				  childLinkStep: &amp;quot;uuid_linkStepC_B&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				uuid_linkStepC_B: { //one step: SellOfferPlan &amp;gt; DeliveryMethodLink&lt;br /&gt;
				  link: {&lt;br /&gt;
					objType: {&lt;br /&gt;
					  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
					  objectType: &amp;quot;DeliveryMethodLink&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relType: {&lt;br /&gt;
					  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
					  relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
				  },&lt;br /&gt;
				  parentLinkStep: &amp;quot;uuid_linkStepC_A&amp;quot;,&lt;br /&gt;
				  childLinkStep: &amp;quot;uuid_linkStepC_C&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				uuid_linkStepC_C: { //one step: SellOfferPlan &amp;gt; DeliveryMethodLink&lt;br /&gt;
				  link: {&lt;br /&gt;
					objType: {&lt;br /&gt;
					  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
					  objectType: &amp;quot;DeliveryMethodLink&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relType: {&lt;br /&gt;
					  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
					  relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
				  },&lt;br /&gt;
				  parentLinkStep: &amp;quot;uuid_linkStepC_B&amp;quot;,&lt;br /&gt;
				  childLinkStep: &amp;quot;uuid_linkStepC_E&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				uuid_linkStepC_D: { //one step: DeliveryMethodLink &amp;gt; DeliveryMethod&lt;br /&gt;
				  link: {&lt;br /&gt;
					objType: {&lt;br /&gt;
					  serviceTag: &amp;quot;DeliveryMethodManager&amp;quot;,&lt;br /&gt;
					  objectType: &amp;quot;DeliveryMethod&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relType: {&lt;br /&gt;
					  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
					  relationshipTag: &amp;quot;isDeliveryMethod&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
				  },&lt;br /&gt;
				  parentLinkStep: &amp;quot;uuid_linkStepC_C&amp;quot;,&lt;br /&gt;
				  childLinkStep: &amp;quot;uuid_linkStepC_E&amp;quot;,&lt;br /&gt;
				  filterElementUnits: [&amp;quot;uuid_filterElementUnitB&amp;quot;]&lt;br /&gt;
				},&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	requiredDataFields: { //* fields to create requiredData including linkPaths&lt;br /&gt;
		//* no link, field in main objType&lt;br /&gt;
		uuid_requiredDataFieldA: {&lt;br /&gt;
			fieldname: &amp;quot;&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		//* has link&lt;br /&gt;
		uuid_requiredDataFieldB: {&lt;br /&gt;
			linkStepObject: &amp;quot;uuid_LinkStepObjectD&amp;quot;,&lt;br /&gt;
			complexFilterCombinations: [&amp;quot;uuid_complexFilterCombinationA&amp;quot;],&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
	},&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		uuid_complexFilterCombinationA: {&lt;br /&gt;
			linkStepObjectA: &amp;quot;uuid_LinkStepObjectB&amp;quot;,&lt;br /&gt;
			initialIdentifiers: { // tableConfig sets &amp;quot;defaultInitialIdentifiers, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultInitialIdentifiers&lt;br /&gt;
				&amp;quot;locationNodeId&amp;quot;: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		uuid_perParentCombinationA: {&lt;br /&gt;
			linkStepObjectA: &amp;quot;uuid_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	requiredDataLinkStepObjects: {&lt;br /&gt;
		uuid_LinkStepObjectD: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			initialLinkStep: &amp;quot;uuid_linkStepD_A&amp;quot;,&lt;br /&gt;
			linkSteps: {&lt;br /&gt;
				uuid_linkStepD_A: { //one step: Product &amp;gt; SellOffer&lt;br /&gt;
				  link: {&lt;br /&gt;
					objType: {&lt;br /&gt;
					  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
					  objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relType: {&lt;br /&gt;
					  serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
					  relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
				  },&lt;br /&gt;
				  childLinkStep: &amp;quot;uuid_linkStepD_B&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				uuid_linkStepD_B: { //one step: SellOffer &amp;gt; OrderPrice&lt;br /&gt;
					link: {&lt;br /&gt;
						objType: {&lt;br /&gt;
						  serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
						  objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
						},&lt;br /&gt;
						relType: {&lt;br /&gt;
						  serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
						  relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
						},&lt;br /&gt;
						relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
					},&lt;br /&gt;
					parentLinkStep: &amp;quot;uuid_linkStepD_A&amp;quot;,&lt;br /&gt;
					childLinkStep: &amp;quot;uuid_linkStepD_C&amp;quot;,&lt;br /&gt;
					// tableConfig sets &amp;quot;defaultRequestPropertyValues&amp;quot; for each, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultRequestPropertyValues&lt;br /&gt;
					requestProperties:{&lt;br /&gt;
						tag_deliverTo: {&lt;br /&gt;
							valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
							complexFilterCombinationId: &amp;quot;uuid_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
							identifierFieldName: &amp;quot;locationNodeId&amp;quot;&lt;br /&gt;
						},&lt;br /&gt;
						tag_sellOfferPlanDeliveryMethodLink: {&lt;br /&gt;
							valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
							perParentCombinationId: &amp;quot;uuid_perParentCombinationA&amp;quot;,&lt;br /&gt;
							identifierFieldName: &amp;quot;sellOfferPlanDeliveryMethodLinkId&amp;quot;&lt;br /&gt;
						},&lt;br /&gt;
					}&lt;br /&gt;
				},&lt;br /&gt;
				uuid_linkStepA_C: { //final OrderPrice step&lt;br /&gt;
					parentLinkStep: &amp;quot;uuid_linkStepD_B&amp;quot;,&lt;br /&gt;
					filterElementUnits: [&amp;quot;uuid_filterElementUnitA&amp;quot;]&lt;br /&gt;
					aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
					sortFields: &amp;quot;uuid_sortFieldA&amp;quot;,&lt;br /&gt;
					// ... other linkPath.linkStep settings here&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}	&lt;br /&gt;
	},&lt;br /&gt;
	sortFields:{&lt;br /&gt;
		uuid_sortFieldA: {&lt;br /&gt;
			// ..&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	filterElementUnits: {&lt;br /&gt;
		uuid_filterElementUnitA:{&lt;br /&gt;
			fieldname: &amp;quot;orderTotal&amp;quot;,&lt;br /&gt;
			comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
			value: &amp;quot;xxx&amp;quot;, // tableConfig sets &amp;quot;defaultFilterElementUnitValue&amp;quot;, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultFilterElementUnitValue&lt;br /&gt;
		},&lt;br /&gt;
		uuid_filterElementUnitB:{&lt;br /&gt;
			fieldname: &amp;quot;deliveryMethodId&amp;quot;,&lt;br /&gt;
			comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
			value: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
        uuid_filterElementUnitD: {&lt;br /&gt;
         	fieldname: &amp;quot;productId&amp;quot;,&lt;br /&gt;
			comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
			value: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
       }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-07-01]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-07-01]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
	<entry>
		<id>https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3308</id>
		<title>2025-04-14 - Frontend LinkPath structure for tableOutput</title>
		<link rel="alternate" type="text/html" href="https://izara.io/wiki/index.php?title=2025-04-14_-_Frontend_LinkPath_structure_for_tableOutput&amp;diff=3308"/>
		<updated>2025-07-01T10:41:55Z</updated>

		<summary type="html">&lt;p&gt;Praew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Service - Search Results]]&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Structure frontend TableConfig and Output prepare for shared library that creates complexFilter and requestProperties&lt;br /&gt;
&lt;br /&gt;
= Example params =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let paramFromTableOutput = {&lt;br /&gt;
	objType: { //* main objType&lt;br /&gt;
		serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
		objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	mainComplexFilterUnits: { // used to create main complexFilter&lt;br /&gt;
		uuid_FilterUnitA: {&lt;br /&gt;
			linkStepObject: &amp;quot;uuid_LinkStepObjectA&amp;quot;,&lt;br /&gt;
             parentOrGroup: &amp;quot;uuid_OrGroupA&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
	},&lt;br /&gt;
	mainComplexFilterOrGroups: { //* group and operation filters for each mainComplexFilterUnits&lt;br /&gt;
		uuid_OrGroupA: {&lt;br /&gt;
			FilterIds: [&amp;quot;uuid_FilterA&amp;quot;],&lt;br /&gt;
			parentOrGroup: &amp;quot;&amp;quot;,&lt;br /&gt;
			childOrGroup: []&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	requiredDataFields: { //* fields to create requiredData including linkPaths&lt;br /&gt;
		//* no link, field in main objType&lt;br /&gt;
		uuid_requiredDataFieldA: {&lt;br /&gt;
			fieldname: &amp;quot;&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		//* has link&lt;br /&gt;
		uuid_requiredDataFieldB: {&lt;br /&gt;
			linkStepObject: &amp;quot;uuid_LinkStepObjectD&amp;quot;,&lt;br /&gt;
			complexFilterCombinations: [&amp;quot;uuid_complexFilterCombinationA&amp;quot;],&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	complexFilterCombinations:{&lt;br /&gt;
		uuid_complexFilterCombinationA: {&lt;br /&gt;
			linkStepObjectA: &amp;quot;uuid_LinkStepObjectB&amp;quot;,&lt;br /&gt;
			initialIdentifiers: { // tableConfig sets &amp;quot;defaultInitialIdentifiers, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultInitialIdentifiers&lt;br /&gt;
				&amp;quot;locationNodeId&amp;quot;: &amp;quot;xxxx&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	perParentCombinations:{&lt;br /&gt;
		uuid_perParentCombinationA: {&lt;br /&gt;
			linkStepObjectA: &amp;quot;uuid_LinkStepObjectC&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	linkStepObjects: { // all links used in this request&lt;br /&gt;
		uuid_LinkStepObjectA: { // main complexFilter find orderPrice&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			initialLinkStep: &amp;quot;uuid_linkStepA_A&amp;quot;,&lt;br /&gt;
			linkSteps: {&lt;br /&gt;
				uuid_linkStepA_A: { //one step: Product &amp;gt; SellOffer&lt;br /&gt;
				  link: {&lt;br /&gt;
					objType: {&lt;br /&gt;
					  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
					  objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relType: {&lt;br /&gt;
					  serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
					  relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
				  },&lt;br /&gt;
				  childLinkStep: &amp;quot;uuid_linkStepA_B&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				uuid_linkStepA_B: { //one step: SellOffer &amp;gt; OrderPrice&lt;br /&gt;
					link: {&lt;br /&gt;
						objType: {&lt;br /&gt;
						  serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
						  objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
						},&lt;br /&gt;
						relType: {&lt;br /&gt;
						  serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
						  relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
						},&lt;br /&gt;
						relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
					},&lt;br /&gt;
					parentLinkStep: &amp;quot;uuid_linkStepA_A&amp;quot;,&lt;br /&gt;
					childLinkStep: &amp;quot;uuid_linkStepA_C&amp;quot;,&lt;br /&gt;
					// tableConfig sets &amp;quot;defaultRequestPropertyValues&amp;quot; for each, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultRequestPropertyValues&lt;br /&gt;
					requestProperties:{&lt;br /&gt;
						tag_deliverTo: {// tag_deliverTo comes from linkConfig&lt;br /&gt;
							valueSource: &amp;quot;value&amp;quot;,&lt;br /&gt;
							value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						tag_sellOfferPlan: {&lt;br /&gt;
							valueSource: &amp;quot;value&amp;quot;,&lt;br /&gt;
							value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						tag_sellOfferPlanDeliveryMethodLink: {&lt;br /&gt;
							valueSource: &amp;quot;value&amp;quot;,&lt;br /&gt;
							value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
						tag_sellOfferPlanUserPaymentMethodLink: {&lt;br /&gt;
							valueSource: &amp;quot;value&amp;quot;,&lt;br /&gt;
							value: &amp;quot;xx&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
					}&lt;br /&gt;
				},&lt;br /&gt;
				uuid_linkStepA_C: { //final OrderPrice step&lt;br /&gt;
					parentLinkStep: &amp;quot;uuid_linkStepA_B&amp;quot;,&lt;br /&gt;
					filterElementUnits: [&amp;quot;uuid_filterElementUnitA&amp;quot;]&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// linkStepObjects used in requiredDataFields&lt;br /&gt;
		uuid_LinkStepObjectB: { // complexFilterCombinations for parentLocationNodes&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;locatons&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;LocationNode&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			initialLinkStep: &amp;quot;uuid_linkStepB_A&amp;quot;,&lt;br /&gt;
			linkSteps: {&lt;br /&gt;
				uuid_linkStepB_A: { //one step: LocationNode &amp;gt; LocationNode&lt;br /&gt;
				  link: {&lt;br /&gt;
					objType: {&lt;br /&gt;
					  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
					  objectType: &amp;quot;LocationNode&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relType: {&lt;br /&gt;
					  serviceTag: &amp;quot;Locations&amp;quot;,&lt;br /&gt;
					  relationshipTag: &amp;quot;isParentLocationNode&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
				  },&lt;br /&gt;
				  childLinkStep: &amp;quot;uuid_linkStepB_B&amp;quot;,&lt;br /&gt;
				  // tableConfig sets &amp;quot;defaultRequestPropertyValues&amp;quot; for each, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultRequestPropertyValues&lt;br /&gt;
				  requestProperties:{&lt;br /&gt;
						tag_traversalType: {&lt;br /&gt;
							valueSource: &amp;quot;value&amp;quot;,&lt;br /&gt;
							value: &amp;quot;parentNodes&amp;quot;,&lt;br /&gt;
						},&lt;br /&gt;
					}&lt;br /&gt;
				},&lt;br /&gt;
				uuid_linkStepB_B: { //final parent LocationNodes step&lt;br /&gt;
				  parentLinkStep: &amp;quot;uuid_linkStepB_A&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		uuid_LinkStepObjectC: { // perParentCombinations&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;SellOffer&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			initialLinkStep: &amp;quot;uuid_linkStepC_A&amp;quot;,&lt;br /&gt;
			linkSteps: {&lt;br /&gt;
				uuid_linkStepC_A: { //one step: SellOffer &amp;gt; SellOfferPlan&lt;br /&gt;
				  link: {&lt;br /&gt;
					objType: {&lt;br /&gt;
					  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
					  objectType: &amp;quot;SellOfferPlan&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relType: {&lt;br /&gt;
					  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
					  relationshipTag: &amp;quot;usesSellOfferPlan&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
				  },&lt;br /&gt;
				  childLinkStep: &amp;quot;uuid_linkStepC_B&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				uuid_linkStepC_B: { //one step: SellOfferPlan &amp;gt; DeliveryMethodLink&lt;br /&gt;
				  link: {&lt;br /&gt;
					objType: {&lt;br /&gt;
					  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
					  objectType: &amp;quot;DeliveryMethodLink&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relType: {&lt;br /&gt;
					  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
					  relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
				  },&lt;br /&gt;
				  parentLinkStep: &amp;quot;uuid_linkStepC_A&amp;quot;,&lt;br /&gt;
				  childLinkStep: &amp;quot;uuid_linkStepC_C&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				uuid_linkStepC_C: { //one step: SellOfferPlan &amp;gt; DeliveryMethodLink&lt;br /&gt;
				  link: {&lt;br /&gt;
					objType: {&lt;br /&gt;
					  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
					  objectType: &amp;quot;DeliveryMethodLink&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relType: {&lt;br /&gt;
					  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
					  relationshipTag: &amp;quot;hasDeliveryMethodLink&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
				  },&lt;br /&gt;
				  parentLinkStep: &amp;quot;uuid_linkStepC_B&amp;quot;,&lt;br /&gt;
				  childLinkStep: &amp;quot;uuid_linkStepC_E&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				uuid_linkStepC_D: { //one step: DeliveryMethodLink &amp;gt; DeliveryMethod&lt;br /&gt;
				  link: {&lt;br /&gt;
					objType: {&lt;br /&gt;
					  serviceTag: &amp;quot;DeliveryMethodManager&amp;quot;,&lt;br /&gt;
					  objectType: &amp;quot;DeliveryMethod&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relType: {&lt;br /&gt;
					  serviceTag: &amp;quot;SellOfferPlan&amp;quot;,&lt;br /&gt;
					  relationshipTag: &amp;quot;isDeliveryMethod&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
				  },&lt;br /&gt;
				  parentLinkStep: &amp;quot;uuid_linkStepC_C&amp;quot;,&lt;br /&gt;
				  childLinkStep: &amp;quot;uuid_linkStepC_E&amp;quot;,&lt;br /&gt;
				  filterElementUnits: [&amp;quot;uuid_filterElementUnitB&amp;quot;]&lt;br /&gt;
				},&lt;br /&gt;
				uuid_linkStepA_C: { //final OrderPrice step&lt;br /&gt;
				  parentLinkStep: &amp;quot;uuid_linkStepA_B&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		uuid_LinkStepObjectD: { // requiredDataFields for finding max orderTotal&lt;br /&gt;
			initialObjType: { //* main objType&lt;br /&gt;
				serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
				objectType: &amp;quot;Product&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			initialLinkStep: &amp;quot;uuid_linkStepD_A&amp;quot;,&lt;br /&gt;
			linkSteps: {&lt;br /&gt;
				uuid_linkStepD_A: { //one step: Product &amp;gt; SellOffer&lt;br /&gt;
				  link: {&lt;br /&gt;
					objType: {&lt;br /&gt;
					  serviceTag: &amp;quot;SellOfferManager&amp;quot;,&lt;br /&gt;
					  objectType: &amp;quot;SellOffer&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relType: {&lt;br /&gt;
					  serviceTag: &amp;quot;ProductManager&amp;quot;,&lt;br /&gt;
					  relationshipTag: &amp;quot;hasSellOffer&amp;quot;&lt;br /&gt;
					},&lt;br /&gt;
					relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
				  },&lt;br /&gt;
				  childLinkStep: &amp;quot;uuid_linkStepD_B&amp;quot;,&lt;br /&gt;
				},&lt;br /&gt;
				uuid_linkStepD_B: { //one step: SellOffer &amp;gt; OrderPrice&lt;br /&gt;
					link: {&lt;br /&gt;
						objType: {&lt;br /&gt;
						  serviceTag: &amp;quot;OrderPrice&amp;quot;,&lt;br /&gt;
						  objectType: &amp;quot;OrderPrice&amp;quot;&lt;br /&gt;
						},&lt;br /&gt;
						relType: {&lt;br /&gt;
						  serviceTag: &amp;quot;sellOfferStandard&amp;quot;,&lt;br /&gt;
						  relationshipTag: &amp;quot;hasOrderPrice&amp;quot;&lt;br /&gt;
						},&lt;br /&gt;
						relationshipDirection: &amp;quot;to&amp;quot;,&lt;br /&gt;
					},&lt;br /&gt;
					parentLinkStep: &amp;quot;uuid_linkStepD_A&amp;quot;,&lt;br /&gt;
					childLinkStep: &amp;quot;uuid_linkStepD_C&amp;quot;,&lt;br /&gt;
					// tableConfig sets &amp;quot;defaultRequestPropertyValues&amp;quot; for each, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultRequestPropertyValues&lt;br /&gt;
					requestProperties:{&lt;br /&gt;
						tag_deliverTo: {&lt;br /&gt;
							valueSource: &amp;quot;complexFilterCombination&amp;quot;,&lt;br /&gt;
							complexFilterCombinationId: &amp;quot;uuid_complexFilterCombinationA&amp;quot;,&lt;br /&gt;
							identifierFieldName: &amp;quot;locationNodeId&amp;quot;&lt;br /&gt;
						},&lt;br /&gt;
						tag_sellOfferPlanDeliveryMethodLink: {&lt;br /&gt;
							valueSource: &amp;quot;perParentCombination&amp;quot;,&lt;br /&gt;
							perParentCombinationId: &amp;quot;uuid_perParentCombinationA&amp;quot;,&lt;br /&gt;
							identifierFieldName: &amp;quot;sellOfferPlanDeliveryMethodLinkId&amp;quot;&lt;br /&gt;
						},&lt;br /&gt;
					}&lt;br /&gt;
				},&lt;br /&gt;
				uuid_linkStepA_C: { //final OrderPrice step&lt;br /&gt;
					parentLinkStep: &amp;quot;uuid_linkStepD_B&amp;quot;,&lt;br /&gt;
					filterElementUnits: [&amp;quot;uuid_filterElementUnitA&amp;quot;]&lt;br /&gt;
					aggregate: &amp;quot;max&amp;quot;,&lt;br /&gt;
					sortFields: &amp;quot;uuid_sortFieldA&amp;quot;,&lt;br /&gt;
					// ... other linkPath.linkStep settings here&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}	&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	filterElementUnits: {&lt;br /&gt;
		uuid_filterElementUnitA:{&lt;br /&gt;
			parentOrGroup: &amp;quot;uuid_OrGroupA&amp;quot;,&lt;br /&gt;
			fieldname: &amp;quot;orderTotal&amp;quot;,&lt;br /&gt;
			comparison: &amp;quot;greaterThan&amp;quot;,&lt;br /&gt;
			value: &amp;quot;xxx&amp;quot;, // tableConfig sets &amp;quot;defaultFilterElementUnitValue&amp;quot;, tableOutput finds from 1. filter objects set to overwrite it, 2. prop sent (eg from sitePage), 3. defaultFilterElementUnitValue&lt;br /&gt;
		},&lt;br /&gt;
		uuid_filterElementUnitB:{&lt;br /&gt;
			parentOrGroup: &amp;quot;uuid_OrGroupA&amp;quot;,&lt;br /&gt;
			fieldname: &amp;quot;deliveryMethodId&amp;quot;,&lt;br /&gt;
			comparison: &amp;quot;equals&amp;quot;,&lt;br /&gt;
			value: &amp;quot;xxx&amp;quot;,&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	sortFields:{&lt;br /&gt;
		uuid_sortFieldA: {&lt;br /&gt;
			// ..&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Working documents| 2025-07-01]]&lt;br /&gt;
[[Category:Working documents - Search Results| 2025-07-01]]&lt;/div&gt;</summary>
		<author><name>Praew</name></author>
	</entry>
</feed>