From f602af8652a70e1523be59de4486a9c199e75cb5 Mon Sep 17 00:00:00 2001 From: dd217 Date: Mon, 5 Oct 2026 17:12:23 -0500 Subject: [PATCH 1/3] DIS-3002: Prevent delta import from incrementing lastChangeProcessed --- .../evolve_export/EvolveExportMain.java | 13 ++++++++----- .../symphony/SymphonyExportMain.java | 13 ++++++++----- code/web/release_notes/26.10.00.MD | 9 +++++++++ code/web/release_notes/26.10.00/DIS-3002.yaml | 12 ++++++++++++ 4 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 code/web/release_notes/26.10.00/DIS-3002.yaml diff --git a/code/evolve_export/src/org/aspendiscovery/evolve_export/EvolveExportMain.java b/code/evolve_export/src/org/aspendiscovery/evolve_export/EvolveExportMain.java index 8eaadec123..8a88557531 100644 --- a/code/evolve_export/src/org/aspendiscovery/evolve_export/EvolveExportMain.java +++ b/code/evolve_export/src/org/aspendiscovery/evolve_export/EvolveExportMain.java @@ -905,7 +905,8 @@ private static int updateRecordsUsingMarcExtract(ArrayList exportedMarcFil logEntry.addNote("Processing file " + curBibFile.getAbsolutePath()); String lastRecordProcessed = ""; - if (hasFullExportFile && curBibFile.equals(fullExportFile) && indexingProfile.getLastChangeProcessed() > 0){ + boolean isFullExportFile = hasFullExportFile && curBibFile.equals(fullExportFile); + if (isFullExportFile && indexingProfile.getLastChangeProcessed() > 0){ logEntry.addNote("Skipping the first " + indexingProfile.getLastChangeProcessed() + " records because they were processed previously see (Last Record ID Processed for the Indexing Profile)."); } int numRecordsRead = 0; @@ -927,7 +928,7 @@ private static int updateRecordsUsingMarcExtract(ArrayList exportedMarcFil } numRecordsRead++; RecordIdentifier recordIdentifier = recordGroupingProcessor.getPrimaryIdentifierFromMarcRecord(curBib, indexingProfile); - if (hasFullExportFile && curBibFile.equals(fullExportFile) && (numRecordsRead < indexingProfile.getLastChangeProcessed())) { + if (isFullExportFile && (numRecordsRead < indexingProfile.getLastChangeProcessed())) { if (recordIdentifier != null) { recordGroupingProcessor.removeExistingRecord(recordIdentifier.getIdentifier()); } @@ -965,7 +966,9 @@ private static int updateRecordsUsingMarcExtract(ArrayList exportedMarcFil //Delete the record since it is suppressed deleteRecord = true; } - indexingProfile.setLastChangeProcessed(numRecordsRead); + if (isFullExportFile){ + indexingProfile.setLastChangeProcessed(numRecordsRead); + } if (deleteRecord && recordIdentifier != null) { RemoveRecordFromWorkResult result = recordGroupingProcessor.removeRecordFromGroupedWork(indexingProfile.getName(), recordIdentifier.getIdentifier()); if (result.reindexWork) { @@ -981,14 +984,14 @@ private static int updateRecordsUsingMarcExtract(ArrayList exportedMarcFil }catch (MarcException me){ logEntry.incRecordsWithInvalidMarc("Error processing record index " + numRecordsRead + " of " + curBibFile.getAbsolutePath() + " the last record processed was " + lastRecordProcessed + " trying to continue" + me); } - if (numRecordsRead % 250 == 0) { + if (isFullExportFile && numRecordsRead % 250 == 0) { logEntry.saveResults(); indexingProfile.updateLastChangeProcessed(dbConn, logEntry); } } marcFileStream.close(); - if (hasFullExportFile){ + if (isFullExportFile){ indexingProfile.setLastChangeProcessed(0); indexingProfile.updateLastChangeProcessed(dbConn, logEntry); logEntry.addNote("Updated " + numRecordsRead + " records"); diff --git a/code/symphony_export/src/com/turning_leaf_technologies/symphony/SymphonyExportMain.java b/code/symphony_export/src/com/turning_leaf_technologies/symphony/SymphonyExportMain.java index 346fcbf4d5..4ab4ccd3e7 100644 --- a/code/symphony_export/src/com/turning_leaf_technologies/symphony/SymphonyExportMain.java +++ b/code/symphony_export/src/com/turning_leaf_technologies/symphony/SymphonyExportMain.java @@ -1014,7 +1014,8 @@ private static int updateRecordsUsingMarcExtract(ArrayList exportedMarcFil logEntry.saveResults(); String lastRecordProcessed = ""; - if (hasFullExportFile && curBibFile.equals(fullExportFile) && indexingProfile.getLastChangeProcessed() > 0){ + boolean isFullExportFile = hasFullExportFile && curBibFile.equals(fullExportFile); + if (isFullExportFile && indexingProfile.getLastChangeProcessed() > 0){ logEntry.addNote("Skipping the first " + indexingProfile.getLastChangeProcessed() + " records because they were processed previously see (Last Record ID Processed for the Indexing Profile)."); logEntry.saveResults(); } @@ -1034,7 +1035,7 @@ private static int updateRecordsUsingMarcExtract(ArrayList exportedMarcFil DataField marc245 = curBib.getDataField(245); boolean has245 = marc245 != null; RecordIdentifier recordIdentifier = recordGroupingProcessor.getPrimaryIdentifierFromMarcRecord(curBib, indexingProfile); - if (hasFullExportFile && curBibFile.equals(fullExportFile) && has245 && (numRecordsRead < indexingProfile.getLastChangeProcessed())) { + if (isFullExportFile && has245 && (numRecordsRead < indexingProfile.getLastChangeProcessed())) { //We're skipping this record because we are doing a full export that got paused part way through if (recordIdentifier != null) { recordGroupingProcessor.removeExistingRecord(recordIdentifier.getIdentifier()); @@ -1100,7 +1101,9 @@ private static int updateRecordsUsingMarcExtract(ArrayList exportedMarcFil deleteRecord = true; } lastIdentifier = recordIdentifier; - indexingProfile.setLastChangeProcessed(numRecordsRead); + if (isFullExportFile){ + indexingProfile.setLastChangeProcessed(numRecordsRead); + } if (deleteRecord) { RemoveRecordFromWorkResult result = recordGroupingProcessor.removeRecordFromGroupedWork(indexingProfile.getName(), recordIdentifier.getIdentifier()); if (result.reindexWork) { @@ -1116,14 +1119,14 @@ private static int updateRecordsUsingMarcExtract(ArrayList exportedMarcFil }catch (MarcException me){ logEntry.incErrors("Error processing individual record on record " + numRecordsRead + " of " + curBibFile.getAbsolutePath() + " the last record processed was " + lastRecordProcessed + " trying to continue", me); } - if (numRecordsRead % 250 == 0) { + if (isFullExportFile && numRecordsRead % 250 == 0) { logEntry.saveResults(); indexingProfile.updateLastChangeProcessed(dbConn, logEntry); } } marcFileStream.close(); - if (hasFullExportFile){ + if (isFullExportFile){ indexingProfile.setLastChangeProcessed(0); indexingProfile.updateLastChangeProcessed(dbConn, logEntry); logEntry.addNote("Updated " + numRecordsRead + " records"); diff --git a/code/web/release_notes/26.10.00.MD b/code/web/release_notes/26.10.00.MD index a7aac2d2d6..8367806051 100644 --- a/code/web/release_notes/26.10.00.MD +++ b/code/web/release_notes/26.10.00.MD @@ -30,6 +30,9 @@ - Fixed an issue where viewer accounts could not view or manage their linked account's registration if it was created by a staff member. ([DIS-2955](https://aspen-discovery.atlassian.net/browse/DIS-2955)) (*CZ*) - Fixed an issue where viewer accounts could not view or manage their linked account's registration if the status is on waiting list. ([DIS-2955](https://aspen-discovery.atlassian.net/browse/DIS-2955)) (*CZ*) +#### Evolve ILS +- Prevent delta imports from updating Last Changed Processed record offset which would result in an incomplete full import. ([DIS-3002](https://aspen-discovery.atlassian.net/browse/DIS-3002)) (*DD*) + #### Indexing - Update GroupedWorksIndexer to use try-with-resources blocks ensuring proper resource cleanup. ([DIS-2913](https://aspen-discovery.atlassian.net/browse/DIS-2913)) (*JW*) @@ -58,6 +61,9 @@ #### Sierra ILS - Validate PINs during Sierra self registration using the configured PIN validation rules. ([DIS-2973](https://aspen-discovery.atlassian.net/browse/DIS-2973)) (*LE*) +#### Symphony ILS +- Prevent delta imports from updating Last Changed Processed record offset which would result in an incomplete full import. ([DIS-3002](https://aspen-discovery.atlassian.net/browse/DIS-3002)) (*DD*) + #### Web Builder - Fix an issue that prevents images from being uploaded through the WebBuilder Markdown editor. ([DIS-2950](https://aspen-discovery.atlassian.net/browse/DIS-2950)) (*YL*) @@ -77,6 +83,9 @@ ### Open Fifth - Chloe Zermatten (CZ) +### Prairie Lakes Library System +- David Dowling (DD) + ### Theke Solutions - Lucas Montoya (LM) diff --git a/code/web/release_notes/26.10.00/DIS-3002.yaml b/code/web/release_notes/26.10.00/DIS-3002.yaml new file mode 100644 index 0000000000..2898f3d853 --- /dev/null +++ b/code/web/release_notes/26.10.00/DIS-3002.yaml @@ -0,0 +1,12 @@ +Jira: DIS-3002 +Type: Bug +Developer: David Dowling (DD) +ContributingOrg: Prairie Lakes Library System +Sponsor: Prairie Lakes Library System +GroveRelease: 26.10.00 +CommunityRelease: 26.11.00 +Component: Indexing +Description: + - Prevent delta imports from updating Last Changed Processed record offset which would result in an incomplete full import. +NewSettings: +NewPermissions: \ No newline at end of file From 4bb4a6eb6e10f5861d8c1a1db6bcd9d6a1bc9da1 Mon Sep 17 00:00:00 2001 From: dd217 Date: Tue, 6 Oct 2026 06:35:03 -0500 Subject: [PATCH 2/3] DIS-3002: Revert release note change for to Grove yaml build process --- code/web/release_notes/26.10.00.MD | 9 --------- 1 file changed, 9 deletions(-) diff --git a/code/web/release_notes/26.10.00.MD b/code/web/release_notes/26.10.00.MD index 8367806051..a7aac2d2d6 100644 --- a/code/web/release_notes/26.10.00.MD +++ b/code/web/release_notes/26.10.00.MD @@ -30,9 +30,6 @@ - Fixed an issue where viewer accounts could not view or manage their linked account's registration if it was created by a staff member. ([DIS-2955](https://aspen-discovery.atlassian.net/browse/DIS-2955)) (*CZ*) - Fixed an issue where viewer accounts could not view or manage their linked account's registration if the status is on waiting list. ([DIS-2955](https://aspen-discovery.atlassian.net/browse/DIS-2955)) (*CZ*) -#### Evolve ILS -- Prevent delta imports from updating Last Changed Processed record offset which would result in an incomplete full import. ([DIS-3002](https://aspen-discovery.atlassian.net/browse/DIS-3002)) (*DD*) - #### Indexing - Update GroupedWorksIndexer to use try-with-resources blocks ensuring proper resource cleanup. ([DIS-2913](https://aspen-discovery.atlassian.net/browse/DIS-2913)) (*JW*) @@ -61,9 +58,6 @@ #### Sierra ILS - Validate PINs during Sierra self registration using the configured PIN validation rules. ([DIS-2973](https://aspen-discovery.atlassian.net/browse/DIS-2973)) (*LE*) -#### Symphony ILS -- Prevent delta imports from updating Last Changed Processed record offset which would result in an incomplete full import. ([DIS-3002](https://aspen-discovery.atlassian.net/browse/DIS-3002)) (*DD*) - #### Web Builder - Fix an issue that prevents images from being uploaded through the WebBuilder Markdown editor. ([DIS-2950](https://aspen-discovery.atlassian.net/browse/DIS-2950)) (*YL*) @@ -83,9 +77,6 @@ ### Open Fifth - Chloe Zermatten (CZ) -### Prairie Lakes Library System -- David Dowling (DD) - ### Theke Solutions - Lucas Montoya (LM) From 52aca037a40b341fd572b346fd118edd34fb8f0d Mon Sep 17 00:00:00 2001 From: dd217 Date: Tue, 6 Oct 2026 06:40:39 -0500 Subject: [PATCH 3/3] DIS-3002: Preserve incremental logging during delta import --- .../org/aspendiscovery/evolve_export/EvolveExportMain.java | 6 ++++-- .../symphony/SymphonyExportMain.java | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/code/evolve_export/src/org/aspendiscovery/evolve_export/EvolveExportMain.java b/code/evolve_export/src/org/aspendiscovery/evolve_export/EvolveExportMain.java index 8a88557531..9074c92a8e 100644 --- a/code/evolve_export/src/org/aspendiscovery/evolve_export/EvolveExportMain.java +++ b/code/evolve_export/src/org/aspendiscovery/evolve_export/EvolveExportMain.java @@ -984,9 +984,11 @@ private static int updateRecordsUsingMarcExtract(ArrayList exportedMarcFil }catch (MarcException me){ logEntry.incRecordsWithInvalidMarc("Error processing record index " + numRecordsRead + " of " + curBibFile.getAbsolutePath() + " the last record processed was " + lastRecordProcessed + " trying to continue" + me); } - if (isFullExportFile && numRecordsRead % 250 == 0) { + if (numRecordsRead % 250 == 0) { logEntry.saveResults(); - indexingProfile.updateLastChangeProcessed(dbConn, logEntry); + if (isFullExportFile) { + indexingProfile.updateLastChangeProcessed(dbConn, logEntry); + } } } marcFileStream.close(); diff --git a/code/symphony_export/src/com/turning_leaf_technologies/symphony/SymphonyExportMain.java b/code/symphony_export/src/com/turning_leaf_technologies/symphony/SymphonyExportMain.java index 4ab4ccd3e7..1b5f94f525 100644 --- a/code/symphony_export/src/com/turning_leaf_technologies/symphony/SymphonyExportMain.java +++ b/code/symphony_export/src/com/turning_leaf_technologies/symphony/SymphonyExportMain.java @@ -1119,9 +1119,11 @@ private static int updateRecordsUsingMarcExtract(ArrayList exportedMarcFil }catch (MarcException me){ logEntry.incErrors("Error processing individual record on record " + numRecordsRead + " of " + curBibFile.getAbsolutePath() + " the last record processed was " + lastRecordProcessed + " trying to continue", me); } - if (isFullExportFile && numRecordsRead % 250 == 0) { + if (numRecordsRead % 250 == 0) { logEntry.saveResults(); - indexingProfile.updateLastChangeProcessed(dbConn, logEntry); + if (isFullExportFile) { + indexingProfile.updateLastChangeProcessed(dbConn, logEntry); + } } } marcFileStream.close();