diff --git a/api/src/org/labkey/api/dataiterator/MapDataIterator.java b/api/src/org/labkey/api/dataiterator/MapDataIterator.java index c1810858df4..18c94db9510 100644 --- a/api/src/org/labkey/api/dataiterator/MapDataIterator.java +++ b/api/src/org/labkey/api/dataiterator/MapDataIterator.java @@ -18,6 +18,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.labkey.api.collections.ArrayListMap; import org.labkey.api.collections.CaseInsensitiveHashMap; import org.labkey.api.collections.CaseInsensitiveTreeSet; @@ -43,7 +44,24 @@ public interface MapDataIterator extends DataIterator Logger LOGGER = LogHelper.getLogger(MapDataIterator.class, "DataIterators backed by Maps"); boolean supportsGetMap(); - Map getMap(); + @Nullable Map getMap(); + default @Nullable Map getMapExcludeExistingRecord() + { + Map row = getMap(); + if (null == row) + return null; + + if (!row.containsKey(ExistingRecordDataIterator.EXISTING_RECORD_COLUMN_NAME)) + return row; + + Map rowClean = new CaseInsensitiveHashMap<>(row.size()); + row.forEach((k, v) -> { + if (!ExistingRecordDataIterator.EXISTING_RECORD_COLUMN_NAME.equals(k)) + rowClean.put(k, v); + }); + + return rowClean; + } /** * wrap an existing DataIterator to add MapDataIterator interface diff --git a/api/src/org/labkey/api/query/AbstractQueryImportAction.java b/api/src/org/labkey/api/query/AbstractQueryImportAction.java index 71641555b46..d79e2088c89 100644 --- a/api/src/org/labkey/api/query/AbstractQueryImportAction.java +++ b/api/src/org/labkey/api/query/AbstractQueryImportAction.java @@ -30,6 +30,7 @@ import org.labkey.api.action.SpringActionController; import org.labkey.api.attachments.FileAttachmentFile; import org.labkey.api.audit.TransactionAuditProvider; +import org.labkey.api.collections.LabKeyCollectors; import org.labkey.api.data.Container; import org.labkey.api.data.DbSchema; import org.labkey.api.data.DbScope; @@ -56,6 +57,7 @@ import org.labkey.api.util.CPUTimer; import org.labkey.api.util.FileStream; import org.labkey.api.util.FileUtil; +import org.labkey.api.util.JsonUtil; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.Pair; import org.labkey.api.util.Path; @@ -76,6 +78,7 @@ import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -761,6 +764,14 @@ protected JSONObject createSuccessResponse(int rowCount) return response; } + public static JSONArray prepareRowsResponse(@NotNull Collection> rows) + { + return rows.stream() + .map(JsonUtil::toMapPreserveNonFinite) + .map(JsonUtil::toJsonPreserveNulls) + .collect(LabKeyCollectors.toJSONArray()); + } + @Override protected ApiResponseWriter createResponseWriter() throws IOException { diff --git a/api/src/org/labkey/api/query/AbstractQueryUpdateService.java b/api/src/org/labkey/api/query/AbstractQueryUpdateService.java index 6aaa7f8e4bb..7a768bcb915 100644 --- a/api/src/org/labkey/api/query/AbstractQueryUpdateService.java +++ b/api/src/org/labkey/api/query/AbstractQueryUpdateService.java @@ -465,7 +465,7 @@ public boolean next() throws BatchValidationException { boolean ret = super.next(); if (ret) - rows.add(((MapDataIterator)_delegate).getMap()); + rows.add(((MapDataIterator)_delegate).getMapExcludeExistingRecord()); return ret; } }; diff --git a/experiment/src/org/labkey/experiment/api/SampleTypeUpdateServiceDI.java b/experiment/src/org/labkey/experiment/api/SampleTypeUpdateServiceDI.java index bd8273f8d99..fc931100cb3 100644 --- a/experiment/src/org/labkey/experiment/api/SampleTypeUpdateServiceDI.java +++ b/experiment/src/org/labkey/experiment/api/SampleTypeUpdateServiceDI.java @@ -343,7 +343,7 @@ else if (nameObj instanceof Number) } } else - rows.add(((MapDataIterator) _delegate).getMap()); + rows.add(((MapDataIterator) _delegate).getMapExcludeExistingRecord()); } return ret; } diff --git a/query/src/org/labkey/query/controllers/QueryController.java b/query/src/org/labkey/query/controllers/QueryController.java index 874f0a0ad70..ecec0cbb7d6 100644 --- a/query/src/org/labkey/query/controllers/QueryController.java +++ b/query/src/org/labkey/query/controllers/QueryController.java @@ -4739,10 +4739,7 @@ protected JSONObject executeJson(JSONObject json, CommandType commandType, boole } else if (commandType != CommandType.importRows) { - response.put("rows", responseRows.stream() - .map(JsonUtil::toMapPreserveNonFinite) - .map(JsonUtil::toJsonPreserveNulls) - .collect(LabKeyCollectors.toJSONArray())); + response.put("rows", AbstractQueryImportAction.prepareRowsResponse(responseRows)); } // if there is any provenance information, save it here