Skip to content

Commit 4809da1

Browse files
author
Burak Serdar
committed
Merge remote-tracking branch 'upstream/master' into 686
2 parents c85ee35 + 823e5b8 commit 4809da1

File tree

18 files changed

+243
-52
lines changed

18 files changed

+243
-52
lines changed

config/src/main/java/com/redhat/lightblue/config/ControllerConfiguration.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public class ControllerConfiguration implements JsonInitializable, Serializable
4141
private String backend;
4242
private Class<? extends ControllerFactory> controllerFactory;
4343
private ObjectNode extensions;
44+
private ObjectNode options;
4445

4546
public ControllerConfiguration() {
4647
}
@@ -49,6 +50,7 @@ public ControllerConfiguration(ControllerConfiguration c) {
4950
backend = c.backend;
5051
controllerFactory = c.controllerFactory;
5152
extensions = c.extensions;
53+
options=c.options;
5254
}
5355

5456
/**
@@ -93,6 +95,20 @@ public void setExtensions(ObjectNode node) {
9395
extensions = node;
9496
}
9597

98+
/**
99+
* The options for the controller
100+
*/
101+
public ObjectNode getOptions() {
102+
return options;
103+
}
104+
105+
/**
106+
* The options for the controller
107+
*/
108+
public void setOptions(ObjectNode node) {
109+
options = node;
110+
}
111+
96112
@SuppressWarnings("unchecked")
97113
@Override
98114
public void initializeFromJson(JsonNode node) {
@@ -108,7 +124,8 @@ public void initializeFromJson(JsonNode node) {
108124
x.asText());
109125
}
110126
extensions = (ObjectNode) node.get("extensions");
111-
LOGGER.debug("Initialized: source={} backend={} controllerFactory={} extensions={}", node, backend, controllerFactory, extensions);
127+
options = (ObjectNode) node.get("options");
128+
LOGGER.debug("Initialized: source={} backend={} controllerFactory={} extensions={} options={}", node, backend, controllerFactory, extensions,options);
112129
}
113130
} catch (Exception e) {
114131
throw new RuntimeException(e);

crud/src/main/java/com/redhat/lightblue/eval/FieldComparisonEvaluator.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,14 +127,16 @@ public boolean evaluate(QueryEvaluationContext ctx) {
127127
}
128128
}
129129
LOGGER.debug(" lvalue={} rvalue={}", lvalueNode, rvalueNode);
130-
if (ldocValue != null && rdocValue != null) {
131-
// Both fields are values
130+
// Treat null (both value and list are null) as a value
131+
boolean leftIsValue = ldocValue != null || ldocList == null;
132+
boolean rightIsValue = rdocValue != null || rdocList == null;
133+
if (leftIsValue && rightIsValue) {
132134
int result = fieldMd.getType().compare(ldocValue, rdocValue);
133135
LOGGER.debug(" result={}", result);
134136
if (operator.apply(result)) {
135137
ctx.setResult(true);
136138
}
137-
} else if (ldocList != null && rdocList != null) {
139+
} else if (!leftIsValue && !rightIsValue) {
138140
// Both fields are arrays. Compare each element
139141
Type type = ((ArrayField) fieldMd).getElement().getType();
140142
int ln = ldocList.size();
@@ -151,15 +153,15 @@ public boolean evaluate(QueryEvaluationContext ctx) {
151153
if (cmpOp(CMP_LOOKUP[cmp], operator)) {
152154
ctx.setResult(true);
153155
}
154-
} else if (ldocList != null && rdocValue != null) {
156+
} else if (!leftIsValue) {
155157
// Left field is an array, right field is a value
156158
BinaryComparisonOperator resultOp = lvCompare(rdocValue, ldocList,
157159
((ArrayField) fieldMd).getElement().getType()).invert();
158160
LOGGER.debug("Comparing array with field {} {} {}={}", ldocList, operator, rdocValue, resultOp);
159161
if (cmpOp(resultOp, operator)) {
160162
ctx.setResult(true);
161163
}
162-
} else if (ldocValue != null && rdocList != null) {
164+
} else {
163165
// left field is a value, right field is an array
164166
BinaryComparisonOperator resultOp = lvCompare(ldocValue, rdocList, fieldMd.getType());
165167
LOGGER.debug("Comparing field with array {} {} {}={}", ldocValue, operator, rdocList, resultOp);

crud/src/test/java/com/redhat/lightblue/eval/ArrayContainsEvaluatorTest.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public void contains_any_returns_true_when_any_expression_value_in_array() throw
7070

7171
@Test
7272
public void contains_all_returns_true_when_all_expression_values_in_array() throws Exception {
73-
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf5', 'contains':'$all', 'values':[5,10,15,20]}");
73+
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf5', 'contains':'$all', 'values':[5,null,15,20]}");
7474
QueryEvaluator eval = QueryEvaluator.getInstance(expr, md);
7575

7676
QueryEvaluationContext context = eval.evaluate(jsonDoc);
@@ -80,7 +80,7 @@ public void contains_all_returns_true_when_all_expression_values_in_array() thro
8080

8181
@Test
8282
public void contains_all_returns_false_when_all_expression_values_not_in_array() throws Exception {
83-
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf5', 'contains':'$all', 'values':[5,10,15,25]}");
83+
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf5', 'contains':'$all', 'values':[5,null,15,25]}");
8484
QueryEvaluator eval = QueryEvaluator.getInstance(expr, md);
8585

8686
QueryEvaluationContext context = eval.evaluate(jsonDoc);
@@ -90,7 +90,7 @@ public void contains_all_returns_false_when_all_expression_values_not_in_array()
9090

9191
@Test
9292
public void contains_none_returns_false_when_expression_values_in_array() throws Exception {
93-
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf5', 'contains':'$none', 'values':[5,10,15,25]}");
93+
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf5', 'contains':'$none', 'values':[5,null,15,25]}");
9494
QueryEvaluator eval = QueryEvaluator.getInstance(expr, md);
9595

9696
QueryEvaluationContext context = eval.evaluate(jsonDoc);
@@ -130,7 +130,7 @@ public void contains_none_returns_true_when_expression_values_not_in_array() thr
130130

131131
@Test
132132
public void one_$parent_contains_all_returns_true_when_all_expression_values_in_array() throws Exception {
133-
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf4.$parent.nf5', 'contains':'$all', 'values':[5,10,15,20]}");
133+
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf4.$parent.nf5', 'contains':'$all', 'values':[5,null,15,20]}");
134134
QueryEvaluator eval = QueryEvaluator.getInstance(expr, md);
135135

136136
QueryEvaluationContext context = eval.evaluate(jsonDoc);
@@ -140,7 +140,7 @@ public void contains_none_returns_true_when_expression_values_not_in_array() thr
140140

141141
@Test
142142
public void one_$parent_contains_all_returns_false_when_all_expression_values_not_in_array() throws Exception {
143-
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf4.$parent.nf5', 'contains':'$all', 'values':[5,10,15,25]}");
143+
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf4.$parent.nf5', 'contains':'$all', 'values':[5,null,15,25]}");
144144
QueryEvaluator eval = QueryEvaluator.getInstance(expr, md);
145145

146146
QueryEvaluationContext context = eval.evaluate(jsonDoc);
@@ -150,7 +150,7 @@ public void contains_none_returns_true_when_expression_values_not_in_array() thr
150150

151151
@Test
152152
public void one_$parent_contains_none_returns_false_when_expression_values_in_array() throws Exception {
153-
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf4.$parent.nf5', 'contains':'$none', 'values':[5,10,15,25]}");
153+
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf4.$parent.nf5', 'contains':'$none', 'values':[5,null,15,25]}");
154154
QueryEvaluator eval = QueryEvaluator.getInstance(expr, md);
155155

156156
QueryEvaluationContext context = eval.evaluate(jsonDoc);
@@ -190,7 +190,7 @@ public void contains_none_returns_true_when_expression_values_not_in_array() thr
190190

191191
@Test
192192
public void two_$parent_contains_all_returns_true_when_all_expression_values_in_array() throws Exception {
193-
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf7.nnf1.$parent.$parent.nf5', 'contains':'$all', 'values':[5,10,15,20]}");
193+
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf7.nnf1.$parent.$parent.nf5', 'contains':'$all', 'values':[5,null,15,20]}");
194194
QueryEvaluator eval = QueryEvaluator.getInstance(expr, md);
195195

196196
QueryEvaluationContext context = eval.evaluate(jsonDoc);
@@ -200,7 +200,7 @@ public void contains_none_returns_true_when_expression_values_not_in_array() thr
200200

201201
@Test
202202
public void two_$parent_contains_all_returns_false_when_all_expression_values_not_in_array() throws Exception {
203-
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf7.nnf1.$parent.$parent.nf5', 'contains':'$all', 'values':[5,10,15,25]}");
203+
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf7.nnf1.$parent.$parent.nf5', 'contains':'$all', 'values':[5,null,15,25]}");
204204
QueryEvaluator eval = QueryEvaluator.getInstance(expr, md);
205205

206206
QueryEvaluationContext context = eval.evaluate(jsonDoc);
@@ -210,7 +210,7 @@ public void contains_none_returns_true_when_expression_values_not_in_array() thr
210210

211211
@Test
212212
public void two_$parent_contains_none_returns_false_when_expression_values_in_array() throws Exception {
213-
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf7.nnf1.$parent.$parent.nf5', 'contains':'$none', 'values':[5,10,15,25]}");
213+
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.nf7.nnf1.$parent.$parent.nf5', 'contains':'$none', 'values':[5,null,15,25]}");
214214
QueryEvaluator eval = QueryEvaluator.getInstance(expr, md);
215215

216216
QueryEvaluationContext context = eval.evaluate(jsonDoc);
@@ -250,7 +250,7 @@ public void contains_none_returns_true_when_expression_values_not_in_array() thr
250250

251251
@Test
252252
public void one_$this_contains_all_returns_true_when_all_expression_values_in_array() throws Exception {
253-
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.$this.nf5', 'contains':'$all', 'values':[5,10,15,20]}");
253+
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.$this.nf5', 'contains':'$all', 'values':[5,null,15,20]}");
254254
QueryEvaluator eval = QueryEvaluator.getInstance(expr, md);
255255

256256
QueryEvaluationContext context = eval.evaluate(jsonDoc);
@@ -260,7 +260,7 @@ public void contains_none_returns_true_when_expression_values_not_in_array() thr
260260

261261
@Test
262262
public void one_$this_contains_all_returns_false_when_all_expression_values_not_in_array() throws Exception {
263-
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.$this.nf5', 'contains':'$all', 'values':[5,10,15,25]}");
263+
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.$this.nf5', 'contains':'$all', 'values':[5,null,15,25]}");
264264
QueryEvaluator eval = QueryEvaluator.getInstance(expr, md);
265265

266266
QueryEvaluationContext context = eval.evaluate(jsonDoc);
@@ -270,7 +270,7 @@ public void contains_none_returns_true_when_expression_values_not_in_array() thr
270270

271271
@Test
272272
public void one_$this_contains_none_returns_false_when_expression_values_in_array() throws Exception {
273-
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.$this.nf5', 'contains':'$none', 'values':[5,10,15,25]}");
273+
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.$this.nf5', 'contains':'$none', 'values':[5,null,15,25]}");
274274
QueryEvaluator eval = QueryEvaluator.getInstance(expr, md);
275275

276276
QueryEvaluationContext context = eval.evaluate(jsonDoc);
@@ -310,7 +310,7 @@ public void contains_none_returns_true_when_expression_values_not_in_array() thr
310310

311311
@Test
312312
public void two_$this_contains_all_returns_true_when_all_expression_values_in_array() throws Exception {
313-
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.$this.$this.nf5', 'contains':'$all', 'values':[5,10,15,20]}");
313+
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.$this.$this.nf5', 'contains':'$all', 'values':[5,null,15,20]}");
314314
QueryEvaluator eval = QueryEvaluator.getInstance(expr, md);
315315

316316
QueryEvaluationContext context = eval.evaluate(jsonDoc);
@@ -320,7 +320,7 @@ public void contains_none_returns_true_when_expression_values_not_in_array() thr
320320

321321
@Test
322322
public void two_$this_contains_all_returns_false_when_all_expression_values_not_in_array() throws Exception {
323-
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.$this.$this.nf5', 'contains':'$all', 'values':[5,10,15,25]}");
323+
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.$this.$this.nf5', 'contains':'$all', 'values':[5,null,15,25]}");
324324
QueryEvaluator eval = QueryEvaluator.getInstance(expr, md);
325325

326326
QueryEvaluationContext context = eval.evaluate(jsonDoc);
@@ -330,7 +330,7 @@ public void contains_none_returns_true_when_expression_values_not_in_array() thr
330330

331331
@Test
332332
public void two_$this_contains_none_returns_false_when_expression_values_in_array() throws Exception {
333-
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.$this.$this.nf5', 'contains':'$none', 'values':[5,10,15,25]}");
333+
QueryExpression expr = EvalTestContext.queryExpressionFromJson("{'array':'field6.$this.$this.nf5', 'contains':'$none', 'values':[5,null,15,25]}");
334334
QueryEvaluator eval = QueryEvaluator.getInstance(expr, md);
335335

336336
QueryEvaluationContext context = eval.evaluate(jsonDoc);

crud/src/test/java/com/redhat/lightblue/eval/FieldComparisonEvaluatorTest.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,9 @@ public void cant_compare_object_arrays() throws Exception {
170170
}
171171

172172
@Test
173-
public void nf3_less_than_nf5() throws Exception {
173+
public void nf3_less_than_nf9() throws Exception {
174174
QueryEvaluationContext ctx = QueryEvaluator.
175-
getInstance(EvalTestContext.queryExpressionFromJson("{'field':'field6.nf3','op':'<','rfield':'field6.nf5'}"), md).
175+
getInstance(EvalTestContext.queryExpressionFromJson("{'field':'field6.nf3','op':'<','rfield':'field6.nf9'}"), md).
176176
evaluate(jsonDoc);
177177
Assert.assertTrue(ctx.getResult());
178178
}
@@ -233,4 +233,12 @@ public void nf5_e_nf5() throws Exception {
233233
Assert.assertFalse(ctx.getResult());
234234
}
235235

236+
@Test
237+
public void nf3_greater_than_nf11() throws Exception {
238+
QueryEvaluationContext ctx = QueryEvaluator.
239+
getInstance(EvalTestContext.queryExpressionFromJson("{'field':'field6.nf3','op':'>','rfield':'field6.nf11'}"), md).
240+
evaluate(jsonDoc);
241+
Assert.assertTrue(ctx.getResult());
242+
}
243+
236244
}

crud/src/test/java/com/redhat/lightblue/eval/FieldProjectorTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public void project_field_with_recursion() throws Exception {
5555
Projection p = EvalTestContext.projectionFromJson("[{'field':'field2'},{'field':'field6.*','recursive':true}]");
5656
Projector projector = Projector.getInstance(p, md);
5757

58-
JsonNode expectedNode = JsonUtils.json("{'field2':'value2','field6':{'nf1':'nvalue1','nf2':'nvalue2','nf3':4,'nf4':false,'nf5':[5,10,15,20],'nf6':['one','two','three','four'],'nf7':{'nnf1':'nnvalue1','nnf2':2},'nf8':['four','three','two','one'],'nf9':[20,15,10,5],'nf10':[20.1,15.2,10.3,5.4],'nf11':null}}".replace('\'', '\"'));
58+
JsonNode expectedNode = JsonUtils.json("{'field2':'value2','field6':{'nf1':'nvalue1','nf2':'nvalue2','nf3':4,'nf4':false,'nf5':[5,null,15,20],'nf6':['one','two','three','four'],'nf7':{'nnf1':'nnvalue1','nnf2':2},'nf8':['four','three','two','one'],'nf9':[20,15,10,5],'nf10':[20.1,15.2,10.3,5.4],'nf11':null}}".replace('\'', '\"'));
5959

6060
JsonDoc pdoc = projector.project(jsonDoc, JSON_NODE_FACTORY);
6161

@@ -78,7 +78,7 @@ public void project_field_with_recursion() throws Exception {
7878
Projection p = EvalTestContext.projectionFromJson("[{'field':'field7.$parent.field2'},{'field':'field7.$parent.field6.*','recursive':true}]");
7979
Projector projector = Projector.getInstance(p, md);
8080

81-
JsonNode expectedNode = JsonUtils.json("{'field2':'value2','field6':{'nf1':'nvalue1','nf2':'nvalue2','nf3':4,'nf4':false,'nf5':[5,10,15,20],'nf6':['one','two','three','four'],'nf7':{'nnf1':'nnvalue1','nnf2':2},'nf8':['four','three','two','one'],'nf9':[20,15,10,5],'nf10':[20.1,15.2,10.3,5.4],'nf11':null}}".replace('\'', '\"'));
81+
JsonNode expectedNode = JsonUtils.json("{'field2':'value2','field6':{'nf1':'nvalue1','nf2':'nvalue2','nf3':4,'nf4':false,'nf5':[5,null,15,20],'nf6':['one','two','three','four'],'nf7':{'nnf1':'nnvalue1','nnf2':2},'nf8':['four','three','two','one'],'nf9':[20,15,10,5],'nf10':[20.1,15.2,10.3,5.4],'nf11':null}}".replace('\'', '\"'));
8282

8383
JsonDoc pdoc = projector.project(jsonDoc, JSON_NODE_FACTORY);
8484

@@ -101,7 +101,7 @@ public void project_field_with_recursion() throws Exception {
101101
Projection p = EvalTestContext.projectionFromJson("[{'field':'field6.nf7.$parent.$parent.field2'},{'field':'field6.nf7.$parent.$parent.field6.*','recursive':true}]");
102102
Projector projector = Projector.getInstance(p, md);
103103

104-
JsonNode expectedNode = JsonUtils.json("{'field2':'value2','field6':{'nf1':'nvalue1','nf2':'nvalue2','nf3':4,'nf4':false,'nf5':[5,10,15,20],'nf6':['one','two','three','four'],'nf7':{'nnf1':'nnvalue1','nnf2':2},'nf8':['four','three','two','one'],'nf9':[20,15,10,5],'nf10':[20.1,15.2,10.3,5.4],'nf11':null}}".replace('\'', '\"'));
104+
JsonNode expectedNode = JsonUtils.json("{'field2':'value2','field6':{'nf1':'nvalue1','nf2':'nvalue2','nf3':4,'nf4':false,'nf5':[5,null,15,20],'nf6':['one','two','three','four'],'nf7':{'nnf1':'nnvalue1','nnf2':2},'nf8':['four','three','two','one'],'nf9':[20,15,10,5],'nf10':[20.1,15.2,10.3,5.4],'nf11':null}}".replace('\'', '\"'));
105105

106106
JsonDoc pdoc = projector.project(jsonDoc, JSON_NODE_FACTORY);
107107

crud/src/test/java/com/redhat/lightblue/eval/ProjectionTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public void basicProjectionTest_recursive() throws Exception {
117117
Assert.assertEquals(4, newDoc.get(new Path("field6.nf3")).asInt());
118118
Assert.assertEquals(false, newDoc.get(new Path("field6.nf4")).asBoolean());
119119
Assert.assertEquals(5, newDoc.get(new Path("field6.nf5.0")).asInt());
120-
Assert.assertEquals(10, newDoc.get(new Path("field6.nf5.1")).asInt());
120+
Assert.assertEquals(JSON_NODE_FACTORY.nullNode(), newDoc.get(new Path("field6.nf5.1")));
121121
Assert.assertEquals(15, newDoc.get(new Path("field6.nf5.2")).asInt());
122122
Assert.assertEquals(20, newDoc.get(new Path("field6.nf5.3")).asInt());
123123
Assert.assertEquals("one", newDoc.get(new Path("field6.nf6.0")).asText());
@@ -153,7 +153,7 @@ public void basicProjectionTest_exclusion() throws Exception {
153153
Assert.assertEquals(4, newDoc.get(new Path("field6.nf3")).asInt());
154154
Assert.assertEquals(false, newDoc.get(new Path("field6.nf4")).asBoolean());
155155
Assert.assertEquals(5, newDoc.get(new Path("field6.nf5.0")).asInt());
156-
Assert.assertEquals(10, newDoc.get(new Path("field6.nf5.1")).asInt());
156+
Assert.assertEquals(JSON_NODE_FACTORY.nullNode(), newDoc.get(new Path("field6.nf5.1")));
157157
Assert.assertEquals(15, newDoc.get(new Path("field6.nf5.2")).asInt());
158158
Assert.assertEquals(20, newDoc.get(new Path("field6.nf5.3")).asInt());
159159
Assert.assertEquals("one", newDoc.get(new Path("field6.nf6.0")).asText());

0 commit comments

Comments
 (0)