Skip to content

Commit

Permalink
Add support of numerical index path
Browse files Browse the repository at this point in the history
Change TarantoolIndexPartMetadata.path type from String to Object to store String or int values

Closes #395
  • Loading branch information
iDneprov authored and dkasimovskiy committed Jun 8, 2023
1 parent 48ce65a commit b8d04df
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 12 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,5 @@ public interface TarantoolIndexPartMetadata {
*
* @return path inside field (may be null)
*/
String getPath();
Object getPath();
}
Original file line number Diff line number Diff line change
Expand Up @@ -187,12 +187,21 @@ private Map<String, TarantoolIndexMetadata> parseIndexes(
Map<Value, Value> 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()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -34,7 +34,7 @@ public String getFieldType() {
}

@Override
public String getPath() {
public Object getPath() {
return path;
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;

Expand Down Expand Up @@ -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<TarantoolIndexMetadata> 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<TarantoolIndexMetadata> asecondaryIndex = testOperations.getIndexByName("test", "asecondary");
assertTrue(asecondaryIndex.isPresent());
path = asecondaryIndex.get().getIndexParts().get(0).getPath();
assertEquals(path.getClass(), String.class);
assertEquals(path, "second");

Optional<TarantoolIndexMetadata> asecondary1Index = testOperations.getIndexByName("test", "asecondary1");
assertTrue(asecondary1Index.isPresent());
List<TarantoolIndexPartMetadata> 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");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,16 +44,16 @@ public TestMetadataContainer() {
testPrimaryIndexMetadata.setIndexName("primary");
testPrimaryIndexMetadata.setSpaceId(512);
testPrimaryIndexMetadata.setIndexParts(Collections.singletonList(
new TarantoolIndexPartMetadataImpl(0, "string"))
new TarantoolIndexPartMetadataImpl(0, "string", 1))
);

testIndexMetadata2 = new TarantoolIndexMetadataImpl();
testIndexMetadata2.setIndexId(1);
testIndexMetadata2.setIndexName("asecondary1");
testIndexMetadata2.setSpaceId(512);
List<TarantoolIndexPartMetadata> 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();
Expand All @@ -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
Expand Down

0 comments on commit b8d04df

Please sign in to comment.