Skip to content

Commit 22f3346

Browse files
tishunuglide
authored andcommitted
Support Redis 8 vector sets redis#3296 (redis#3295)
* Initial implementation * Part 2. Modified signature accordingly, added hallucinated JavaDoc * Fix copyright * Part 2. Adding the commands, partial implementation of the command builder, stubs for the outputs * Unit tests fixed, Integration tests added * Implemented parsing of complex data, fixed failing tests * More testing. Advanced test cases added. * Polishing * Fixed some regressions from last change * Leftovers : remove commented out values in the apigenerator, add some more JavaDoc * Missed some formatting * Fix Kotlin code with the large axe, not making any apologies * Formatter * Add vector set examples Port of https://github.com/redis/redis-py/blob/master/doctests/dt_vec_set.py * Use redis:8.0.2 image in doctests * Add JSON in the mix * Add vClearAttributes --------- Co-authored-by: Igor Malinovskiy <[email protected]>
1 parent ae36de4 commit 22f3346

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+8402
-37
lines changed

.github/workflows/doctests.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
runs-on: ubuntu-latest
1515
services:
1616
redis-stack:
17-
image: redis/redis-stack-server:latest
17+
image: redis:8.0.2
1818
options: >-
1919
--health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5
2020
ports:
@@ -37,4 +37,4 @@ jobs:
3737
${{ runner.os }}-maven-
3838
- name: Run doctests
3939
run: |
40-
mvn -Pdoctests test
40+
mvn -Pdoctests test

src/main/java/io/lettuce/core/AbstractRedisAsyncCommands.java

Lines changed: 142 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
4848
import io.lettuce.core.protocol.CommandType;
4949
import io.lettuce.core.protocol.ProtocolKeyword;
5050
import io.lettuce.core.protocol.RedisCommand;
51+
import io.lettuce.core.vector.RawVector;
52+
import io.lettuce.core.vector.VectorMetadata;
5153

5254
import java.time.Duration;
5355
import java.time.Instant;
@@ -79,14 +81,17 @@ public abstract class AbstractRedisAsyncCommands<K, V> implements RedisAclAsyncC
7981
RedisKeyAsyncCommands<K, V>, RedisStringAsyncCommands<K, V>, RedisListAsyncCommands<K, V>, RedisSetAsyncCommands<K, V>,
8082
RedisSortedSetAsyncCommands<K, V>, RedisScriptingAsyncCommands<K, V>, RedisServerAsyncCommands<K, V>,
8183
RedisHLLAsyncCommands<K, V>, BaseRedisAsyncCommands<K, V>, RedisTransactionalAsyncCommands<K, V>,
82-
RedisGeoAsyncCommands<K, V>, RedisClusterAsyncCommands<K, V>, RedisJsonAsyncCommands<K, V> {
84+
RedisGeoAsyncCommands<K, V>, RedisClusterAsyncCommands<K, V>, RedisJsonAsyncCommands<K, V>,
85+
RedisVectorSetAsyncCommands<K, V> {
8386

8487
private final StatefulConnection<K, V> connection;
8588

8689
private final RedisCommandBuilder<K, V> commandBuilder;
8790

8891
private final RedisJsonCommandBuilder<K, V> jsonCommandBuilder;
8992

93+
private final RedisVectorSetCommandBuilder<K, V> vectorSetCommandBuilder;
94+
9095
private final Supplier<JsonParser> parser;
9196

9297
/**
@@ -102,6 +107,7 @@ public AbstractRedisAsyncCommands(StatefulConnection<K, V> connection, RedisCode
102107
this.connection = connection;
103108
this.commandBuilder = new RedisCommandBuilder<>(codec);
104109
this.jsonCommandBuilder = new RedisJsonCommandBuilder<>(codec, parser);
110+
this.vectorSetCommandBuilder = new RedisVectorSetCommandBuilder<>(codec, parser);
105111
}
106112

107113
/**
@@ -1684,6 +1690,141 @@ public RedisFuture<List<JsonType>> jsonType(K key) {
16841690
return dispatch(jsonCommandBuilder.jsonType(key, JsonPath.ROOT_PATH));
16851691
}
16861692

1693+
@Override
1694+
public RedisFuture<Boolean> vadd(K key, V element, Double... vectors) {
1695+
return dispatch(vectorSetCommandBuilder.vadd(key, element, null, vectors));
1696+
}
1697+
1698+
@Override
1699+
public RedisFuture<Boolean> vadd(K key, int dimensionality, V element, Double... vectors) {
1700+
return dispatch(vectorSetCommandBuilder.vadd(key, dimensionality, element, null, vectors));
1701+
}
1702+
1703+
@Override
1704+
public RedisFuture<Boolean> vadd(K key, V element, VAddArgs args, Double... vectors) {
1705+
return dispatch(vectorSetCommandBuilder.vadd(key, element, args, vectors));
1706+
}
1707+
1708+
@Override
1709+
public RedisFuture<Boolean> vadd(K key, int dimensionality, V element, VAddArgs args, Double... vectors) {
1710+
return dispatch(vectorSetCommandBuilder.vadd(key, dimensionality, element, args, vectors));
1711+
}
1712+
1713+
@Override
1714+
public RedisFuture<Long> vcard(K key) {
1715+
return dispatch(vectorSetCommandBuilder.vcard(key));
1716+
}
1717+
1718+
@Override
1719+
public RedisFuture<Boolean> vClearAttributes(K key, V element) {
1720+
return dispatch(vectorSetCommandBuilder.vsetattr(key, element, ""));
1721+
}
1722+
1723+
@Override
1724+
public RedisFuture<Long> vdim(K key) {
1725+
return dispatch(vectorSetCommandBuilder.vdim(key));
1726+
}
1727+
1728+
@Override
1729+
public RedisFuture<List<Double>> vemb(K key, V element) {
1730+
return dispatch(vectorSetCommandBuilder.vemb(key, element));
1731+
}
1732+
1733+
@Override
1734+
public RedisFuture<RawVector> vembRaw(K key, V element) {
1735+
return dispatch(vectorSetCommandBuilder.vembRaw(key, element));
1736+
}
1737+
1738+
@Override
1739+
public RedisFuture<String> vgetattr(K key, V element) {
1740+
return dispatch(vectorSetCommandBuilder.vgetattr(key, element));
1741+
}
1742+
1743+
@Override
1744+
public RedisFuture<List<JsonValue>> vgetattrAsJsonValue(K key, V element) {
1745+
return dispatch(vectorSetCommandBuilder.vgetattrAsJsonValue(key, element));
1746+
}
1747+
1748+
@Override
1749+
public RedisFuture<VectorMetadata> vinfo(K key) {
1750+
return dispatch(vectorSetCommandBuilder.vinfo(key));
1751+
}
1752+
1753+
@Override
1754+
public RedisFuture<List<V>> vlinks(K key, V element) {
1755+
return dispatch(vectorSetCommandBuilder.vlinks(key, element));
1756+
}
1757+
1758+
@Override
1759+
public RedisFuture<Map<V, Double>> vlinksWithScores(K key, V element) {
1760+
return dispatch(vectorSetCommandBuilder.vlinksWithScores(key, element));
1761+
}
1762+
1763+
@Override
1764+
public RedisFuture<V> vrandmember(K key) {
1765+
return dispatch(vectorSetCommandBuilder.vrandmember(key));
1766+
}
1767+
1768+
@Override
1769+
public RedisFuture<List<V>> vrandmember(K key, int count) {
1770+
return dispatch(vectorSetCommandBuilder.vrandmember(key, count));
1771+
}
1772+
1773+
@Override
1774+
public RedisFuture<Boolean> vrem(K key, V element) {
1775+
return dispatch(vectorSetCommandBuilder.vrem(key, element));
1776+
}
1777+
1778+
@Override
1779+
public RedisFuture<Boolean> vsetattr(K key, V element, String json) {
1780+
return dispatch(vectorSetCommandBuilder.vsetattr(key, element, json));
1781+
}
1782+
1783+
@Override
1784+
public RedisFuture<Boolean> vsetattr(K key, V element, JsonValue json) {
1785+
return dispatch(vectorSetCommandBuilder.vsetattr(key, element, json));
1786+
}
1787+
1788+
@Override
1789+
public RedisFuture<List<V>> vsim(K key, Double... vectors) {
1790+
return dispatch(vectorSetCommandBuilder.vsim(key, null, vectors));
1791+
}
1792+
1793+
@Override
1794+
public RedisFuture<List<V>> vsim(K key, V element) {
1795+
return dispatch(vectorSetCommandBuilder.vsim(key, null, element));
1796+
}
1797+
1798+
@Override
1799+
public RedisFuture<List<V>> vsim(K key, VSimArgs args, Double... vectors) {
1800+
return dispatch(vectorSetCommandBuilder.vsim(key, args, vectors));
1801+
}
1802+
1803+
@Override
1804+
public RedisFuture<List<V>> vsim(K key, VSimArgs args, V element) {
1805+
return dispatch(vectorSetCommandBuilder.vsim(key, args, element));
1806+
}
1807+
1808+
@Override
1809+
public RedisFuture<Map<V, Double>> vsimWithScore(K key, Double... vectors) {
1810+
return dispatch(vectorSetCommandBuilder.vsimWithScore(key, null, vectors));
1811+
}
1812+
1813+
@Override
1814+
public RedisFuture<Map<V, Double>> vsimWithScore(K key, V element) {
1815+
return dispatch(vectorSetCommandBuilder.vsimWithScore(key, null, element));
1816+
}
1817+
1818+
@Override
1819+
public RedisFuture<Map<V, Double>> vsimWithScore(K key, VSimArgs args, Double... vectors) {
1820+
return dispatch(vectorSetCommandBuilder.vsimWithScore(key, args, vectors));
1821+
}
1822+
1823+
@Override
1824+
public RedisFuture<Map<V, Double>> vsimWithScore(K key, VSimArgs args, V element) {
1825+
return dispatch(vectorSetCommandBuilder.vsimWithScore(key, args, element));
1826+
}
1827+
16871828
@Override
16881829
public RedisFuture<List<K>> keys(K pattern) {
16891830
return dispatch(commandBuilder.keys(pattern));

src/main/java/io/lettuce/core/AbstractRedisReactiveCommands.java

Lines changed: 146 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@
5252
import io.lettuce.core.tracing.TraceContext;
5353
import io.lettuce.core.tracing.TraceContextProvider;
5454
import io.lettuce.core.tracing.Tracing;
55+
import io.lettuce.core.vector.RawVector;
56+
import io.lettuce.core.vector.VectorMetadata;
5557
import io.netty.util.concurrent.EventExecutorGroup;
5658
import io.netty.util.concurrent.ImmediateEventExecutor;
5759
import reactor.core.publisher.Flux;
@@ -84,19 +86,21 @@
8486
* @author Tihomir Mateev
8587
* @since 4.0
8688
*/
87-
public abstract class AbstractRedisReactiveCommands<K, V>
88-
implements RedisAclReactiveCommands<K, V>, RedisHashReactiveCommands<K, V>, RedisKeyReactiveCommands<K, V>,
89-
RedisStringReactiveCommands<K, V>, RedisListReactiveCommands<K, V>, RedisSetReactiveCommands<K, V>,
90-
RedisSortedSetReactiveCommands<K, V>, RedisScriptingReactiveCommands<K, V>, RedisServerReactiveCommands<K, V>,
91-
RedisHLLReactiveCommands<K, V>, BaseRedisReactiveCommands<K, V>, RedisTransactionalReactiveCommands<K, V>,
92-
RedisGeoReactiveCommands<K, V>, RedisClusterReactiveCommands<K, V>, RedisJsonReactiveCommands<K, V> {
89+
public abstract class AbstractRedisReactiveCommands<K, V> implements RedisAclReactiveCommands<K, V>,
90+
RedisHashReactiveCommands<K, V>, RedisKeyReactiveCommands<K, V>, RedisStringReactiveCommands<K, V>,
91+
RedisListReactiveCommands<K, V>, RedisSetReactiveCommands<K, V>, RedisSortedSetReactiveCommands<K, V>,
92+
RedisScriptingReactiveCommands<K, V>, RedisServerReactiveCommands<K, V>, RedisHLLReactiveCommands<K, V>,
93+
BaseRedisReactiveCommands<K, V>, RedisTransactionalReactiveCommands<K, V>, RedisGeoReactiveCommands<K, V>,
94+
RedisClusterReactiveCommands<K, V>, RedisJsonReactiveCommands<K, V>, RedisVectorSetReactiveCommands<K, V> {
9395

9496
private final StatefulConnection<K, V> connection;
9597

9698
private final RedisCommandBuilder<K, V> commandBuilder;
9799

98100
private final RedisJsonCommandBuilder<K, V> jsonCommandBuilder;
99101

102+
private final RedisVectorSetCommandBuilder<K, V> vectorSetCommandBuilder;
103+
100104
private final Supplier<JsonParser> parser;
101105

102106
private final ClientResources clientResources;
@@ -118,6 +122,7 @@ public AbstractRedisReactiveCommands(StatefulConnection<K, V> connection, RedisC
118122
this.parser = parser;
119123
this.commandBuilder = new RedisCommandBuilder<>(codec);
120124
this.jsonCommandBuilder = new RedisJsonCommandBuilder<>(codec, parser);
125+
this.vectorSetCommandBuilder = new RedisVectorSetCommandBuilder<>(codec, parser);
121126
this.clientResources = connection.getResources();
122127
this.tracingEnabled = clientResources.tracing().isEnabled();
123128
}
@@ -1752,6 +1757,141 @@ public Flux<JsonType> jsonType(K key) {
17521757
return createDissolvingFlux(() -> jsonCommandBuilder.jsonType(key, JsonPath.ROOT_PATH));
17531758
}
17541759

1760+
@Override
1761+
public Mono<Boolean> vadd(K key, V element, Double... vectors) {
1762+
return createMono(() -> vectorSetCommandBuilder.vadd(key, element, null, vectors));
1763+
}
1764+
1765+
@Override
1766+
public Mono<Boolean> vadd(K key, int dimensionality, V element, Double... vectors) {
1767+
return createMono(() -> vectorSetCommandBuilder.vadd(key, dimensionality, element, null, vectors));
1768+
}
1769+
1770+
@Override
1771+
public Mono<Boolean> vadd(K key, V element, VAddArgs args, Double... vectors) {
1772+
return createMono(() -> vectorSetCommandBuilder.vadd(key, element, args, vectors));
1773+
}
1774+
1775+
@Override
1776+
public Mono<Boolean> vadd(K key, int dimensionality, V element, VAddArgs args, Double... vectors) {
1777+
return createMono(() -> vectorSetCommandBuilder.vadd(key, dimensionality, element, args, vectors));
1778+
}
1779+
1780+
@Override
1781+
public Mono<Long> vcard(K key) {
1782+
return createMono(() -> vectorSetCommandBuilder.vcard(key));
1783+
}
1784+
1785+
@Override
1786+
public Mono<Boolean> vClearAttributes(K key, V element) {
1787+
return createMono(() -> vectorSetCommandBuilder.vsetattr(key, element, ""));
1788+
}
1789+
1790+
@Override
1791+
public Mono<Long> vdim(K key) {
1792+
return createMono(() -> vectorSetCommandBuilder.vdim(key));
1793+
}
1794+
1795+
@Override
1796+
public Flux<Double> vemb(K key, V element) {
1797+
return createDissolvingFlux(() -> vectorSetCommandBuilder.vemb(key, element));
1798+
}
1799+
1800+
@Override
1801+
public Mono<RawVector> vembRaw(K key, V element) {
1802+
return createMono(() -> vectorSetCommandBuilder.vembRaw(key, element));
1803+
}
1804+
1805+
@Override
1806+
public Mono<String> vgetattr(K key, V element) {
1807+
return createMono(() -> vectorSetCommandBuilder.vgetattr(key, element));
1808+
}
1809+
1810+
@Override
1811+
public Flux<JsonValue> vgetattrAsJsonValue(K key, V element) {
1812+
return createDissolvingFlux(() -> vectorSetCommandBuilder.vgetattrAsJsonValue(key, element));
1813+
}
1814+
1815+
@Override
1816+
public Mono<VectorMetadata> vinfo(K key) {
1817+
return createMono(() -> vectorSetCommandBuilder.vinfo(key));
1818+
}
1819+
1820+
@Override
1821+
public Flux<V> vlinks(K key, V element) {
1822+
return createDissolvingFlux(() -> vectorSetCommandBuilder.vlinks(key, element));
1823+
}
1824+
1825+
@Override
1826+
public Mono<Map<V, Double>> vlinksWithScores(K key, V element) {
1827+
return createMono(() -> vectorSetCommandBuilder.vlinksWithScores(key, element));
1828+
}
1829+
1830+
@Override
1831+
public Mono<V> vrandmember(K key) {
1832+
return createMono(() -> vectorSetCommandBuilder.vrandmember(key));
1833+
}
1834+
1835+
@Override
1836+
public Flux<V> vrandmember(K key, int count) {
1837+
return createDissolvingFlux(() -> vectorSetCommandBuilder.vrandmember(key, count));
1838+
}
1839+
1840+
@Override
1841+
public Mono<Boolean> vrem(K key, V element) {
1842+
return createMono(() -> vectorSetCommandBuilder.vrem(key, element));
1843+
}
1844+
1845+
@Override
1846+
public Mono<Boolean> vsetattr(K key, V element, String json) {
1847+
return createMono(() -> vectorSetCommandBuilder.vsetattr(key, element, json));
1848+
}
1849+
1850+
@Override
1851+
public Mono<Boolean> vsetattr(K key, V element, JsonValue json) {
1852+
return createMono(() -> vectorSetCommandBuilder.vsetattr(key, element, json));
1853+
}
1854+
1855+
@Override
1856+
public Flux<V> vsim(K key, Double... vectors) {
1857+
return createDissolvingFlux(() -> vectorSetCommandBuilder.vsim(key, null, vectors));
1858+
}
1859+
1860+
@Override
1861+
public Flux<V> vsim(K key, V element) {
1862+
return createDissolvingFlux(() -> vectorSetCommandBuilder.vsim(key, null, element));
1863+
}
1864+
1865+
@Override
1866+
public Flux<V> vsim(K key, VSimArgs args, Double... vectors) {
1867+
return createDissolvingFlux(() -> vectorSetCommandBuilder.vsim(key, args, vectors));
1868+
}
1869+
1870+
@Override
1871+
public Flux<V> vsim(K key, VSimArgs args, V element) {
1872+
return createDissolvingFlux(() -> vectorSetCommandBuilder.vsim(key, args, element));
1873+
}
1874+
1875+
@Override
1876+
public Mono<Map<V, Double>> vsimWithScore(K key, Double... vectors) {
1877+
return createMono(() -> vectorSetCommandBuilder.vsimWithScore(key, null, vectors));
1878+
}
1879+
1880+
@Override
1881+
public Mono<Map<V, Double>> vsimWithScore(K key, V element) {
1882+
return createMono(() -> vectorSetCommandBuilder.vsimWithScore(key, null, element));
1883+
}
1884+
1885+
@Override
1886+
public Mono<Map<V, Double>> vsimWithScore(K key, VSimArgs args, Double... vectors) {
1887+
return createMono(() -> vectorSetCommandBuilder.vsimWithScore(key, args, vectors));
1888+
}
1889+
1890+
@Override
1891+
public Mono<Map<V, Double>> vsimWithScore(K key, VSimArgs args, V element) {
1892+
return createMono(() -> vectorSetCommandBuilder.vsimWithScore(key, args, element));
1893+
}
1894+
17551895
@Override
17561896
public Flux<K> keys(K pattern) {
17571897
return createDissolvingFlux(() -> commandBuilder.keys(pattern));

0 commit comments

Comments
 (0)