Skip to content
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
eaf4bce
Initial vector set commit
ggivo Jul 14, 2025
ea9e47a
Add UnifiedJedis vadd integration tests
ggivo Jul 14, 2025
f153e72
Add support for reduce dim in vadd
ggivo Jul 15, 2025
41490ee
Add support for vgetattr
ggivo Jul 15, 2025
608f78c
Add support for vsetattr
ggivo Jul 15, 2025
54708ca
Add support for vinfo
ggivo Jul 16, 2025
d7d8e85
Add VDIM, VCARD integration test
ggivo Jul 16, 2025
f493547
Add VEMB integration test
ggivo Jul 16, 2025
9a141d5
Add VSETATTR/VGETATTR integration test
ggivo Jul 16, 2025
caceeff
Add VLINKS integration test
ggivo Jul 16, 2025
1b63d34
Add VRANDMEMBER integration test
ggivo Jul 17, 2025
a0fab23
Add VREM integration test
ggivo Jul 17, 2025
80ad09b
Add VSIM integration test & refactor
ggivo Jul 17, 2025
7e70773
cleanup
ggivo Jul 17, 2025
dad863a
add missing RawVector
ggivo Jul 17, 2025
8fcc5a8
fix failing tests
ggivo Jul 17, 2025
5262e8f
fix PooledExtendedVectorSetCommandsTest
ggivo Jul 17, 2025
0ac4ad8
mark vector-set api as Experimental
ggivo Jul 18, 2025
299c7ec
Fix tests
ggivo Jul 18, 2025
5f74f97
clean up
ggivo Jul 18, 2025
b6f3f8d
Address review comments
ggivo Jul 23, 2025
9a42d4e
Merge branch 'master' into feature/vector-set
ggivo Jul 23, 2025
2f80150
Merge branch 'master' into feature/vector-set
ggivo Jul 25, 2025
c0d44de
fix tests after merge conflict is resolved
ggivo Jul 25, 2025
d344458
format new files
ggivo Jul 25, 2025
a537d2c
Merge branch 'master' into feature/vector-set
ggivo Aug 13, 2025
a6b4968
Add EPSILON parameter
ggivo Aug 13, 2025
7df889d
fix errors in javadocs (java 8)
ggivo Aug 13, 2025
68fc925
Merge branch 'master' into feature/vector-set
ggivo Aug 14, 2025
2fa50ff
Merge branch 'master' into feature/vector-set
ggivo Aug 14, 2025
a285848
fix errors after rebase
ggivo Aug 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
184 changes: 183 additions & 1 deletion src/main/java/redis/clients/jedis/BuilderFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,6 @@ public String toString() {

public static final Builder<Set<byte[]>> BINARY_SET = new Builder<Set<byte[]>>() {
@Override
@SuppressWarnings("unchecked")
public Set<byte[]> build(Object data) {
if (null == data) {
return null;
Expand Down Expand Up @@ -477,6 +476,66 @@ public String toString() {
}
};

public static final Builder<Map<String, Double>> STRING_DOUBLE_MAP = new Builder<Map<String, Double>>() {
@Override
@SuppressWarnings("unchecked")
public Map<String, Double> build(Object data) {
final List<Object> list = (List<Object>) data;
if (list.isEmpty()) return Collections.emptyMap();

if (list.get(0) instanceof KeyValue) {
final Map<String, Double> map = new LinkedHashMap<>(list.size(), 1f);
for (Object o : list) {
KeyValue<?, ?> kv = (KeyValue<?, ?>) o;
map.put(STRING.build(kv.getKey()), DOUBLE.build(kv.getValue()));
}
return map;
} else {
final Map<String, Double> map = new LinkedHashMap<>(list.size() / 2, 1f);
final Iterator iterator = list.iterator();
while (iterator.hasNext()) {
map.put(STRING.build(iterator.next()), DOUBLE.build(iterator.next()));
}
return map;
}
}

@Override
public String toString() {
return "Map<String, Double>";
}
};


public static final Builder<Map<byte[], Double>> BINARY_DOUBLE_MAP = new Builder<Map<byte[], Double>>() {
@Override
@SuppressWarnings("unchecked")
public Map<byte[], Double> build(Object data) {
final List<Object> list = (List<Object>) data;
if (list.isEmpty()) return Collections.emptyMap();

if (list.get(0) instanceof KeyValue) {
final Map<byte[], Double> map = new LinkedHashMap<>(list.size(), 1f);
for (Object o : list) {
KeyValue<?, ?> kv = (KeyValue<?, ?>) o;
map.put(BINARY.build(kv.getKey()), DOUBLE.build(kv.getValue()));
}
return map;
} else {
final Map<byte[], Double> map = new LinkedHashMap<>(list.size() / 2, 1f);
final Iterator iterator = list.iterator();
while (iterator.hasNext()) {
map.put(BINARY.build(iterator.next()), DOUBLE.build(iterator.next()));
}
return map;
}
}

@Override
public String toString() {
return "Map<String, Double>";
}
};
public static final Builder<KeyValue<String, String>> KEYED_ELEMENT = new Builder<KeyValue<String, String>>() {
@Override
@SuppressWarnings("unchecked")
Expand Down Expand Up @@ -1781,6 +1840,43 @@ public String toString() {
@Deprecated
public static final Builder<StreamFullInfo> STREAM_INFO_FULL = STREAM_FULL_INFO;

public static final Builder<VectorInfo> VECTOR_INFO = new Builder<VectorInfo>() {

final Map<String, Builder> mappingFunctions = createDecoderMap();

private Map<String, Builder> createDecoderMap() {
Map<String, Builder> tempMappingFunctions = new HashMap<>();
tempMappingFunctions.put(VectorInfo.VECTOR_DIM, LONG);
tempMappingFunctions.put(VectorInfo.TYPE, STRING);
tempMappingFunctions.put(VectorInfo.SIZE, LONG);
tempMappingFunctions.put(VectorInfo.MAX_NODE_UID, LONG);
tempMappingFunctions.put(VectorInfo.VSET_UID, LONG);
tempMappingFunctions.put(VectorInfo.MAX_NODES, LONG);
tempMappingFunctions.put(VectorInfo.PROJECTION_INPUT_DIM, LONG);
tempMappingFunctions.put(VectorInfo.ATTRIBUTES_COUNT, LONG);
tempMappingFunctions.put(VectorInfo.MAX_LEVEL, LONG);
return tempMappingFunctions;
}

@Override
@SuppressWarnings("unchecked")
public VectorInfo build(Object data) {
if (null == data) {
return null;
}

List<Object> vectorEntries = (List<Object>) data;
Iterator<Object> iterator = vectorEntries.iterator();

return new VectorInfo(createMapFromDecodingFunctions(iterator, mappingFunctions));
}

@Override
public String toString() {
return "VectorInfo";
}
};

public static final Builder<StreamPendingSummary> STREAM_PENDING_SUMMARY = new Builder<StreamPendingSummary>() {
@Override
@SuppressWarnings("unchecked")
Expand Down Expand Up @@ -2116,6 +2212,92 @@ public String toString() {
}
};

// Vector Set builders


public static final Builder<RawVector> VEMB_RAW_RESULT = new Builder<RawVector>() {
@Override
@SuppressWarnings("unchecked")
public RawVector build(Object data) {
if (data == null) return null;
List<Object> list = (List<Object>) data;

String quantizationType = STRING.build(list.get(0));
byte[] rawData = (byte[]) list.get(1);
Double norm = DOUBLE.build(list.get(2));
Double quantizationRange = list.size() > 3 ? DOUBLE.build(list.get(3)) : null;

return new RawVector(quantizationType, rawData, norm, quantizationRange);
}

@Override
public String toString() {
return "RawVector";
}
};

// VLINKS builders
public static final Builder<List<Map<String, Double>>> VLINKS_WITH_SCORES_RESULT = new Builder<List<Map<String, Double>>>() {
@Override
@SuppressWarnings("unchecked")
public List<Map<String, Double>> build(Object data) {
if (data == null) return null;
List<Object> list = (List<Object>) data;

List<Map<String, Double>> result = new ArrayList<>();
for (Object scoresRaw : list) {
if (scoresRaw == null) continue;
Map<String, Double> scores = STRING_DOUBLE_MAP.build(scoresRaw);
result.add(scores);
}

return result;
}

@Override
public String toString() {
return "List<Map<String, Double>>";
}
};

public static final Builder<List<List<byte[]>>> BINARY_LIST_LIST = new Builder<List<List<byte[]>>>() {
@Override
@SuppressWarnings("unchecked")
public List<List<byte[]>> build(Object data) {
if (null == data) return null;
return ((List<Object>) data).stream().map(BINARY_LIST::build).collect(Collectors.toList());
}

@Override
public String toString() {
return "List<List<String>>";
}
};


public static final Builder<List<Map<byte[], Double>>> VLINKS_WITH_SCORES_RESULT_BINARY = new Builder<List<Map<byte[], Double>>>() {
@Override
@SuppressWarnings("unchecked")
public List<Map<byte[], Double>> build(Object data) {
if (data == null) return null;
List<Object> list = (List<Object>) data;

List<Map<byte[], Double>> result = new ArrayList<>();
for (Object scoresRaw : list) {
if (scoresRaw == null) continue;
Map<byte[], Double> scores = BINARY_DOUBLE_MAP.build(scoresRaw);
result.add(scores);
}

return result;
}

@Override
public String toString() {
return "List<Map<byte[], Double>>";
}
};

/**
* A decorator to implement Set from List. Assume that given List do not contains duplicated
* values. The resulting set displays the same ordering, concurrency, and performance
Expand Down
Loading
Loading