Skip to main content
New Participant
Jul 12, 2021 6:01 AM UTC
Solved

Series sorting in Appian

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}

stefanhelzle0001
Brainy
Jul 12, 2021 2:12 PM UTC

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
Jul 12, 2021 6:28 AM UTC

Did you try to use todatasubset()?

New Participant
Jul 12, 2021 6:45 AM UTC

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

stewart.burchell
Employee
Jul 12, 2021 9:24 AM UTC

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.