diff --git a/CHANGELOG.md b/CHANGELOG.md index e3c0d4f2e..f8a0670c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Internal and API changes - **[breaking change]** Split call API into calls with tuple result as return type and calls with generic Object return type ([#123](https://github.com/tarantool/cartridge-springdata/issues/123)) - Add buildSingleValueResultMapper() in mapper builder for generic call result mappers. That will simplify the support for auto object converter in SpringData. +- Change TarantoolIndexPartMetadata.path type from String to Object to store String or int values ## [0.11.2] - 2023-05-04 diff --git a/src/main/java/io/tarantool/driver/api/metadata/TarantoolIndexPartMetadata.java b/src/main/java/io/tarantool/driver/api/metadata/TarantoolIndexPartMetadata.java index 3c6dec89d..2c9b919fa 100644 --- a/src/main/java/io/tarantool/driver/api/metadata/TarantoolIndexPartMetadata.java +++ b/src/main/java/io/tarantool/driver/api/metadata/TarantoolIndexPartMetadata.java @@ -25,5 +25,5 @@ public interface TarantoolIndexPartMetadata { * * @return path inside field (may be null) */ - String getPath(); + Object getPath(); } diff --git a/src/main/java/io/tarantool/driver/core/metadata/DDLTarantoolSpaceMetadataConverter.java b/src/main/java/io/tarantool/driver/core/metadata/DDLTarantoolSpaceMetadataConverter.java index 739a185e3..2e6bd7cce 100644 --- a/src/main/java/io/tarantool/driver/core/metadata/DDLTarantoolSpaceMetadataConverter.java +++ b/src/main/java/io/tarantool/driver/core/metadata/DDLTarantoolSpaceMetadataConverter.java @@ -187,12 +187,21 @@ private Map parseIndexes( Map partsMap = parts.asMapValue().map(); Value fieldPathValue = partsMap.get(INDEX_PARTS_PATH_KEY); - if (fieldPathValue == null || !fieldPathValue.isStringValue()) { + if (fieldPathValue == null || + (!fieldPathValue.isStringValue() && !fieldPathValue.isIntegerValue())) { throw new TarantoolClientException("Unsupported index metadata format: key '" + - INDEX_PARTS_PATH_KEY + "' must have string value"); + INDEX_PARTS_PATH_KEY + "' must have string or int value"); + } + + int fieldNumber; + Object fieldPath; + if (fieldPathValue.isStringValue()) { + fieldPath = fieldPathValue.asStringValue().asString(); + fieldNumber = getFieldNumberFromFieldPath(fields, (String) fieldPath); + } else { + fieldNumber = fieldPathValue.asIntegerValue().asInt(); + fieldPath = fieldNumber; } - String fieldPath = fieldPathValue.asStringValue().asString(); - int fieldNumber = getFieldNumberFromFieldPath(fields, fieldPath); Value fieldTypeValue = partsMap.get(INDEX_PARTS_TYPE_KEY); if (fieldTypeValue == null || !fieldTypeValue.isStringValue()) { diff --git a/src/main/java/io/tarantool/driver/core/metadata/TarantoolIndexPartMetadataImpl.java b/src/main/java/io/tarantool/driver/core/metadata/TarantoolIndexPartMetadataImpl.java index d72715598..2061ffd4e 100644 --- a/src/main/java/io/tarantool/driver/core/metadata/TarantoolIndexPartMetadataImpl.java +++ b/src/main/java/io/tarantool/driver/core/metadata/TarantoolIndexPartMetadataImpl.java @@ -11,13 +11,13 @@ class TarantoolIndexPartMetadataImpl implements TarantoolIndexPartMetadata { private final int fieldIndex; private final String fieldType; - private final String path; + private final Object path; TarantoolIndexPartMetadataImpl(int fieldIndex, String fieldType) { this(fieldIndex, fieldType, null); } - TarantoolIndexPartMetadataImpl(int fieldIndex, String fieldType, String path) { + TarantoolIndexPartMetadataImpl(int fieldIndex, String fieldType, Object path) { this.fieldIndex = fieldIndex; this.fieldType = fieldType; this.path = path; @@ -34,7 +34,7 @@ public String getFieldType() { } @Override - public String getPath() { + public Object getPath() { return path; } } diff --git a/src/test/java/io/tarantool/driver/api/conditions/ConditionsTest.java b/src/test/java/io/tarantool/driver/api/conditions/ConditionsTest.java index 61445b4aa..656648a2a 100644 --- a/src/test/java/io/tarantool/driver/api/conditions/ConditionsTest.java +++ b/src/test/java/io/tarantool/driver/api/conditions/ConditionsTest.java @@ -1,5 +1,7 @@ package io.tarantool.driver.api.conditions; +import io.tarantool.driver.api.metadata.TarantoolIndexMetadata; +import io.tarantool.driver.api.metadata.TarantoolIndexPartMetadata; import io.tarantool.driver.api.metadata.TarantoolSpaceMetadata; import io.tarantool.driver.api.tuple.DefaultTarantoolTupleFactory; import io.tarantool.driver.api.tuple.TarantoolTuple; @@ -25,7 +27,9 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Optional; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -344,4 +348,30 @@ public void testSerialize() throws IOException, ClassNotFoundException { assertEquals(conditions.toProxyQuery(testOperations, spaceMetadata), serializedConditions.toProxyQuery(testOperations, spaceMetadata)); } + + @Test + public void testIndexMetadata_CanHandleBothStringAndIntFiledPath() { + Optional primaryIndex = testOperations.getIndexByName("test", "primary"); + assertTrue(primaryIndex.isPresent()); + Object path = primaryIndex.get().getIndexParts().get(0).getPath(); + assertEquals(path.getClass(), Integer.class); + assertEquals(1, path); + + Optional asecondaryIndex = testOperations.getIndexByName("test", "asecondary"); + assertTrue(asecondaryIndex.isPresent()); + path = asecondaryIndex.get().getIndexParts().get(0).getPath(); + assertEquals(path.getClass(), String.class); + assertEquals(path, "second"); + + Optional asecondary1Index = testOperations.getIndexByName("test", "asecondary1"); + assertTrue(asecondary1Index.isPresent()); + List indexParts = asecondary1Index.get().getIndexParts(); + assertEquals(indexParts.size(), 2); + path = indexParts.get(0).getPath(); + assertEquals(path.getClass(), Integer.class); + assertEquals(path, 2); + path = indexParts.get(1).getPath(); + assertEquals(path.getClass(), String.class); + assertEquals(path, "third"); + } } diff --git a/src/test/java/io/tarantool/driver/core/metadata/TestMetadataContainer.java b/src/test/java/io/tarantool/driver/core/metadata/TestMetadataContainer.java index 6e6987e9d..d7599b80b 100644 --- a/src/test/java/io/tarantool/driver/core/metadata/TestMetadataContainer.java +++ b/src/test/java/io/tarantool/driver/core/metadata/TestMetadataContainer.java @@ -44,7 +44,7 @@ public TestMetadataContainer() { testPrimaryIndexMetadata.setIndexName("primary"); testPrimaryIndexMetadata.setSpaceId(512); testPrimaryIndexMetadata.setIndexParts(Collections.singletonList( - new TarantoolIndexPartMetadataImpl(0, "string")) + new TarantoolIndexPartMetadataImpl(0, "string", 1)) ); testIndexMetadata2 = new TarantoolIndexMetadataImpl(); @@ -52,8 +52,8 @@ public TestMetadataContainer() { testIndexMetadata2.setIndexName("asecondary1"); testIndexMetadata2.setSpaceId(512); List parts = new ArrayList<>(); - parts.add(new TarantoolIndexPartMetadataImpl(1, "number")); - parts.add(new TarantoolIndexPartMetadataImpl(2, "number")); + parts.add(new TarantoolIndexPartMetadataImpl(1, "number", 2)); + parts.add(new TarantoolIndexPartMetadataImpl(2, "number", "third")); testIndexMetadata2.setIndexParts(parts); testIndexMetadata3 = new TarantoolIndexMetadataImpl(); @@ -79,7 +79,8 @@ public TestMetadataContainer() { testIndexMetadata1.setIndexId(4); testIndexMetadata1.setIndexName("asecondary"); testIndexMetadata1.setSpaceId(512); - testIndexMetadata1.setIndexParts(Collections.singletonList(new TarantoolIndexPartMetadataImpl(1, "number"))); + testIndexMetadata1.setIndexParts(Collections.singletonList(new TarantoolIndexPartMetadataImpl(1, "number", + "second"))); } @Override