From 70b569c2cacb3c94496561abedd73f835de9e775 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Fri, 10 Jan 2025 15:43:38 -0600 Subject: [PATCH] CE-1955 Memoize groupByAllIndexesFromTable to avoid wasting lots of arrayLists; add todo about maybe only doing grouping if there is a mapped child table... --- .../bulk/insert/mapping/TallRowsToRecord.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/mapping/TallRowsToRecord.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/mapping/TallRowsToRecord.java index bf67522c..9aab3ab8 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/mapping/TallRowsToRecord.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/mapping/TallRowsToRecord.java @@ -55,6 +55,7 @@ public class TallRowsToRecord implements RowsToRecordInterface private static final QLogger LOG = QLogger.getLogger(TallRowsToRecord.class); private Memoization, Boolean> shouldProcesssAssociationMemoization = new Memoization<>(); + private Memoization> groupByAllIndexesFromTableMemoization = new Memoization<>(); @@ -96,6 +97,10 @@ public class TallRowsToRecord implements RowsToRecordInterface continue; } + /////////////////////////////////////////////////////////////////////////////// + // maybe todo - some version of - only do this if there are mapped children? // + /////////////////////////////////////////////////////////////////////////////// + if(rowsForCurrentRecord.isEmpty()) { /////////////////////////////////// @@ -154,8 +159,11 @@ public class TallRowsToRecord implements RowsToRecordInterface ***************************************************************************/ private List groupByAllIndexesFromTable(BulkInsertMapping mapping, QTableMetaData table, BulkLoadFileRow headerRow, String name) throws QException { - Map fieldIndexes = mapping.getFieldIndexes(table, name, headerRow); - return new ArrayList<>(fieldIndexes.values()); + return ((groupByAllIndexesFromTableMemoization.getResult(table.getName(), (n) -> + { + Map fieldIndexes = mapping.getFieldIndexes(table, name, headerRow); + return new ArrayList<>(fieldIndexes.values()); + })).orElse(null)); } @@ -166,6 +174,7 @@ public class TallRowsToRecord implements RowsToRecordInterface private QRecord makeRecordFromRows(QTableMetaData table, String associationNameChain, BulkInsertMapping mapping, BulkLoadFileRow headerRow, List rows) throws QException { QRecord record = new QRecord(); + record.setTableName(table.getName()); BulkLoadRecordUtils.addBackendDetailsAboutFileRows(record, CollectionUtils.useOrWrap(rows, new TypeToken>() {})); Map fieldIndexes = mapping.getFieldIndexes(table, associationNameChain, headerRow); @@ -273,6 +282,10 @@ public class TallRowsToRecord implements RowsToRecordInterface break; } + /////////////////////////////////////////////////////////////////////////////// + // maybe todo - some version of - only do this if there are mapped children? // + /////////////////////////////////////////////////////////////////////////////// + List rowGroupByValues = getGroupByValues(row, groupByIndexes); if(rowGroupByValues == null) {