Skip to content

Commit c06f6a9

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>. Closes: #212
1 parent 567851c commit c06f6a9

19 files changed

+1096
-114
lines changed

src/main/java/org/tarantool/AbstractTarantoolOps.java

Lines changed: 78 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -1,200 +1,164 @@
11
package org.tarantool;
22

3-
import static org.tarantool.TarantoolRequestArgumentFactory.cacheLookupValue;
4-
import static org.tarantool.TarantoolRequestArgumentFactory.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;
15+
import org.tarantool.logging.Logger;
16+
import org.tarantool.logging.LoggerFactory;
617
import org.tarantool.schema.TarantoolSchemaMeta;
718

19+
import java.util.Arrays;
820
import java.util.List;
921

1022
public abstract class AbstractTarantoolOps<Result>
1123
implements TarantoolClientOps<List<?>, Object, Result> {
1224

25+
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractTarantoolOps.class);
26+
1327
private Code callCode = Code.CALL;
1428

1529
protected abstract Result exec(TarantoolRequest request);
1630

1731
protected abstract TarantoolSchemaMeta getSchemaMeta();
1832

1933
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());
34+
return execute(
35+
selectRequest(space, index)
36+
.key(key)
37+
.offset(offset).limit(limit)
38+
.iterator(iterator)
39+
);
2140
}
2241

2342
@Override
2443
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());
44+
return execute(
45+
selectRequest(space, index)
46+
.key(key)
47+
.offset(offset).limit(limit)
48+
.iterator(iterator)
49+
);
2650
}
2751

2852
@Override
2953
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-
)
54+
return execute(
55+
selectRequest(space, index)
56+
.key(key)
57+
.offset(offset).limit(limit)
58+
.iterator(iterator)
4059
);
4160
}
4261

4362
@Override
4463
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-
)
64+
return execute(
65+
selectRequest(space, index)
66+
.key(key)
67+
.offset(offset).limit(limit)
68+
.iterator(iterator)
5569
);
5670
}
5771

5872
@Override
5973
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-
);
74+
return execute(insertRequest(space, tuple));
6675
}
6776

6877
@Override
6978
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-
);
79+
return execute(insertRequest(space, tuple));
7780
}
7881

7982
@Override
8083
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-
);
84+
return execute(replaceRequest(space, tuple));
8885
}
8986

9087
@Override
9188
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-
);
89+
return execute(replaceRequest(space, tuple));
9990
}
10091

10192
@Override
10293
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-
);
94+
Operation[] ops = Arrays.stream(operations)
95+
.map(Operation::fromArray)
96+
.toArray(org.tarantool.dsl.Operation[]::new);
97+
return execute(updateRequest(space, key, ops));
11198
}
11299

113100
@Override
114101
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-
);
102+
Operation[] ops = Arrays.stream(operations)
103+
.map(Operation::fromArray)
104+
.toArray(org.tarantool.dsl.Operation[]::new);
105+
return execute(updateRequest(space, key, ops));
123106
}
124107

125108
@Override
126109
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-
);
110+
Operation[] ops = Arrays.stream(operations)
111+
.map(Operation::fromArray)
112+
.toArray(Operation[]::new);
113+
return execute(upsertRequest(space, key, defTuple, ops));
136114
}
137115

138116
@Override
139117
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-
);
118+
Operation[] ops = Arrays.stream(operations)
119+
.map(Operation::fromArray)
120+
.toArray(Operation[]::new);
121+
return execute(upsertRequest(space, key, defTuple, ops));
149122
}
150123

151124
@Override
152125
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-
);
126+
return execute(deleteRequest(space, key));
160127
}
161128

162129
@Override
163130
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-
);
131+
return execute(deleteRequest(space, key));
171132
}
172133

173134
@Override
174135
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-
)
136+
return execute(
137+
callRequest(function)
138+
.arguments(args)
139+
.useCall16(callCode == Code.OLD_CALL)
181140
);
182141
}
183142

184143
@Override
185144
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-
);
145+
return execute(evalRequest(expression).arguments(args));
193146
}
194147

195148
@Override
196149
public void ping() {
197-
exec(new TarantoolRequest(Code.PING));
150+
execute(pingRequest());
151+
}
152+
153+
@Override
154+
public Result execute(TarantoolRequestConvertible requestSpec) {
155+
TarantoolSchemaMeta schemaMeta = null;
156+
try {
157+
schemaMeta = getSchemaMeta();
158+
} catch (Exception cause) {
159+
LOGGER.warn(() -> "Could not get Tarantool schema meta-info", cause);
160+
}
161+
return exec(requestSpec.toTarantoolRequest(schemaMeta));
198162
}
199163

200164
public void setCallCode(Code callCode) {

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

Lines changed: 5 additions & 0 deletions
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
}
Lines changed: 46 additions & 0 deletions
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+
}

0 commit comments

Comments
 (0)