Skip to content

Commit f760fb5

Browse files
Fix consistent query interface which caused overloading ambiguity with variable argument (#644)
1 parent c9ec678 commit f760fb5

File tree

4 files changed

+135
-24
lines changed

4 files changed

+135
-24
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
/*
2+
* Copyright 2012-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Modifications copyright (C) 2017 Uber Technologies, Inc.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License"). You may not
7+
* use this file except in compliance with the License. A copy of the License is
8+
* located at
9+
*
10+
* http://aws.amazon.com/apache2.0
11+
*
12+
* or in the "license" file accompanying this file. This file is distributed on
13+
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
14+
* express or implied. See the License for the specific language governing
15+
* permissions and limitations under the License.
16+
*/
17+
18+
package com.uber.cadence.client;
19+
20+
import com.uber.cadence.QueryConsistencyLevel;
21+
import com.uber.cadence.QueryRejectCondition;
22+
import java.util.Objects;
23+
24+
public final class QueryOptions {
25+
26+
public static final class Builder {
27+
28+
private QueryRejectCondition queryRejectCondition = null; // default to empty condition
29+
private QueryConsistencyLevel queryConsistencyLevel =
30+
QueryConsistencyLevel.EVENTUAL; // default to eventual consistent query
31+
32+
public Builder() {}
33+
34+
public Builder(QueryOptions o) {
35+
if (o == null) {
36+
return;
37+
}
38+
this.queryConsistencyLevel = o.queryConsistencyLevel;
39+
this.queryRejectCondition = o.queryRejectCondition;
40+
}
41+
42+
/** queryRejectCondition to decide condition to reject the query */
43+
public Builder setQueryRejectCondition(QueryRejectCondition queryRejectCondition) {
44+
this.queryRejectCondition = queryRejectCondition;
45+
return this;
46+
}
47+
48+
public Builder setQueryConsistencyLevel(QueryConsistencyLevel queryConsistencyLevel) {
49+
this.queryConsistencyLevel = queryConsistencyLevel;
50+
return this;
51+
}
52+
53+
public QueryOptions build() {
54+
return new QueryOptions(queryRejectCondition, queryConsistencyLevel);
55+
}
56+
}
57+
58+
private QueryRejectCondition queryRejectCondition;
59+
private QueryConsistencyLevel queryConsistencyLevel;
60+
61+
private QueryOptions(
62+
QueryRejectCondition queryRejectCondition, QueryConsistencyLevel queryConsistencyLevel) {
63+
this.queryConsistencyLevel = queryConsistencyLevel;
64+
this.queryRejectCondition = queryRejectCondition;
65+
}
66+
67+
public QueryRejectCondition getQueryRejectCondition() {
68+
return queryRejectCondition;
69+
}
70+
71+
public QueryConsistencyLevel getQueryConsistencyLevel() {
72+
return queryConsistencyLevel;
73+
}
74+
75+
@Override
76+
public boolean equals(Object o) {
77+
if (this == o) return true;
78+
if (o == null || getClass() != o.getClass()) return false;
79+
QueryOptions that = (QueryOptions) o;
80+
return Objects.equals(queryRejectCondition, that.queryRejectCondition)
81+
&& queryConsistencyLevel == that.queryConsistencyLevel;
82+
}
83+
84+
@Override
85+
public int hashCode() {
86+
return Objects.hash(queryRejectCondition, queryConsistencyLevel);
87+
}
88+
89+
@Override
90+
public String toString() {
91+
return "QueryOptions{"
92+
+ "queryRejectCondition='"
93+
+ queryRejectCondition
94+
+ '\''
95+
+ ", queryConsistencyLevel="
96+
+ queryConsistencyLevel
97+
+ '}';
98+
}
99+
}

src/main/java/com/uber/cadence/client/WorkflowStub.java

+15-5
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
package com.uber.cadence.client;
1919

20-
import com.uber.cadence.QueryConsistencyLevel;
2120
import com.uber.cadence.QueryRejectCondition;
2221
import com.uber.cadence.WorkflowExecution;
2322
import java.lang.reflect.InvocationHandler;
@@ -156,27 +155,38 @@ <R> CompletableFuture<R> getResultAsync(
156155
*/
157156
<R> R query(String queryType, Class<R> resultClass, Object... args);
158157

158+
/**
159+
* Deprecated: please use {@link #queryWithOptions(String, QueryOptions, Type, Class, Object...)}
160+
* to avoid variable argument ambiguity with Object... args
161+
*/
159162
<R> R query(String queryType, Class<R> resultClass, Type resultType, Object... args);
160163

164+
/**
165+
* Deprecated: please use {@link #queryWithOptions(String, QueryOptions, Type, Class, Object...)}
166+
* to avoid variable argument ambiguity with Object... args
167+
*/
161168
<R> R query(
162169
String queryType,
163170
Class<R> resultClass,
164171
QueryRejectCondition queryRejectCondition,
165172
Object... args);
166173

174+
/**
175+
* Deprecated: please use {@link #queryWithOptions(String, QueryOptions, Type, Class, Object...)}
176+
* to avoid variable argument ambiguity with Object... args
177+
*/
167178
<R> R query(
168179
String queryType,
169180
Class<R> resultClass,
170181
Type resultType,
171182
QueryRejectCondition queryRejectCondition,
172183
Object... args);
173184

174-
<R> R query(
185+
<R> R queryWithOptions(
175186
String queryType,
176-
Class<R> resultClass,
187+
QueryOptions options,
177188
Type resultType,
178-
QueryRejectCondition queryRejectCondition,
179-
QueryConsistencyLevel queryConsistencyLevel,
189+
Class<R> resultClass,
180190
Object... args);
181191

182192
/** Request cancellation. */

src/main/java/com/uber/cadence/internal/sync/TestWorkflowEnvironmentInternal.java

+5-7
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454
import com.uber.cadence.PollForActivityTaskResponse;
5555
import com.uber.cadence.PollForDecisionTaskRequest;
5656
import com.uber.cadence.PollForDecisionTaskResponse;
57-
import com.uber.cadence.QueryConsistencyLevel;
5857
import com.uber.cadence.QueryFailedError;
5958
import com.uber.cadence.QueryRejectCondition;
6059
import com.uber.cadence.QueryWorkflowRequest;
@@ -90,6 +89,7 @@
9089
import com.uber.cadence.WorkflowExecutionAlreadyCompletedError;
9190
import com.uber.cadence.WorkflowExecutionAlreadyStartedError;
9291
import com.uber.cadence.client.ActivityCompletionClient;
92+
import com.uber.cadence.client.QueryOptions;
9393
import com.uber.cadence.client.WorkflowClient;
9494
import com.uber.cadence.client.WorkflowClientInterceptor;
9595
import com.uber.cadence.client.WorkflowClientOptions;
@@ -1010,15 +1010,13 @@ public <R> R query(
10101010
}
10111011

10121012
@Override
1013-
public <R> R query(
1013+
public <R> R queryWithOptions(
10141014
String queryType,
1015-
Class<R> resultClass,
1015+
QueryOptions options,
10161016
Type resultType,
1017-
QueryRejectCondition queryRejectCondition,
1018-
QueryConsistencyLevel queryConsistencyLevel,
1017+
Class<R> resultClass,
10191018
Object... args) {
1020-
return next.query(
1021-
queryType, resultClass, resultType, queryRejectCondition, queryConsistencyLevel, args);
1019+
return next.queryWithOptions(queryType, options, resultType, resultClass, args);
10221020
}
10231021

10241022
@Override

src/main/java/com/uber/cadence/internal/sync/WorkflowStubImpl.java

+16-12
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,8 @@ private <R> R mapToWorkflowFailureException(
407407

408408
@Override
409409
public <R> R query(String queryType, Class<R> resultClass, Object... args) {
410-
return query(queryType, resultClass, resultClass, args);
410+
return queryWithOptions(
411+
queryType, new QueryOptions.Builder().build(), resultClass, resultClass, args);
411412
}
412413

413414
@Override
@@ -431,30 +432,31 @@ public <R> R query(
431432
Type resultType,
432433
QueryRejectCondition queryRejectCondition,
433434
Object... args) {
434-
return query(
435+
return queryWithOptions(
435436
queryType,
436-
resultClass,
437+
new QueryOptions.Builder()
438+
.setQueryRejectCondition(queryRejectCondition)
439+
.setQueryConsistencyLevel(QueryConsistencyLevel.EVENTUAL)
440+
.build(),
437441
resultType,
438-
queryRejectCondition,
439-
QueryConsistencyLevel.EVENTUAL,
442+
resultClass,
440443
args);
441444
}
442445

443446
@Override
444-
public <R> R query(
447+
public <R> R queryWithOptions(
445448
String queryType,
446-
Class<R> resultClass,
449+
QueryOptions options,
447450
Type resultType,
448-
QueryRejectCondition queryRejectCondition,
449-
QueryConsistencyLevel queryConsistencyLevel,
451+
Class<R> resultClass,
450452
Object... args) {
451453
checkStarted();
452454
QueryWorkflowParameters p = new QueryWorkflowParameters();
453455
p.setInput(dataConverter.toData(args));
454456
p.setQueryType(queryType);
455457
p.setWorkflowId(execution.get().getWorkflowId());
456-
p.setQueryRejectCondition(queryRejectCondition);
457-
p.setQueryConsistencyLevel(queryConsistencyLevel);
458+
p.setQueryRejectCondition(options.getQueryRejectCondition());
459+
p.setQueryConsistencyLevel(options.getQueryConsistencyLevel());
458460

459461
QueryWorkflowResponse result;
460462
try {
@@ -477,7 +479,9 @@ public <R> R query(
477479
return dataConverter.fromData(result.getQueryResult(), resultClass, resultType);
478480
} else {
479481
throw new WorkflowQueryRejectedException(
480-
execution.get(), queryRejectCondition, result.getQueryRejected().getCloseStatus());
482+
execution.get(),
483+
options.getQueryRejectCondition(),
484+
result.getQueryRejected().getCloseStatus());
481485
}
482486
}
483487

0 commit comments

Comments
 (0)