удалить дубликаты Dedup с помощью jolt

Мне нужно удалить дубликаты в json-сообщении с помощью jolt framework с insuredId и скопировать уникальный insuredId и insuredName в namecode и name соответственно, я добился удаления дубликатов с insuredId, но я не знаю, как скопировать соответствующее застрахованное имя вместе с ним .

Вход:

[
  {
    "aircraftId": "ILTA",
    "aircraftTypeCode": "",
    "insuredId": "12020671",
    "insuredName": "Samuel Antony",
    "policyReference": "20081238",
    "uwy": "2017"
  },
  {
    "aircraftId": "ILTA",
    "aircraftTypeCode": "",
    "insuredId": "12020671",
    "insuredName": "Samuel Antony",
    "policyReference": "20081238",
    "uwy": "2017"
  },
  {
    "aircraftId": "ADE",
    "aircraftTypeCode": "",
    "insuredId": "12018832",
    "insuredName": "Mark henry",
    "policyReference": "20082780",
    "uwy": "2017"
  }
]

Jolt Spec:

[
  {
    "operation": "shift",
    "spec": {
      "*": { 
        "insuredId": { 
          "*": "ids.&[]"
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "ids": {
        "*": {
          "$": "[#2].nameCode" 
        }
      }
    }
  }
]

Фактический выход:

[
  {
    "nameCode": "12020671"
  },
  {
    "nameCode": "12018832"
  }
]

Ожидаемый результат:

[
  {
    "nameCode": "12020671",
    "name":"Samuel Antony"
  },
  {
    "nameCode": "12018832",
    "name":"Mark henry"
  }
]

Обновленная спецификация (требует проверки):

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "insuredId": {
          "*": "ids.&[]"
        },
        "insuredName": {
          "*": "insuredNames.&[]"
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "ids": {
        "*": {
          "$": "[#2].nameCode"
        }
      },
      "insuredNames": {
        "*": {
          "$": "[#2].name"
        }
      }
    }
  }
]

person Ravi    schedule 06.11.2017    source источник


Ответы (2)


[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "insuredId": {
          "*": {
            "@(2,insuredName)": "ids.&[]"
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "ids": {
        "*": {
          "$": "[#2].nameCode",
          "*": "[#2].name"
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "*": {
        "name": "=firstElement(@(1,name))"
      }
    }
  }
]

Объяснение.

Первая операция:

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "insuredId": {
          "*": {
            "@(2,insuredName)": "ids.&[]"
          }
        }
      }
    }
  }
]

Он собирает карту, имеющую «insuredId» в качестве ключа и списки «insuredName» в качестве значений:

{
  "ids" : {
    "12020671" : [ "Samuel Antony", "Samuel Antony" ],
    "12018832" : [ "Mark henry" ]
  }
}

Вторая операция:

[
  {
    "operation": "shift",
    "spec": {
      "ids": {
        "*": {
          "$": "[#2].nameCode",
          "*": "[#2].name"
        }
      }
    }
  }
]

Он преобразует карту в простой список пар:

[ {
  "nameCode" : "12018832",
  "name" : "Mark henry"
}, {
  "nameCode" : "12020671",
  "name" : [ "Samuel Antony", "Samuel Antony" ]
} ]

Третья операция:

[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "*": {
        "name": "=firstElement(@(1,name))"
      }
    }
  }
]

Принимает первый элемент массивов, содержащих имена:

[ {
  "nameCode" : "12018832",
  "name" : "Mark henry"
}, {
  "nameCode" : "12020671",
  "name" : "Samuel Antony"
} ]
person Dmitry Gorkovets    schedule 07.11.2017
comment
Спасибо, Дмитрий за ответ, не могли бы вы дать несколько комментариев по поводу понимания спецификации. Я также создал обновленную спецификацию в исходном сообщении. Это дает ожидаемый результат, но его необходимо проверить, будет ли он работать во всех случаях. - person Ravi; 07.11.2017
comment
@ Рави. Добавлено объяснение. - person Dmitry Gorkovets; 07.11.2017
comment
Привет, Дмитрий, я получаю сообщение об ошибке JOLT Chainr не смог найти класс преобразования: modify-overwrite-beta с индексом 2. Я использую Jolt 0.0.20, и кажется, что Modify не был добавлен до Jolt 0.0.22. - person Ravi; 07.11.2017

Вы можете использовать четыре последовательных преобразования shift. Выберите индивидуально каждый желаемый ключ на первом шаге, чтобы получить по два списка для каждого из них. На втором этапе сделайте элементы уникальными для каждого списка. На этом этапе у нас есть два объекта с ключами. А затем снова преобразуйте их в списки. И сгруппируйте их по объектам без ключей по их индексам в каждом списке, например

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "insuredId": "&",
        "insuredName": "&"
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": {
          "*": "&2.&"
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": {
          "$": "&2"
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "[&].&1"
      }
    }
  }
]
person Barbaros Özhan    schedule 14.07.2021