diff --git a/src/main/java/ru/mcs/metadatabook/service/PivotIndexService.java b/src/main/java/ru/mcs/metadatabook/service/PivotIndexService.java index 96bfd22..276b8a4 100644 --- a/src/main/java/ru/mcs/metadatabook/service/PivotIndexService.java +++ b/src/main/java/ru/mcs/metadatabook/service/PivotIndexService.java @@ -31,6 +31,8 @@ private final MtIndexRepository indexRepository; + private static final int MAX_INDEX_STRING_VALUE = 1000; + @Transactional public void syncIndexes(MtData data, List indexedFields) { Integer orgId = data.getOrgId(); @@ -49,7 +51,7 @@ .guid(guid) .build(); - populateIndexValue(index, field.getDataType(), value); + populateIndexValue(index, field, value); entityManager.persist(index); } } @@ -79,10 +81,10 @@ entityManager.persist(history); } - private void populateIndexValue(MtIndex index, String dataType, String value) { - switch (dataType) { + private void populateIndexValue(MtIndex index, MtField field, String value) { + switch (field.getDataType()) { case "text", "email", "url", "phone", "picklist", "lookup" -> - index.setStringValue(value.toLowerCase().trim()); + index.setStringValue(truncateForIndex(value.toLowerCase().trim(), field.getLength())); case "number", "currency", "percent" -> { try { index.setNumValue(new BigDecimal(value)); @@ -97,7 +99,13 @@ log.warn("Invalid date value for index: {}", value); } } - default -> index.setStringValue(value.toLowerCase().trim()); + default -> index.setStringValue(truncateForIndex(value.toLowerCase().trim(), field.getLength())); } } + + private String truncateForIndex(String value, Integer declaredLength) { + int limit = (declaredLength != null && declaredLength <= MAX_INDEX_STRING_VALUE) + ? declaredLength : MAX_INDEX_STRING_VALUE; + return value.length() > limit ? value.substring(0, limit) : value; + } } \ No newline at end of file diff --git a/src/main/resources/db/migration/V10__widen_mt_indexes_string_value.sql b/src/main/resources/db/migration/V10__widen_mt_indexes_string_value.sql new file mode 100644 index 0000000..997a130 --- /dev/null +++ b/src/main/resources/db/migration/V10__widen_mt_indexes_string_value.sql @@ -0,0 +1,3 @@ +-- string_value был VARCHAR(255) с V2, хотя mt_fields.length для Title/AuthorName/ +-- Publisher/Series заявляет 500-1000. Та же проблема, что чинили в V9 для mt_data.name. +ALTER TABLE mt_indexes ALTER COLUMN string_value TYPE VARCHAR(1000); \ No newline at end of file