Skip to main content
July 12, 2021
Solved

Series sorting in Appian

  • July 12, 2021
  • 8 replies
  • 0 views

Hello All,

Do we have any OOTB function or plug-in function to achieve series sorting ?

Example :

Input

{1,
1.1,
1.1.1,
4,
1.2,
3,
2,
2.1,
2.2,
10,
13,
12}

Expected output :

{1,
1.1,
1.1.1,
1.2,
2,
2.1,
2.2,
3,
4,
10,
12,
13}

Best answer by stefanhelzle0001

a!localVariables(
  local!values: {"1",
    "1.1",
    "1.1.1",
    "4",
    "1.2",
    "3",
    "2",
    "2.1",
    "2.2",
    "10",
    "13",
    "12"
  },
  local!prepare: a!forEach(
    items: local!values,
    expression: a!map(
      first: text(split(fv!item, ".")[1], "0000"),
      second: text(index(split(fv!item, "."), 2, null), "0000"),
      third: text(index(split(fv!item, "."), 3, null), "0000"),
      index: fv!index
    )
  ),
  local!sorted: todatasubset(
    local!prepare,
    a!pagingInfo(
      startIndex: 1,
      batchSize: -1,
      sort: {
        a!sortInfo(field: "first", ascending: true),
        a!sortInfo(field: "second", ascending: true),
        a!sortInfo(field: "third", ascending: true),
      }
    )
  ),
  index(local!values, local!sorted.data.index)
)

8 replies

stefanhelzle0001
Brainy
July 12, 2021

Did you try to use todatasubset()?

July 12, 2021

We have tried todatasubset but it was not sorting as expected. Thanks

stewart.burchell
July 12, 2021

Using the sort in a datasubset IS sorting correctly,. The array is a list of string (not number - 1.1.1 is not a valid numeric value) and sorting as as list of string works correctly, but obviously doesn't meet your requirements. You'll have to implement your own custom sort. I suspect (although haven't done the work) that you'll have to examine each item, determine how many 'dots' the item contains, split out the numbers between the dots and implement a nested sort based upon how many levels of dot an item contains.