queryParameter) {
- public void setObjectKey(String entityKey) {
- this.objectKey = entityKey;
- }
+ final Object inputObject = inputObjects.get(objectKey);
- public void addMethodExpression(MethodExpression methodExpression) {
- this.methodExpressions.add(methodExpression);
- methodExpression.setParent(this);
- }
+ Object object = inputObject;
+ for (MethodExpression methodExpression : methodExpressions) {
+ methodExpression.setObject(object);
+ object = methodExpression.evaluate(inputObjects, queryParameter);
+ if (object == null) return null;
+ }
- @Override
- public String toString() {
- return "ChainedMethodExpression [objectKey=" + objectKey + ", methodExpressions=" + methodExpressions + "]";
- }
+ return object;
+ }
+
+ public void setObjectKey(String entityKey) {
+ this.objectKey = entityKey;
+ }
+
+ public void addMethodExpression(MethodExpression methodExpression) {
+ this.methodExpressions.add(methodExpression);
+ methodExpression.setParent(this);
+ }
+
+ @Override
+ public String toString() {
+ return "ChainedMethodExpression [objectKey=" + objectKey + ", methodExpressions=" + methodExpressions + "]";
+ }
}
diff --git a/li.strolch.soql/src/main/java/li/strolch/soql/core/expresssion/ComparisonExpression.java b/li.strolch.soql/src/main/java/li/strolch/soql/core/expresssion/ComparisonExpression.java
index b943a9420..4e176d88c 100644
--- a/li.strolch.soql/src/main/java/li/strolch/soql/core/expresssion/ComparisonExpression.java
+++ b/li.strolch.soql/src/main/java/li/strolch/soql/core/expresssion/ComparisonExpression.java
@@ -8,130 +8,131 @@ import li.strolch.soql.core.SOQLEvaluationException;
/**
* Compares two or more expressions, for example 'a.name = "12345"'
- *
+ *
* Currently only the following operators for equality check are supported:
- *
+ *
* '=' | '<>' | '>' | '>=' | '<' | '<=' ;
- *
+ *
* @author msmock
- *
*/
public class ComparisonExpression extends AbstractBooleanExpression {
- private String operator;
- private List operands = new ArrayList<>();
+ private String operator;
+ private List operands = new ArrayList<>();
- @Override
- public boolean evaluate(Map inputObjects, Map queryParameter) {
+ @Override
+ public boolean evaluate(Map inputObjects, Map queryParameter) {
- boolean result = false;
+ boolean result = false;
- switch (operator) {
- case "=":
- result = evaluateEquals(inputObjects, queryParameter);
- break;
- case "<>":
- result = !evaluateEquals(inputObjects, queryParameter);
- break;
- case ">":
- result = evaluateMore(inputObjects, queryParameter);
- break;
- case "<":
- result = evaluateLess(inputObjects, queryParameter);
- break;
- case ">=":
- result = !evaluateLess(inputObjects, queryParameter);
- break;
- case "<=":
- result = !evaluateMore(inputObjects, queryParameter);
- break;
- default:
- throw new SOQLEvaluationException("Comparison with operator " + operator + " is not supported yet.");
- }
+ switch (operator) {
+ case "=":
+ result = evaluateEquals(inputObjects, queryParameter);
+ break;
+ case "<>":
+ result = !evaluateEquals(inputObjects, queryParameter);
+ break;
+ case ">":
+ result = evaluateMore(inputObjects, queryParameter);
+ break;
+ case "<":
+ result = evaluateLess(inputObjects, queryParameter);
+ break;
+ case ">=":
+ result = !evaluateLess(inputObjects, queryParameter);
+ break;
+ case "<=":
+ result = !evaluateMore(inputObjects, queryParameter);
+ break;
+ default:
+ throw new SOQLEvaluationException("Comparison with operator " + operator + " is not supported yet.");
+ }
- return result;
- }
+ return result;
+ }
- /**
- * TODO: allow comparison, if the classes do not match. I.e. compare Integer with Double
- *
- * @param inputObjects
- * @param queryParameter
- * @return
- */
- private boolean evaluateLess(final Map inputObjects, final Map queryParameter) {
+ /**
+ * TODO: allow comparison, if the classes do not match. I.e. compare Integer with Double
+ *
+ * @param inputObjects
+ * @param queryParameter
+ * @return
+ */
+ private boolean evaluateLess(final Map inputObjects, final Map queryParameter) {
- final Object result_1 = operands.get(0).evaluate(inputObjects, queryParameter);
- final Object result_2 = operands.get(1).evaluate(inputObjects, queryParameter);
+ final Object result_1 = operands.get(0).evaluate(inputObjects, queryParameter);
+ final Object result_2 = operands.get(1).evaluate(inputObjects, queryParameter);
- final Class> clazz_1 = result_1.getClass();
- final Class> clazz_2 = result_2.getClass();
+ final Class> clazz_1 = result_1.getClass();
+ final Class> clazz_2 = result_2.getClass();
- if (!clazz_1.equals(clazz_2)) {
- throw new SOQLEvaluationException("Operation < not defined for comparison of " + result_1 + " of class "
- + clazz_1 + " with " + result_2 + " of class " + clazz_2);
- }
+ if (!clazz_1.equals(clazz_2)) {
+ throw new SOQLEvaluationException("Operation < not defined for comparison of " + result_1 + " of class "
+ + clazz_1 + " with " + result_2 + " of class " + clazz_2);
+ }
- if (result_1 instanceof Integer && result_2 instanceof Integer) {
- return ((Integer) result_1).compareTo((Integer) result_2) < 0;
- } else if (result_1 instanceof Long && result_2 instanceof Long) {
- return ((Long) result_1).compareTo((Long) result_2) < 0;
- } else if (result_1 instanceof Double && result_2 instanceof Double) {
- return ((Float) result_1).compareTo((Float) result_2) < 0;
- } else if (result_1 instanceof Double && result_2 instanceof Double) {
- return ((Double) result_1).compareTo((Double) result_2) < 0;
- }
+ if (result_1 instanceof Integer && result_2 instanceof Integer) {
+ return ((Integer) result_1).compareTo((Integer) result_2) < 0;
+ } else if (result_1 instanceof Long && result_2 instanceof Long) {
+ return ((Long) result_1).compareTo((Long) result_2) < 0;
+ } else if (result_1 instanceof Float && result_2 instanceof Float) {
+ return ((Float) result_1).compareTo((Float) result_2) < 0;
+ } else if (result_1 instanceof Double && result_2 instanceof Double) {
+ return ((Double) result_1).compareTo((Double) result_2) < 0;
+ }
- return false;
- }
+ return false;
+ }
- private boolean evaluateMore(final Map inputObjects, final Map queryParameter) {
+ private boolean evaluateMore(final Map inputObjects, final Map queryParameter) {
- final Object result_1 = operands.get(0).evaluate(inputObjects, queryParameter);
- final Object result_2 = operands.get(1).evaluate(inputObjects, queryParameter);
+ final Object result_1 = operands.get(0).evaluate(inputObjects, queryParameter);
+ final Object result_2 = operands.get(1).evaluate(inputObjects, queryParameter);
- final Class> clazz_1 = result_1.getClass();
- final Class> clazz_2 = result_2.getClass();
+ final Class> clazz_1 = result_1.getClass();
+ final Class> clazz_2 = result_2.getClass();
- if (!clazz_1.equals(clazz_2)) {
- throw new SOQLEvaluationException("Operation < not defined for comparison of " + result_1 + " of class "
- + clazz_1 + " with " + result_2 + " of class " + clazz_2);
- }
+ if (!clazz_1.equals(clazz_2)) {
+ throw new SOQLEvaluationException("Operation < not defined for comparison of " + result_1 + " of class "
+ + clazz_1 + " with " + result_2 + " of class " + clazz_2);
+ }
- if (result_1 instanceof Integer && result_2 instanceof Integer) {
- return ((Integer) result_1).compareTo((Integer) result_2) > 0;
- } else if (result_1 instanceof Long && result_2 instanceof Long) {
- return ((Long) result_1).compareTo((Long) result_2) > 0;
- } else if (result_1 instanceof Double && result_2 instanceof Double) {
- return ((Float) result_1).compareTo((Float) result_2) > 0;
- } else if (result_1 instanceof Double && result_2 instanceof Double) {
- return ((Double) result_1).compareTo((Double) result_2) > 0;
- }
+ if (result_1 instanceof Integer && result_2 instanceof Integer) {
+ return ((Integer) result_1).compareTo((Integer) result_2) > 0;
+ } else if (result_1 instanceof Long && result_2 instanceof Long) {
+ return ((Long) result_1).compareTo((Long) result_2) > 0;
+ } else if (result_1 instanceof Float && result_2 instanceof Float) {
+ return ((Float) result_1).compareTo((Float) result_2) > 0;
+ } else if (result_1 instanceof Double && result_2 instanceof Double) {
+ return ((Double) result_1).compareTo((Double) result_2) > 0;
+ }
- return false;
- }
+ return false;
+ }
- /**
- * @return true if the String representation of the operands match
- */
- private boolean evaluateEquals(final Map inputObjects, final Map queryParameter) {
- Object result_1 = operands.get(0).evaluate(inputObjects, queryParameter);
- Object result_2 = operands.get(1).evaluate(inputObjects, queryParameter);
- return result_1.equals(result_2);
- }
+ /**
+ * @return true if the String representation of the operands match
+ */
+ private boolean evaluateEquals(final Map inputObjects, final Map queryParameter) {
+ Object result_1 = operands.get(0).evaluate(inputObjects, queryParameter);
+ Object result_2 = operands.get(1).evaluate(inputObjects, queryParameter);
+ if (result_1 == null || result_2 == null)
+ return false;
+ return result_1.equals(result_2);
+ }
- public void setOperator(String operator) {
- this.operator = operator;
- }
+ public void setOperator(String operator) {
+ this.operator = operator;
+ }
- public void addOperand(IObjectExpression operand) {
- operands.add(operand);
- operand.setParent(this);
- }
+ public void addOperand(IObjectExpression operand) {
+ operands.add(operand);
+ operand.setParent(this);
+ }
- @Override
- public String toString() {
- return "ComparisonExpression [operator=" + operator + ", operands=" + operands + "]";
- }
+ @Override
+ public String toString() {
+ return "ComparisonExpression [operator=" + operator + ", operands=" + operands + "]";
+ }
}
diff --git a/li.strolch.soql/src/main/java/li/strolch/soql/core/expresssion/MethodExpression.java b/li.strolch.soql/src/main/java/li/strolch/soql/core/expresssion/MethodExpression.java
index 24b155ac3..749b7b367 100644
--- a/li.strolch.soql/src/main/java/li/strolch/soql/core/expresssion/MethodExpression.java
+++ b/li.strolch.soql/src/main/java/li/strolch/soql/core/expresssion/MethodExpression.java
@@ -10,6 +10,8 @@ import li.strolch.soql.core.SOQLEvaluationException;
/**
* extract state field value by reflection
+ *
+ * TODO: interpret null pointer in chained expression as null !!
*
* @author msmock
*/
diff --git a/li.strolch.soql/src/test/java/li/strolch/soql/core/MockObject.java b/li.strolch.soql/src/test/java/li/strolch/soql/core/MockObject.java
deleted file mode 100644
index dd5ce3d79..000000000
--- a/li.strolch.soql/src/test/java/li/strolch/soql/core/MockObject.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package li.strolch.soql.core;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MockObject {
-
- String id = "testId";
- String name = "testName";
- String type = "testType";
-
- Map parameter = new HashMap<>();
-
- int number = 42;
-
- public String getType() {
- return type;
- }
-
- public String getName() {
- return name;
- }
-
- public String getId() {
- return id;
- }
-
- public int getNumber() {
- return number;
- }
-
- public Object getParameter(String key) {
- return parameter.get(key);
- }
-
- public Object getParameter(String key, String dummy) {
- return parameter.get(key);
- }
-
- public void putParameter(String key, MockParameter value) {
- this.parameter.put(key, value);
- }
-
- @Override
- public String toString() {
- return "MockObject [id=" + id + ", name=" + name + ", type=" + type + ", number=" + number + "]";
- }
-
-}
diff --git a/li.strolch.soql/src/test/java/li/strolch/soql/core/MockParameter.java b/li.strolch.soql/src/test/java/li/strolch/soql/core/MockParameter.java
deleted file mode 100644
index 096c94b0e..000000000
--- a/li.strolch.soql/src/test/java/li/strolch/soql/core/MockParameter.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package li.strolch.soql.core;
-
-public class MockParameter {
-
- String value = "testValue";
- String type = "testType";
-
- public String getType() {
- return type;
- }
-
- @Override
- public String toString() {
- return "MockParameter [value=" + value + ", type=" + type + "]";
- }
-
-}
diff --git a/li.strolch.soql/src/test/java/li/strolch/soql/core/StatementTest.java b/li.strolch.soql/src/test/java/li/strolch/soql/core/StatementTest.java
index 33928090c..4ee0514df 100644
--- a/li.strolch.soql/src/test/java/li/strolch/soql/core/StatementTest.java
+++ b/li.strolch.soql/src/test/java/li/strolch/soql/core/StatementTest.java
@@ -1,12 +1,12 @@
package li.strolch.soql.core;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
+import li.strolch.model.ParameterBag;
+import li.strolch.model.Resource;
+import li.strolch.model.StrolchElement;
+import li.strolch.model.parameter.FloatParameter;
+import li.strolch.model.parameter.Parameter;
+import li.strolch.soql.antlr4.generated.SOQLLexer;
+import li.strolch.soql.antlr4.generated.SOQLParser;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
@@ -14,445 +14,439 @@ import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
import org.junit.Test;
-import li.strolch.soql.antlr4.generated.SOQLLexer;
-import li.strolch.soql.antlr4.generated.SOQLParser;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
public class StatementTest {
- /**
- * @throws Exception
- */
- private ParseTree parseString(final String s) throws Exception {
+ /**
+ * @throws Exception
+ */
+ private ParseTree parseString(final String s) throws Exception {
- CharStream input = CharStreams.fromString(s);
- SOQLLexer lexer = new SOQLLexer(input); // create a buffer of tokens pulled from the lexer
+ CharStream input = CharStreams.fromString(s);
+ SOQLLexer lexer = new SOQLLexer(input); // create a buffer of tokens pulled from the lexer
- CommonTokenStream tokens = new CommonTokenStream(lexer); // create a parser that feeds off the tokens buffer
- SOQLParser parser = new SOQLParser(tokens);
- parser.addErrorListener(new VerboseListener());
+ CommonTokenStream tokens = new CommonTokenStream(lexer); // create a parser that feeds off the tokens buffer
+ SOQLParser parser = new SOQLParser(tokens);
+ parser.addErrorListener(new VerboseListener());
- ParseTree tree = parser.select_statement(); // begin parsing at block
+ ParseTree tree = parser.select_statement(); // begin parsing at block
- System.out.println(tree.toStringTree(parser)); // print LISP-style tree
+ System.out.println(tree.toStringTree(parser)); // print LISP-style tree
- return tree;
- }
+ return tree;
+ }
- /**
- * @param tree
- * @return CompiledSOQLStatement the compiled SOQL statement
- * @throws Exception
- */
- private CompiledStatement compile(final ParseTree tree) throws Exception {
+ /**
+ * @param tree
+ * @return CompiledSOQLStatement the compiled SOQL statement
+ * @throws Exception
+ */
+ private CompiledStatement compile(final ParseTree tree) throws Exception {
- final ParseTreeWalker walker = new ParseTreeWalker();
- final SOQLListener listener = new SOQLListener();
- walker.walk(listener, tree);
+ final ParseTreeWalker walker = new ParseTreeWalker();
+ final SOQLListener listener = new SOQLListener();
+ walker.walk(listener, tree);
- final CompiledStatement soqlStatement = new CompiledStatement();
- soqlStatement.entities = listener.getEntities();
- soqlStatement.whereExpression = listener.getWhereExpression();
- soqlStatement.selectClause = listener.getSelectClause();
+ final CompiledStatement soqlStatement = new CompiledStatement();
+ soqlStatement.entities = listener.getEntities();
+ soqlStatement.whereExpression = listener.getWhereExpression();
+ soqlStatement.selectClause = listener.getSelectClause();
- return soqlStatement;
- }
-
- @Test
- public void test0() throws Exception {
+ return soqlStatement;
+ }
- String s = "SELECT r FROM Resource r";
+ /**
+ * @return a test parameter with String value
+ */
+ public StrolchElement getTestElement() {
+ final Resource resource = new Resource();
+ resource.setId("testId");
- final ParseTree tree = parseString(s);
- final CompiledStatement compiledStatement = compile(tree);
-
- // System.out.println(compiledStatement);
+ final ParameterBag bag = new ParameterBag();
+ bag.setId("testBag");
+ resource.addParameterBag(bag);
- final Map inputObjects = new HashMap<>();
- inputObjects.put("r", new MockObject());
+ final Parameter parameter = new FloatParameter();
+ parameter.setId("testId");
+ parameter.setValue(100d);
- final Map queryParameter = new HashMap<>();
+ resource.addParameter("testBag", parameter);
+ return resource;
+ }
- final List