Skip to content

Commit 62c8912

Browse files
committed
Introduce Tarantool client DSL
This DSL includes set of request builders that can be used as a public API to construct requests. The main idea here is to provide more natural DSL-like approach to build operations instead of current abstract types like List<?> or List<Object>. Affects: #212
1 parent ecf165d commit 62c8912

19 files changed

+1086
-115
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,20 @@
11
package org.tarantool;
22

3-
import static org.tarantool.RequestArguments.cacheLookupValue;
4-
import static org.tarantool.RequestArguments.value;
5-
3+
import static org.tarantool.dsl.Requests.callRequest;
4+
import static org.tarantool.dsl.Requests.deleteRequest;
5+
import static org.tarantool.dsl.Requests.evalRequest;
6+
import static org.tarantool.dsl.Requests.insertRequest;
7+
import static org.tarantool.dsl.Requests.pingRequest;
8+
import static org.tarantool.dsl.Requests.replaceRequest;
9+
import static org.tarantool.dsl.Requests.selectRequest;
10+
import static org.tarantool.dsl.Requests.updateRequest;
11+
import static org.tarantool.dsl.Requests.upsertRequest;
12+
13+
import org.tarantool.dsl.Operation;
14+
import org.tarantool.dsl.TarantoolRequestConvertible;
615
import org.tarantool.schema.TarantoolSchemaMeta;
716

17+
import java.util.Arrays;
818
import java.util.List;
919

1020
public abstract class AbstractTarantoolOps<Result>
@@ -17,188 +27,132 @@ public abstract class AbstractTarantoolOps<Result>
1727
protected abstract TarantoolSchemaMeta getSchemaMeta();
1828

1929
public Result select(Integer space, Integer index, List<?> key, int offset, int limit, Iterator iterator) {
20-
return select(space, index, key, offset, limit, iterator.getValue());
30+
return execute(
31+
selectRequest(space, index)
32+
.key(key)
33+
.offset(offset).limit(limit)
34+
.iterator(iterator)
35+
);
2136
}
2237

2338
@Override
2439
public Result select(String space, String index, List<?> key, int offset, int limit, Iterator iterator) {
25-
return select(space, index, key, offset, limit, iterator.getValue());
40+
return execute(
41+
selectRequest(space, index)
42+
.key(key)
43+
.offset(offset).limit(limit)
44+
.iterator(iterator)
45+
);
2646
}
2747

2848
@Override
2949
public Result select(Integer space, Integer index, List<?> key, int offset, int limit, int iterator) {
30-
return exec(
31-
new TarantoolRequest(
32-
Code.SELECT,
33-
value(Key.SPACE), value(space),
34-
value(Key.INDEX), value(index),
35-
value(Key.KEY), value(key),
36-
value(Key.ITERATOR), value(iterator),
37-
value(Key.LIMIT), value(limit),
38-
value(Key.OFFSET), value(offset)
39-
)
50+
return execute(
51+
selectRequest(space, index)
52+
.key(key)
53+
.offset(offset).limit(limit)
54+
.iterator(iterator)
4055
);
4156
}
4257

4358
@Override
4459
public Result select(String space, String index, List<?> key, int offset, int limit, int iterator) {
45-
return exec(
46-
new TarantoolRequest(
47-
Code.SELECT,
48-
value(Key.SPACE), cacheLookupValue(() -> getSchemaMeta().getSpace(space).getId()),
49-
value(Key.INDEX), cacheLookupValue(() -> getSchemaMeta().getSpaceIndex(space, index).getId()),
50-
value(Key.KEY), value(key),
51-
value(Key.ITERATOR), value(iterator),
52-
value(Key.LIMIT), value(limit),
53-
value(Key.OFFSET), value(offset)
54-
)
60+
return execute(
61+
selectRequest(space, index)
62+
.key(key)
63+
.offset(offset).limit(limit)
64+
.iterator(iterator)
5565
);
5666
}
5767

5868
@Override
5969
public Result insert(Integer space, List<?> tuple) {
60-
return exec(new TarantoolRequest(
61-
Code.INSERT,
62-
value(Key.SPACE), value(space),
63-
value(Key.TUPLE), value(tuple)
64-
)
65-
);
70+
return execute(insertRequest(space, tuple));
6671
}
6772

6873
@Override
6974
public Result insert(String space, List<?> tuple) {
70-
return exec(
71-
new TarantoolRequest(
72-
Code.INSERT,
73-
value(Key.SPACE), cacheLookupValue(() -> getSchemaMeta().getSpace(space).getId()),
74-
value(Key.TUPLE), value(tuple)
75-
)
76-
);
75+
return execute(insertRequest(space, tuple));
7776
}
7877

7978
@Override
8079
public Result replace(Integer space, List<?> tuple) {
81-
return exec(
82-
new TarantoolRequest(
83-
Code.REPLACE,
84-
value(Key.SPACE), value(space),
85-
value(Key.TUPLE), value(tuple)
86-
)
87-
);
80+
return execute(replaceRequest(space, tuple));
8881
}
8982

9083
@Override
9184
public Result replace(String space, List<?> tuple) {
92-
return exec(
93-
new TarantoolRequest(
94-
Code.REPLACE,
95-
value(Key.SPACE), cacheLookupValue(() -> getSchemaMeta().getSpace(space).getId()),
96-
value(Key.TUPLE), value(tuple)
97-
)
98-
);
85+
return execute(replaceRequest(space, tuple));
9986
}
10087

10188
@Override
10289
public Result update(Integer space, List<?> key, Object... operations) {
103-
return exec(
104-
new TarantoolRequest(
105-
Code.UPDATE,
106-
value(Key.SPACE), value(space),
107-
value(Key.KEY), value(key),
108-
value(Key.TUPLE), value(operations)
109-
)
110-
);
90+
Operation[] ops = Arrays.stream(operations)
91+
.map(Operation::fromArray)
92+
.toArray(org.tarantool.dsl.Operation[]::new);
93+
return execute(updateRequest(space, key, ops));
11194
}
11295

11396
@Override
11497
public Result update(String space, List<?> key, Object... operations) {
115-
return exec(
116-
new TarantoolRequest(
117-
Code.UPDATE,
118-
value(Key.SPACE), cacheLookupValue(() -> getSchemaMeta().getSpace(space).getId()),
119-
value(Key.KEY), value(key),
120-
value(Key.TUPLE), value(operations)
121-
)
122-
);
98+
Operation[] ops = Arrays.stream(operations)
99+
.map(Operation::fromArray)
100+
.toArray(org.tarantool.dsl.Operation[]::new);
101+
return execute(updateRequest(space, key, ops));
123102
}
124103

125104
@Override
126105
public Result upsert(Integer space, List<?> key, List<?> defTuple, Object... operations) {
127-
return exec(
128-
new TarantoolRequest(
129-
Code.UPSERT,
130-
value(Key.SPACE), value(space),
131-
value(Key.KEY), value(key),
132-
value(Key.TUPLE), value(defTuple),
133-
value(Key.UPSERT_OPS), value(operations)
134-
)
135-
);
106+
Operation[] ops = Arrays.stream(operations)
107+
.map(Operation::fromArray)
108+
.toArray(Operation[]::new);
109+
return execute(upsertRequest(space, key, defTuple, ops));
136110
}
137111

138112
@Override
139113
public Result upsert(String space, List<?> key, List<?> defTuple, Object... operations) {
140-
return exec(
141-
new TarantoolRequest(
142-
Code.UPSERT,
143-
value(Key.SPACE), cacheLookupValue(() -> getSchemaMeta().getSpace(space).getId()),
144-
value(Key.KEY), value(key),
145-
value(Key.TUPLE), value(defTuple),
146-
value(Key.UPSERT_OPS), value(operations)
147-
)
148-
);
114+
Operation[] ops = Arrays.stream(operations)
115+
.map(Operation::fromArray)
116+
.toArray(Operation[]::new);
117+
return execute(upsertRequest(space, key, defTuple, ops));
149118
}
150119

151120
@Override
152121
public Result delete(Integer space, List<?> key) {
153-
return exec(
154-
new TarantoolRequest(
155-
Code.DELETE,
156-
value(Key.SPACE), value(space),
157-
value(Key.KEY), value(key)
158-
)
159-
);
122+
return execute(deleteRequest(space, key));
160123
}
161124

162125
@Override
163126
public Result delete(String space, List<?> key) {
164-
return exec(
165-
new TarantoolRequest(
166-
Code.DELETE,
167-
value(Key.SPACE), cacheLookupValue(() -> getSchemaMeta().getSpace(space).getId()),
168-
value(Key.KEY), value(key)
169-
)
170-
);
127+
return execute(deleteRequest(space, key));
171128
}
172129

173130
@Override
174131
public Result call(String function, Object... args) {
175-
return exec(
176-
new TarantoolRequest(
177-
callCode,
178-
value(Key.FUNCTION), value(function),
179-
value(Key.TUPLE), value(args)
180-
)
132+
return execute(
133+
callRequest(function)
134+
.arguments(args)
135+
.useCall16(callCode == Code.OLD_CALL)
181136
);
182137
}
183138

184139
@Override
185140
public Result eval(String expression, Object... args) {
186-
return exec(
187-
new TarantoolRequest(
188-
Code.EVAL,
189-
value(Key.EXPRESSION), value(expression),
190-
value(Key.TUPLE), value(args)
191-
)
192-
);
141+
return execute(evalRequest(expression).arguments(args));
193142
}
194143

195144
@Override
196145
public void ping() {
197-
exec(new TarantoolRequest(Code.PING));
146+
execute(pingRequest());
147+
}
148+
149+
@Override
150+
public Result execute(TarantoolRequestConvertible requestSpec) {
151+
return exec(requestSpec.toTarantoolRequest(getSchemaMeta()));
198152
}
199153

200154
public void setCallCode(Code callCode) {
201155
this.callCode = callCode;
202156
}
203157

204-
}
158+
}

src/main/java/org/tarantool/TarantoolClientOps.java

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.tarantool;
22

3+
import org.tarantool.dsl.TarantoolRequestConvertible;
4+
35
public interface TarantoolClientOps<O, P, R> {
46
R select(Integer space, Integer index, O key, int offset, int limit, int iterator);
57

@@ -33,7 +35,10 @@ public interface TarantoolClientOps<O, P, R> {
3335

3436
R eval(String expression, Object... args);
3537

38+
R execute(TarantoolRequestConvertible requestSpec);
39+
3640
void ping();
3741

3842
void close();
43+
3944
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.tarantool.dsl;
2+
3+
import org.tarantool.Code;
4+
import org.tarantool.TarantoolRequest;
5+
import org.tarantool.schema.TarantoolSchemaMeta;
6+
7+
import java.time.Duration;
8+
9+
public abstract class AbstractRequestSpec<B extends AbstractRequestSpec<B>>
10+
implements TarantoolRequestConvertible {
11+
12+
final Code code;
13+
Duration duration = Duration.ZERO;
14+
boolean useDefaultTimeout = true;
15+
16+
AbstractRequestSpec(Code code) {
17+
this.code = code;
18+
}
19+
20+
AbstractRequestSpec(Code code, Duration duration) {
21+
this.code = code;
22+
this.duration = duration;
23+
}
24+
25+
@SuppressWarnings("unchecked")
26+
public B timeout(Duration duration) {
27+
this.duration = duration;
28+
this.useDefaultTimeout = false;
29+
return (B) this;
30+
}
31+
32+
@SuppressWarnings("unchecked")
33+
public B useDefaultTimeout() {
34+
this.duration = Duration.ZERO;
35+
this.useDefaultTimeout = true;
36+
return (B) this;
37+
}
38+
39+
@Override
40+
public TarantoolRequest toTarantoolRequest(TarantoolSchemaMeta schemaMeta) {
41+
TarantoolRequest request = new TarantoolRequest(code);
42+
request.setTimeout(useDefaultTimeout ? null : duration);
43+
return request;
44+
}
45+
46+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package org.tarantool.dsl;
2+
3+
import static org.tarantool.RequestArguments.value;
4+
5+
import org.tarantool.Code;
6+
import org.tarantool.Key;
7+
import org.tarantool.TarantoolRequest;
8+
import org.tarantool.schema.TarantoolSchemaMeta;
9+
10+
import java.util.ArrayList;
11+
import java.util.Collection;
12+
import java.util.Collections;
13+
import java.util.List;
14+
import java.util.Objects;
15+
16+
public class CallRequestSpec extends AbstractRequestSpec<CallRequestSpec> {
17+
18+
private String functionName;
19+
private List<Object> arguments = new ArrayList<>();
20+
private boolean useCall16 = false;
21+
22+
CallRequestSpec(String functionName) {
23+
super(Code.CALL);
24+
this.functionName = Objects.requireNonNull(functionName);
25+
}
26+
27+
public CallRequestSpec function(String functionName) {
28+
Objects.requireNonNull(functionName);
29+
this.functionName = functionName;
30+
return this;
31+
}
32+
33+
public CallRequestSpec arguments(Object... arguments) {
34+
this.arguments.clear();
35+
Collections.addAll(this.arguments, arguments);
36+
return this;
37+
}
38+
39+
public CallRequestSpec arguments(Collection<?> arguments) {
40+
this.arguments.clear();
41+
this.arguments.addAll(arguments);
42+
return this;
43+
}
44+
45+
public CallRequestSpec useCall16(boolean flag) {
46+
this.useCall16 = flag;
47+
return this;
48+
}
49+
50+
@Override
51+
public TarantoolRequest toTarantoolRequest(TarantoolSchemaMeta schemaMeta) {
52+
TarantoolRequest request = super.toTarantoolRequest(schemaMeta);
53+
if (useCall16) {
54+
request.setCode(Code.OLD_CALL);
55+
}
56+
request.addArguments(
57+
value(Key.FUNCTION), value(functionName),
58+
value(Key.TUPLE), value(arguments)
59+
);
60+
return request;
61+
}
62+
63+
}

0 commit comments

Comments
 (0)