Skip to main content
April 27, 2023
Solved

a!map complex merging

  • April 27, 2023
  • 8 replies
  • 0 views

Input map

local!inputMap:{
a!map(pagenum: 1,fieldname: "Name", fieldValue:"Appian",docid:1),
a!map(pagenum: 1,fieldname: "howold", fieldValue:15, docid:1),
a!map(pagenum: 1,fieldname: "Name", fieldValue:"VB",docid:1),
a!map(pagenum: 1,fieldname: "howold", fieldValue:12, docid:1),
a!map(pagenum: 2,fieldname: "Name", fieldValue:"Java",docid:1),
a!map(pagenum: 2,fieldname: "howold", fieldValue:25, docid:1),
a!map(pagenum: 1,fieldname: "Name", fieldValue:"COBOL",docid:2),
a!map(pagenum: 1,fieldname: "howold", fieldValue:45, docid:2),
a!map(pagenum: 2,fieldname: "Name", fieldValue:"PL1",docid:2),
a!map(pagenum: 2,fieldname: "howold", fieldValue:55, docid:2)
},

Desired output map


local!outputMap :{
a!map(pagenum: 1 , Name: "Appian", howold: 15, docid:1),

a!map(pagenum: 1 , Name: "VB", howold: 12, docid:1),
a!map(pagenum: 2 , Name: "Java", howold: 25, docid:1),
a!map(pagenum: 1 , Name: "COBOL", howold: 45, docid:2),
a!map(pagenum: 2 , Name: "PL1", howold: 55, docid:2)
},

Is this possible ?

Best answer by sanchitg0002

For the updated input map, this change in the Stefan's code should work

a!localVariables(
  local!input:{
    a!map(pagenum: 1,fieldname: "Name", fieldValue:"Appian",docid:1),
    a!map(pagenum: 1,fieldname: "howold", fieldValue:15, docid:1),
    a!map(pagenum: 2,fieldname: "Name", fieldValue:"Java",docid:1),
    a!map(pagenum: 2,fieldname: "howold", fieldValue:25, docid:1),
    a!map(pagenum: 1,fieldname: "Name", fieldValue:"COBOL",docid:2),
    a!map(pagenum: 1,fieldname: "howold", fieldValue:45, docid:2),
    a!map(pagenum: 2,fieldname: "Name", fieldValue:"PL1",docid:2),
    a!map(pagenum: 2,fieldname: "howold", fieldValue:55, docid:2)
  },
  local!uniqueDocRows: a!forEach(
    union(local!input.docid,local!input.docid),
    index(
      local!input,
      where(local!input.docid = fv!item),
      {}
    )
  ),
  a!flatten(a!forEach(
    local!uniqueDocRows,
    a!localVariables(
      local!parentItem: fv!item,
     a!forEach(
    items: union(fv!item.pagenum, fv!item.pagenum),
    expression: a!localVariables(
      local!rows: index(local!parentItem, where(local!parentItem.pagenum = fv!item), {}),
      reduce(
        a!update(_, _, _),
        a!map(pagenum: fv!item),
       merge({local!rows.fieldname,"docid"}, {local!rows.fieldValue, union(local!rows.docid, local!rows.docid)})
     )
  )
)
)
)
)
)

Ps: Wait for Stefan to post the updated solution with better and less complex logic [emoticon:c4563cd7d5574777a71c318021cbbcc8]

8 replies

stefanhelzle0001
April 27, 2023

Sure. The trick here is to create a new map and add the fields iteratively. The reduce function allows to apply the same function and modify the data on the go. The "_" is a placeholder at design time and replaced by the actual data at runtime.

docs.appian.com/.../expression-advanced-evaluation.html

a!localVariables(
  local!input: {
    a!map(pagenum: 1,fieldname: "Name", fieldValue:"Appian",docid:1),
    a!map(pagenum: 1,fieldname: "howold", fieldValue:15, docid:1),
    a!map(pagenum: 2,fieldname: "Name", fieldValue:"Java",docid:1),
    a!map(pagenum: 2,fieldname: "howold", fieldValue:25, docid:1)
  },
  a!forEach(
    items: union(local!input.pagenum, local!input.pagenum),
    expression: a!localVariables(
      local!rows: index(local!input, where(local!input.pagenum = fv!item), {}),
      reduce(
        a!update(_, _, _),
        a!map(pagenum: fv!item),
        merge(local!rows.fieldname, local!rows.fieldValue)
      )
    )
  )
)

April 27, 2023

For the updated input map, this change in the Stefan's code should work

a!localVariables(
  local!input:{
    a!map(pagenum: 1,fieldname: "Name", fieldValue:"Appian",docid:1),
    a!map(pagenum: 1,fieldname: "howold", fieldValue:15, docid:1),
    a!map(pagenum: 2,fieldname: "Name", fieldValue:"Java",docid:1),
    a!map(pagenum: 2,fieldname: "howold", fieldValue:25, docid:1),
    a!map(pagenum: 1,fieldname: "Name", fieldValue:"COBOL",docid:2),
    a!map(pagenum: 1,fieldname: "howold", fieldValue:45, docid:2),
    a!map(pagenum: 2,fieldname: "Name", fieldValue:"PL1",docid:2),
    a!map(pagenum: 2,fieldname: "howold", fieldValue:55, docid:2)
  },
  local!uniqueDocRows: a!forEach(
    union(local!input.docid,local!input.docid),
    index(
      local!input,
      where(local!input.docid = fv!item),
      {}
    )
  ),
  a!flatten(a!forEach(
    local!uniqueDocRows,
    a!localVariables(
      local!parentItem: fv!item,
     a!forEach(
    items: union(fv!item.pagenum, fv!item.pagenum),
    expression: a!localVariables(
      local!rows: index(local!parentItem, where(local!parentItem.pagenum = fv!item), {}),
      reduce(
        a!update(_, _, _),
        a!map(pagenum: fv!item),
       merge({local!rows.fieldname,"docid"}, {local!rows.fieldValue, union(local!rows.docid, local!rows.docid)})
     )
  )
)
)
)
)
)

Ps: Wait for Stefan to post the updated solution with better and less complex logic [emoticon:c4563cd7d5574777a71c318021cbbcc8]

ravib0008Author
May 1, 2023

[mention:3a56ed849ae7445ababc9b93cfbb0d4f:e9ed411860ed4f2ba0265705b8793d05] Your solution works but it skips first 2 rows , can't see a!map(pagenum: 1 , Name: "Appian", howold: 15, docid:1),in the output

May 1, 2023

How will it work if you keep on changing inputMap in the question again and again after we post a solution and don't even let us know about that???

For others to know, this was the inputMap updated by you when I answered (for which it works perfectly), before that when Stefan answered it was something else.

From the current map how can you identify that howold:15 is related to Name: "Appian" and not Name: "VB"?

If this list of map is going to remain in the same order i.e., "howold" map will come after every "Name" map, then this code can help.

a!localVariables(
  local!input:{
    a!map(pagenum: 1,fieldname: "Name", fieldValue:"Appian",docid:1),
    a!map(pagenum: 1,fieldname: "howold", fieldValue:15, docid:1),
    a!map(pagenum: 1,fieldname: "Name", fieldValue:"VB",docid:1),
    a!map(pagenum: 1,fieldname: "howold", fieldValue:12, docid:1),
    a!map(pagenum: 2,fieldname: "Name", fieldValue:"Java",docid:1),
    a!map(pagenum: 2,fieldname: "howold", fieldValue:25, docid:1),
    a!map(pagenum: 1,fieldname: "Name", fieldValue:"COBOL",docid:2),
    a!map(pagenum: 1,fieldname: "howold", fieldValue:45, docid:2),
    a!map(pagenum: 2,fieldname: "Name", fieldValue:"PL1",docid:2),
    a!map(pagenum: 2,fieldname: "howold", fieldValue:55, docid:2)
  },
  local!uniqueDocRows: a!forEach(
    union(local!input.docid,local!input.docid),
    index(
      local!input,
      where(local!input.docid = fv!item),
      {}
    )
  ),
  a!flatten(a!forEach(
    local!uniqueDocRows,
    a!localVariables(
      local!parentItem: fv!item,
      a!forEach(
        items: union(fv!item.pagenum, fv!item.pagenum),
        expression: a!localVariables(
          local!Pagenum: fv!item,
          local!rows: index(local!parentItem, where(local!parentItem.pagenum = fv!item), {}),
          local!NameRows: index(local!rows,wherecontains("Name", local!rows.fieldname),null),
          local!howoldRows:  index(local!rows,wherecontains("howold", local!rows.fieldname),null),
          local!finalRows: merge(local!NameRows, local!howoldRows),
          a!forEach(
           local!finalRows,
          reduce(
            a!update(_, _, _),
            a!map(pagenum: local!Pagenum),
            merge({fv!item.fieldname,"docid"}, {fv!item.fieldValue, union(fv!item.docid, fv!item.docid)})
          )
          )
        )
      )
    )
  )
  )
)