ошибка при использовании функции Kotlin groupBy для списка - PullRequest
0 голосов
/ 11 февраля 2020

Я очень новичок в Kotlin, и я не могу понять, как сделать что-то действительно простое; сгруппировать мои данные по полю имени. Я пытался с map и groupBy, используя один или оба, но я либо получаю сообщение об ошибке, либо данные в списке, и дубликаты отфильтровываются - что мне не нужно. Мне нужно сгруппировать дубликаты.

Кроме того, моя функция sql (в хранилище), которая находит записи в моей БД на основе введенной даты, имеет поля из двух разных классов, а это не оптимальный способ ведения дел, но я не знал, как еще объединить данные из двух таблиц. Я не против исправить это, если кто-то может сказать мне, как. Я получаю сообщение об ошибке: «Вывод типа не выполнен. Ожидаемое несоответствие типов. Требуется: список найденных строк карты?» Список>

ниже - мой код

TIA

мой репозиторий код

    @Query("SELECT new XXX.report.model.ReportWithBatches(r.adlsPath, r.fileSize, r.lastUpdate, r.remoteFileName, b.dataPath , b.version, b.dataSource, r.recordCount, r.transferStatus, r.businessDate) FROM ReportOutput r INNER JOIN BatchInput b ON r.job.jobUuid = b.reportJob.jobUuid WHERE r.businessDate = ?1")
    fun findAllByBusinessDateJoinBatches(date: LocalDate): List<ReportWithBatches>


}

мой сервисный код

 fun findAllByCreationDateJoinBatches(date: LocalDate): List<ReportWithBatches> {
            val reportBatchesList = reportRepository.findAllByBusinessDateJoinBatches(date)
           return reportBatchesList.groupBy({it.adlsFullPath}, {it})
//                   .map { it.value }
//            return reportBatchesList
//            return reportBatchesList.map { rB ->
//                ReportWithBatches(
//                        rB.adlsFullPath,
//                        rB.contentLength,
//                        rB.lastModified,
//                        rB.remoteFileName,
//                        rB.dataPath,
//                        rB.version,
//                        rB.source,
//                        rB.numberOfRecords,
//                        rB.transferStatus,
//                        rB.creationDate)
//
//            }

        }

код в моем контроллере

 @GetMapping(value = ["/linkBatches/{today}"])
    fun findAllByCreationDateJoinBatches(@PathVariable("today") @DateTimeFormat(pattern = "yyyyMMdd") date: LocalDate): List<ReportWithBatches> {
        return eligibleService.findAllByCreationDateJoinBatches(date)
    }

Мой результат такой - обратите внимание, что в результате есть только одна партия на запись :

[
  {
    "adlsFullPath": "part-00000-1399b2e0-5fa5-484b-91f1-9dec0601b885-c000.csv.gz",
    "contentLength": 20,
    "lastModified": "2020-02-07T16:50:16.132-05:00",
    "remoteFileName": null,
    "dataPath": "execution_v1/integration_date=2020-02-07/business_date=2020-02-07/batch_id=3/version=1",
    "version": 1,
    "source": "NETS",
    "numberOfRecords": -1,
    "transferStatus": "REPORT_CREATED",
    "creationDate": "2020-02-07"
  },
  {
    "adlsFullPath": "part-00007-1399b2e0-5fa5-484b-91f1-9dec0601b885-c000.csv.gz",
    "contentLength": 1104,
    "lastModified": "2020-02-07T16:50:16.133-05:00",
    "remoteFileName": null,
    "dataPath": "preprd/datalake/lake/nes/negotiation/execution_v1/integration_date=2020-02-07/business_date=2020-02-07/batch_id=3/version=1",
    "version": 1,
    "source": "NETS",
    "numberOfRecords": -1,
    "transferStatus": "REPORT_CREATED",
    "creationDate": "2020-02-07"
  },
  {
    "adlsFullPath": "part-00015-1399b2e0-5fa5-484b-91f1-9dec0601b885-c000.csv.gz",
    "contentLength": 1057,
    "lastModified": "2020-02-07T16:50:16.133-05:00",
    "remoteFileName": null,
    "dataPath": "preprd/datalake/lake/nes/negotiation/execution_v1/integration_date=2020-02-07/business_date=2020-02-07/batch_id=3/version=1",
    "version": 1,
    "source": "NETS",
    "numberOfRecords": -1,
    "transferStatus": "REPORT_CREATED",
    "creationDate": "2020-02-07"
  },
]

Я хотел бы получить что-то вроде этого:

[{
    "adlsFullPath": "part-00000-1399b2e0-5fa5-484b-91f1-9dec0601b885-c000.csv.gz",
    "contentLength": 20,
    "lastModified": "2020-02-07T16:50:16.132-05:00",
    "remoteFileName": null,
    "numberOfRecords": -1,
    "transferStatus": "REPORT_CREATED",
    "creationDate": "2020-02-07",
    "batches":{  
    {  "dataPath": "execution_v1/integration_date=2020-02-07/business_date=2020-02-07/batch_id=3/version=1",
    "version": 1,
    "source": "NETS",
    },
    {  "dataPath": "execution_v1/integration_date=2020-02-07/business_date=2020-02-07/batch_id=2/version=1",
    "version": 1,
    "source": "NETS",
    },
    {  "dataPath": "execution_v1/integration_date=2020-02-07/business_date=2020-02-07/batch_id=1/version=1",
    "version": 1,
    "source": "NETS",
    }
  },

  { 
    "adlsFullPath": "part-00007-1399b2e0-5fa5-484b-91f1-9dec0601b885-c000.csv.gz",
    "contentLength": 1104,
    "lastModified": "2020-02-07T16:50:16.133-05:00",
    "remoteFileName": null,
    "numberOfRecords": -1,
    "transferStatus": "REPORT_CREATED",
    "creationDate": "2020-02-07",
    "batches":{  
    {  "dataPath": "execution_v1/integration_date=2020-02-07/business_date=2020-02-07/batch_id=3/version=1",
    "version": 1,
    "source": "NETS",
    },
    {  "dataPath": "execution_v1/integration_date=2020-02-07/business_date=2020-02-07/batch_id=2/version=1",
    "version": 1,
    "source": "NETS",
    },
    {  "dataPath": "execution_v1/integration_date=2020-02-07/business_date=2020-02-07/batch_id=1/version=1",
    "version": 1,
    "source": "NETS",
    }
  },

  {
    "part-00015-1399b2e0-5fa5-484b-91f1-9dec0601b885-c000.csv.gz",
   "contentLength": 1104,
    "lastModified": "2020-02-07T16:50:16.133-05:00",
    "remoteFileName": null,
    "numberOfRecords": -1,
    "transferStatus": "REPORT_CREATED",
    "creationDate": "2020-02-07",
    "batches":{  
    {  "dataPath": "execution_v1/integration_date=2020-02-07/business_date=2020-02-07/batch_id=3/version=1",
    "version": 1,
    "source": "NETS",
    },
    {  "dataPath": "execution_v1/integration_date=2020-02-07/business_date=2020-02-07/batch_id=2/version=1",
    "version": 1,
    "source": "NETS",
    },
    {  "dataPath": "execution_v1/integration_date=2020-02-07/business_date=2020-02-07/batch_id=1/version=1",
    "version": 1,
    "source": "NETS",
    }
  }
  }]

1 Ответ

0 голосов
/ 11 февраля 2020

Поскольку groupBy возвращает Map, а не List, вы получаете сообщение об ошибке

return reportBatchesList.groupBy({it.adlsFullPath}, {it})

Из function, имеющего return тип List<ReportWithBatches>. Поэтому вам придется изменить тип возврата вашего function на Map<String, ReportWithBatches> в службе.

В вашем случае groupBy даст вам карту, которая будет выглядеть примерно так:

{adlsFullPath1=[Report1, Report2], adlsFullPath2=[Report3]}

Для получения дополнительной информации прочитайте документы .

...