diff --git a/engine/src/main/java/com/arcadedb/database/EmbeddedDatabase.java b/engine/src/main/java/com/arcadedb/database/EmbeddedDatabase.java index 1ea34067b6..f1a492e9cf 100644 --- a/engine/src/main/java/com/arcadedb/database/EmbeddedDatabase.java +++ b/engine/src/main/java/com/arcadedb/database/EmbeddedDatabase.java @@ -93,7 +93,6 @@ import java.util.concurrent.atomic.*; import java.util.concurrent.locks.*; import java.util.logging.*; -import java.util.stream.*; public class EmbeddedDatabase extends RWLockContext implements DatabaseInternal { public static final int EDGE_LIST_INITIAL_CHUNK_SIZE = 64; @@ -1696,14 +1695,13 @@ private void setDefaultValues(Record record) { private ResultSet executeInternal(final List statements, final CommandContext scriptContext) { ScriptExecutionPlan plan = new ScriptExecutionPlan(scriptContext); - plan.setStatement(statements.stream().map(Statement::toString).collect(Collectors.joining(";"))); + plan.setStatements(statements); List lastRetryBlock = new ArrayList<>(); int nestedTxLevel = 0; for (Statement stm : statements) { - if (stm.getOriginalStatement() == null) - stm.setOriginalStatement(stm.toString()); + stm.setOriginalStatement(stm); if (stm instanceof BeginStatement) nestedTxLevel++; diff --git a/engine/src/main/java/com/arcadedb/query/sql/executor/BasicCommandContext.java b/engine/src/main/java/com/arcadedb/query/sql/executor/BasicCommandContext.java index 33c2a0eb62..ace00428cd 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/executor/BasicCommandContext.java +++ b/engine/src/main/java/com/arcadedb/query/sql/executor/BasicCommandContext.java @@ -366,6 +366,9 @@ public CommandContext setDatabase(final Database database) { return this; } + /** + * TODO OPTIMIZE THIS + */ public static int getLowerIndexOf(final String iText, final int iBeginOffset, final String... iToSearch) { int lowest = -1; for (String toSearch : iToSearch) { @@ -401,14 +404,17 @@ public static int getLowerIndexOf(final String iText, final int iBeginOffset, fi return lowest; } + /** + * TODO: optimize this + */ public static int getHigherIndexOf(final String iText, final int iBeginOffset, final String... iToSearch) { - int lowest = -1; + int highest = -1; for (String toSearch : iToSearch) { int index = iText.indexOf(toSearch, iBeginOffset); - if (index > -1 && (lowest == -1 || index > lowest)) - lowest = index; + if (index > -1 && (highest == -1 || index > highest)) + highest = index; } - return lowest; + return highest; } @Override diff --git a/engine/src/main/java/com/arcadedb/query/sql/executor/ConvertToUpdatableResultStep.java b/engine/src/main/java/com/arcadedb/query/sql/executor/ConvertToUpdatableResultStep.java index efc49d37bd..27a642a73f 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/executor/ConvertToUpdatableResultStep.java +++ b/engine/src/main/java/com/arcadedb/query/sql/executor/ConvertToUpdatableResultStep.java @@ -124,7 +124,7 @@ public Result next() { Result result = nextItem; nextItem = null; fetched++; - ctx.setVariable("$current", result); + ctx.setVariable("current", result); return result; } diff --git a/engine/src/main/java/com/arcadedb/query/sql/executor/EmptyDataGeneratorStep.java b/engine/src/main/java/com/arcadedb/query/sql/executor/EmptyDataGeneratorStep.java index 7cbe488e84..4971d6e774 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/executor/EmptyDataGeneratorStep.java +++ b/engine/src/main/java/com/arcadedb/query/sql/executor/EmptyDataGeneratorStep.java @@ -54,7 +54,7 @@ public Result next() { if (served < size) { served++; ResultInternal result = new ResultInternal(); - ctx.setVariable("$current", result); + ctx.setVariable("current", result); return result; } throw new IllegalStateException(); diff --git a/engine/src/main/java/com/arcadedb/query/sql/executor/FetchFromClassExecutionStep.java b/engine/src/main/java/com/arcadedb/query/sql/executor/FetchFromClassExecutionStep.java index 331362cc11..6428472c6e 100755 --- a/engine/src/main/java/com/arcadedb/query/sql/executor/FetchFromClassExecutionStep.java +++ b/engine/src/main/java/com/arcadedb/query/sql/executor/FetchFromClassExecutionStep.java @@ -174,7 +174,7 @@ public Result next() { if (currentResultSet != null && currentResultSet.hasNext()) { totDispatched++; Result result = currentResultSet.next(); - ctx.setVariable("$current", result); + ctx.setVariable("current", result); return result; } else { if (currentStep >= getSubSteps().size()) { diff --git a/engine/src/main/java/com/arcadedb/query/sql/executor/FetchFromClusterExecutionStep.java b/engine/src/main/java/com/arcadedb/query/sql/executor/FetchFromClusterExecutionStep.java index 026f2d35bc..91138e36c2 100755 --- a/engine/src/main/java/com/arcadedb/query/sql/executor/FetchFromClusterExecutionStep.java +++ b/engine/src/main/java/com/arcadedb/query/sql/executor/FetchFromClusterExecutionStep.java @@ -124,7 +124,7 @@ record = iterator.next(); nFetched++; ResultInternal result = new ResultInternal(); result.element = (Document) record; - ctx.setVariable("$current", result); + ctx.setVariable("current", result); return result; } finally { if (profilingEnabled) { diff --git a/engine/src/main/java/com/arcadedb/query/sql/executor/FetchFromIndexStep.java b/engine/src/main/java/com/arcadedb/query/sql/executor/FetchFromIndexStep.java index d26a95e33b..e0f2b92c1f 100755 --- a/engine/src/main/java/com/arcadedb/query/sql/executor/FetchFromIndexStep.java +++ b/engine/src/main/java/com/arcadedb/query/sql/executor/FetchFromIndexStep.java @@ -117,7 +117,7 @@ public Result next() { ResultInternal result = new ResultInternal(); result.setProperty("key", key); result.setProperty("rid", value); - ctx.setVariable("$current", result); + ctx.setVariable("current", result); return result; } finally { if (profilingEnabled) { diff --git a/engine/src/main/java/com/arcadedb/query/sql/executor/InternalExecutionPlan.java b/engine/src/main/java/com/arcadedb/query/sql/executor/InternalExecutionPlan.java index bf0b841079..dff49d371e 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/executor/InternalExecutionPlan.java +++ b/engine/src/main/java/com/arcadedb/query/sql/executor/InternalExecutionPlan.java @@ -18,6 +18,10 @@ */ package com.arcadedb.query.sql.executor; +import com.arcadedb.query.sql.parser.Statement; + +import java.util.*; + /** * Created by luigidellaquila on 06/07/16. */ @@ -59,6 +63,6 @@ default String getStatement() { return null; } - default void setStatement(String stm) { + default void setStatements(List stm) { } } diff --git a/engine/src/main/java/com/arcadedb/query/sql/executor/MatchEdgeTraverser.java b/engine/src/main/java/com/arcadedb/query/sql/executor/MatchEdgeTraverser.java index 70bcfbc63b..f2e04526a1 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/executor/MatchEdgeTraverser.java +++ b/engine/src/main/java/com/arcadedb/query/sql/executor/MatchEdgeTraverser.java @@ -175,7 +175,7 @@ public Object next() { } public void fetchNext() { - Object previousMatch = iCommandContext.getVariable("$currentMatch"); + Object previousMatch = iCommandContext.getVariable("currentMatch"); ResultInternal matched = (ResultInternal) iCommandContext.getVariable("matched"); if (matched != null) { matched.setProperty(getStartingPointAlias(), sourceRecord.getProperty(getStartingPointAlias())); @@ -183,14 +183,14 @@ public void fetchNext() { while (iter.hasNext()) { ResultInternal next = iter.next(); Document elem = next.toElement(); - iCommandContext.setVariable("$currentMatch", elem); + iCommandContext.setVariable("currentMatch", elem); if (matchesFilters(iCommandContext, theFilter, elem) && matchesClass(iCommandContext, theClassName, elem) && matchesCluster(iCommandContext, theClusterId, elem) && matchesRid(iCommandContext, theTargetRid, elem)) { nextElement = next; break; } } - iCommandContext.setVariable("$currentMatch", previousMatch); + iCommandContext.setVariable("currentMatch", previousMatch); } }; }; @@ -198,9 +198,9 @@ public void fetchNext() { } else { // in this case also zero level (starting point) is considered and traversal depth is // given by the while condition result = new ArrayList<>(); - iCommandContext.setVariable("$depth", depth); - Object previousMatch = iCommandContext.getVariable("$currentMatch"); - iCommandContext.setVariable("$currentMatch", startingPoint); + iCommandContext.setVariable("depth", depth); + Object previousMatch = iCommandContext.getVariable("currentMatch"); + iCommandContext.setVariable("currentMatch", startingPoint); if (matchesFilters(iCommandContext, filter, startingPoint) && matchesClass(iCommandContext, className, startingPoint) && matchesCluster(iCommandContext, clusterId, startingPoint) && matchesRid(iCommandContext, targetRid, startingPoint)) { @@ -241,7 +241,7 @@ public void fetchNext() { } } } - iCommandContext.setVariable("$currentMatch", previousMatch); + iCommandContext.setVariable("currentMatch", previousMatch); } return result; } @@ -334,13 +334,13 @@ protected Iterable traversePatternEdge(Identifiable startingPoin } } - Object prevCurrent = iCommandContext.getVariable("$current"); - iCommandContext.setVariable("$current", startingPoint); + Object prevCurrent = iCommandContext.getVariable("current"); + iCommandContext.setVariable("current", startingPoint); Object qR; try { qR = this.item.getMethod().execute(startingPoint, possibleResults, iCommandContext); } finally { - iCommandContext.setVariable("$current", prevCurrent); + iCommandContext.setVariable("current", prevCurrent); } if (qR == null) { diff --git a/engine/src/main/java/com/arcadedb/query/sql/executor/MatchFieldTraverser.java b/engine/src/main/java/com/arcadedb/query/sql/executor/MatchFieldTraverser.java index df3264fab0..7defc57f2c 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/executor/MatchFieldTraverser.java +++ b/engine/src/main/java/com/arcadedb/query/sql/executor/MatchFieldTraverser.java @@ -49,14 +49,14 @@ protected Iterable traversePatternEdge(Identifiable startingPoin } } - Object prevCurrent = iCommandContext.getVariable("$current"); - iCommandContext.setVariable("$current", startingPoint); + Object prevCurrent = iCommandContext.getVariable("current"); + iCommandContext.setVariable("current", startingPoint); Object qR; try { // TODO check possible results! qR = ((FieldMatchPathItem) this.item).getExp().execute(startingPoint, iCommandContext); } finally { - iCommandContext.setVariable("$current", prevCurrent); + iCommandContext.setVariable("current", prevCurrent); } if (qR == null) { diff --git a/engine/src/main/java/com/arcadedb/query/sql/executor/MatchFirstStep.java b/engine/src/main/java/com/arcadedb/query/sql/executor/MatchFirstStep.java index 6c8607b091..c01dcedb28 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/executor/MatchFirstStep.java +++ b/engine/src/main/java/com/arcadedb/query/sql/executor/MatchFirstStep.java @@ -83,7 +83,7 @@ public Result next() { } else { result.setProperty(getAlias(), subResultSet.next()); } - ctx.setVariable("$matched", result); + ctx.setVariable("matched", result); currentCount++; return result; } diff --git a/engine/src/main/java/com/arcadedb/query/sql/executor/MatchMultiEdgeTraverser.java b/engine/src/main/java/com/arcadedb/query/sql/executor/MatchMultiEdgeTraverser.java index 7de1eaab46..6eeb3595f4 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/executor/MatchMultiEdgeTraverser.java +++ b/engine/src/main/java/com/arcadedb/query/sql/executor/MatchMultiEdgeTraverser.java @@ -58,7 +58,7 @@ protected Iterable traversePatternEdge(Identifiable startingPoin List nextStep = new ArrayList<>(); nextStep.add(startingPoint); - Object oldCurrent = iCommandContext.getVariable("$current"); + Object oldCurrent = iCommandContext.getVariable("current"); for (MatchPathItem sub : item.getItems()) { List rightSide = new ArrayList<>(); for (Object o : nextStep) { @@ -78,7 +78,7 @@ protected Iterable traversePatternEdge(Identifiable startingPoin subtraverser.executeTraversal(iCommandContext, sub, (Identifiable) current, 0, null).forEach(x -> rightSide.add(x)); } else { - iCommandContext.setVariable("$current", o); + iCommandContext.setVariable("current", o); Object nextSteps = method.execute(o, possibleResults, iCommandContext); if (nextSteps instanceof Collection) { ((Collection) nextSteps).stream().map(x -> toOResultInternal(x)).filter(Objects::nonNull) @@ -109,7 +109,7 @@ protected Iterable traversePatternEdge(Identifiable startingPoin result = rightSide; } - iCommandContext.setVariable("$current", oldCurrent); + iCommandContext.setVariable("current", oldCurrent); // return (qR instanceof Iterable) ? (Iterable) qR : Collections.singleton((PIdentifiable) qR); return result; } diff --git a/engine/src/main/java/com/arcadedb/query/sql/executor/MatchStep.java b/engine/src/main/java/com/arcadedb/query/sql/executor/MatchStep.java index 949bf4fc72..78aebf5ca0 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/executor/MatchStep.java +++ b/engine/src/main/java/com/arcadedb/query/sql/executor/MatchStep.java @@ -77,7 +77,7 @@ public Result next() { Result result = nextResult; fetchNext(ctx, nRecords); localCount++; - ctx.setVariable("$matched", result); + ctx.setVariable("matched", result); return result; } diff --git a/engine/src/main/java/com/arcadedb/query/sql/executor/ProjectionCalculationStep.java b/engine/src/main/java/com/arcadedb/query/sql/executor/ProjectionCalculationStep.java index fdc88e25c9..8c358100d8 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/executor/ProjectionCalculationStep.java +++ b/engine/src/main/java/com/arcadedb/query/sql/executor/ProjectionCalculationStep.java @@ -52,10 +52,10 @@ public boolean hasNext() { @Override public Result next() { Result item = parentRs.next(); - Object oldCurrent = ctx.getVariable("$current"); - ctx.setVariable("$current", item); + Object oldCurrent = ctx.getVariable("current"); + ctx.setVariable("current", item); Result result = calculateProjections(ctx, item); - ctx.setVariable("$current", oldCurrent); + ctx.setVariable("current", oldCurrent); return result; } diff --git a/engine/src/main/java/com/arcadedb/query/sql/executor/ResultInternal.java b/engine/src/main/java/com/arcadedb/query/sql/executor/ResultInternal.java index dd8057baae..7f251315b5 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/executor/ResultInternal.java +++ b/engine/src/main/java/com/arcadedb/query/sql/executor/ResultInternal.java @@ -276,27 +276,6 @@ public void setMetadata(final String key, final Object value) { metadata.put(key, value); } - public void clearMetadata() { - metadata = null; - } - - public void removeMetadata(final String key) { - if (key == null || metadata == null) - return; - - metadata.remove(key); - } - - public void addMetadata(final Map values) { - if (values == null) - return; - - if (this.metadata == null) - this.metadata = new HashMap<>(); - - this.metadata.putAll(values); - } - @Override public Set getMetadataKeys() { return metadata == null ? Collections.emptySet() : metadata.keySet(); diff --git a/engine/src/main/java/com/arcadedb/query/sql/executor/ScriptExecutionPlan.java b/engine/src/main/java/com/arcadedb/query/sql/executor/ScriptExecutionPlan.java index ff7dcdfcd6..a1e9675a38 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/executor/ScriptExecutionPlan.java +++ b/engine/src/main/java/com/arcadedb/query/sql/executor/ScriptExecutionPlan.java @@ -22,6 +22,8 @@ * Created by luigidellaquila on 08/08/16. */ +import com.arcadedb.query.sql.parser.Statement; + import java.util.*; import java.util.stream.*; @@ -35,14 +37,15 @@ public class ScriptExecutionPlan implements InternalExecutionPlan { protected List steps = new ArrayList<>(); private ExecutionStepInternal lastStep = null; private ResultSet finalResult = null; - private String statement; + private List statements; + private String statementAsString; - public ScriptExecutionPlan(CommandContext ctx) { + public ScriptExecutionPlan(final CommandContext ctx) { this.ctx = ctx; } @Override - public void reset(CommandContext ctx) { + public void reset(final CommandContext ctx) { // TODO throw new UnsupportedOperationException(); } @@ -53,7 +56,7 @@ public void close() { } @Override - public ResultSet fetchNext(int n) { + public ResultSet fetchNext(final int n) { doExecute(n); return new ResultSet() { @@ -88,7 +91,7 @@ public Map getQueryStats() { }; } - private void doExecute(int n) { + private void doExecute(final int n) { if (!executed) { executeUntilReturn(); executed = true; @@ -109,10 +112,10 @@ private void doExecute(int n) { } @Override - public String prettyPrint(int depth, int indent) { - StringBuilder result = new StringBuilder(); + public String prettyPrint(final int depth, final int indent) { + final StringBuilder result = new StringBuilder(); for (int i = 0; i < steps.size(); i++) { - ExecutionStepInternal step = steps.get(i); + final ExecutionStepInternal step = steps.get(i); result.append(step.prettyPrint(depth, indent)); if (i < steps.size() - 1) { result.append("\n"); @@ -121,9 +124,9 @@ public String prettyPrint(int depth, int indent) { return result.toString(); } - public void chain(InternalExecutionPlan nextPlan, boolean profilingEnabled) { - ScriptLineStep lastStep = steps.size() == 0 ? null : steps.get(steps.size() - 1); - ScriptLineStep nextStep = new ScriptLineStep(nextPlan, ctx, profilingEnabled); + public void chain(final InternalExecutionPlan nextPlan, final boolean profilingEnabled) { + final ScriptLineStep lastStep = steps.size() == 0 ? null : steps.get(steps.size() - 1); + final ScriptLineStep nextStep = new ScriptLineStep(nextPlan, ctx, profilingEnabled); if (lastStep != null) { lastStep.setNext(nextStep); nextStep.setPrevious(lastStep); @@ -138,13 +141,13 @@ public List getSteps() { return (List) steps; } - public void setSteps(List steps) { + public void setSteps(final List steps) { this.steps = (List) steps; } @Override public Result toResult() { - ResultInternal result = new ResultInternal(); + final ResultInternal result = new ResultInternal(); result.setProperty("type", "ScriptExecutionPlan"); result.setProperty("javaType", getClass().getName()); result.setProperty("cost", getCost()); @@ -237,11 +240,13 @@ public ExecutionStepInternal executeFull() { @Override public String getStatement() { - return statement; + if (statementAsString == null) + statementAsString = statements.stream().map(Statement::toString).collect(Collectors.joining(";")); + return statementAsString; } @Override - public void setStatement(String statement) { - this.statement = statement; + public void setStatements(final List statements) { + this.statements = statements; } } diff --git a/engine/src/main/java/com/arcadedb/query/sql/parser/BaseExpression.java b/engine/src/main/java/com/arcadedb/query/sql/parser/BaseExpression.java index 7cf9b39add..2ab534cdc8 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/parser/BaseExpression.java +++ b/engine/src/main/java/com/arcadedb/query/sql/parser/BaseExpression.java @@ -71,11 +71,6 @@ public BaseExpression(final RecordAttribute attr, final Modifier modifier) { } } - @Override - public String toString() { - return super.toString(); - } - public void toString(final Map params, final StringBuilder builder) { if (number != null) { number.toString(params, builder); @@ -304,6 +299,7 @@ public BaseExpression copy() { result.inputParam = inputParam == null ? null : inputParam.copy(); result.string = string; result.modifier = modifier == null ? null : modifier.copy(); + result.cachedStringForm = cachedStringForm; return result; } diff --git a/engine/src/main/java/com/arcadedb/query/sql/parser/FirstLevelExpression.java b/engine/src/main/java/com/arcadedb/query/sql/parser/FirstLevelExpression.java index 54df7a4ada..635bd44168 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/parser/FirstLevelExpression.java +++ b/engine/src/main/java/com/arcadedb/query/sql/parser/FirstLevelExpression.java @@ -38,11 +38,5 @@ protected boolean supportsBasicCalculation() { public boolean isBaseIdentifier() { return value instanceof Identifier; } - - //never used, this class is never returned by the parser! - @Override - public MathExpression copy() { - return super.copy(); - } } /* JavaCC - OriginalChecksum=30dc1016b686d4841bbd57d6e6c0bfbd (do not edit this line) */ diff --git a/engine/src/main/java/com/arcadedb/query/sql/parser/FunctionCall.java b/engine/src/main/java/com/arcadedb/query/sql/parser/FunctionCall.java index 31226f4222..c57610e5ac 100755 --- a/engine/src/main/java/com/arcadedb/query/sql/parser/FunctionCall.java +++ b/engine/src/main/java/com/arcadedb/query/sql/parser/FunctionCall.java @@ -104,7 +104,7 @@ record = targetObjects; } } if (record == null) { - Object current = ctx == null ? null : ctx.getVariable("$current"); + Object current = ctx == null ? null : ctx.getVariable("current"); if (current != null) { if (current instanceof Identifiable) { record = current; diff --git a/engine/src/main/java/com/arcadedb/query/sql/parser/MatchPathItem.java b/engine/src/main/java/com/arcadedb/query/sql/parser/MatchPathItem.java index 8ac876dc22..6985b79047 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/parser/MatchPathItem.java +++ b/engine/src/main/java/com/arcadedb/query/sql/parser/MatchPathItem.java @@ -87,17 +87,17 @@ public Iterable executeTraversal(MatchStatement.MatchContext match } for (Identifiable origin : queryResult) { - Object previousMatch = iCommandContext.getVariable("$currentMatch"); - iCommandContext.setVariable("$currentMatch", origin); + Object previousMatch = iCommandContext.getVariable("currentMatch"); + iCommandContext.setVariable("currentMatch", origin); if ((oClass == null || matchesClass(origin, oClass)) && (filter == null || filter.matchesFilters(origin, iCommandContext))) { result.add(origin); } - iCommandContext.setVariable("$currentMatch", previousMatch); + iCommandContext.setVariable("currentMatch", previousMatch); } } else {// in this case also zero level (starting point) is considered and traversal depth is given by the while condition - iCommandContext.setVariable("$depth", depth); - Object previousMatch = iCommandContext.getVariable("$currentMatch"); - iCommandContext.setVariable("$currentMatch", startingPoint); + iCommandContext.setVariable("depth", depth); + Object previousMatch = iCommandContext.getVariable("currentMatch"); + iCommandContext.setVariable("currentMatch", startingPoint); if ((oClass == null || matchesClass(startingPoint, oClass)) && (filter == null || filter.matchesFilters(startingPoint, iCommandContext))) { result.add(startingPoint); } @@ -118,7 +118,7 @@ public Iterable executeTraversal(MatchStatement.MatchContext match } } } - iCommandContext.setVariable("$currentMatch", previousMatch); + iCommandContext.setVariable("currentMatch", previousMatch); } return result; } diff --git a/engine/src/main/java/com/arcadedb/query/sql/parser/MethodCall.java b/engine/src/main/java/com/arcadedb/query/sql/parser/MethodCall.java index 69abcd8e4a..6db1012895 100755 --- a/engine/src/main/java/com/arcadedb/query/sql/parser/MethodCall.java +++ b/engine/src/main/java/com/arcadedb/query/sql/parser/MethodCall.java @@ -89,7 +89,7 @@ public Object execute(Object targetObjects, Iterable iPossibleResu private Object execute(final Object targetObjects, final CommandContext ctx, final String name, final List iParams, final Iterable iPossibleResults) { final List paramValues = new ArrayList(); - Object val = ctx.getVariable("$current"); + Object val = ctx.getVariable("current"); if (val == null && targetObjects == null) { return null; } @@ -109,13 +109,13 @@ private Object execute(final Object targetObjects, final CommandContext ctx, fin if (isGraphFunction()) { SQLFunction function = ((SQLQueryEngine) ctx.getDatabase().getQueryEngine("sql")).getFunction(name); if (function instanceof SQLFunctionFiltered) { - Object current = ctx.getVariable("$current"); + Object current = ctx.getVariable("current"); if (current instanceof Result) { current = ((Result) current).getElement().orElse(null); } return ((SQLFunctionFiltered) function).execute(targetObjects, (Identifiable) current, null, paramValues.toArray(), iPossibleResults, ctx); } else { - final Object current = ctx.getVariable("$current"); + final Object current = ctx.getVariable("current"); if (current instanceof Identifiable) { return function.execute(targetObjects, (Identifiable) current, null, paramValues.toArray(), ctx); } else if (current instanceof Result) { diff --git a/engine/src/main/java/com/arcadedb/query/sql/parser/ParenthesisExpression.java b/engine/src/main/java/com/arcadedb/query/sql/parser/ParenthesisExpression.java index 30ec7c5f5b..6f1871ffc9 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/parser/ParenthesisExpression.java +++ b/engine/src/main/java/com/arcadedb/query/sql/parser/ParenthesisExpression.java @@ -35,21 +35,21 @@ public class ParenthesisExpression extends MathExpression { protected Expression expression; protected Statement statement; - public ParenthesisExpression(int id) { + public ParenthesisExpression(final int id) { super(id); } - public ParenthesisExpression(SqlParser p, int id) { + public ParenthesisExpression(final SqlParser p, final int id) { super(p, id); } - public ParenthesisExpression(Expression exp) { + public ParenthesisExpression(final Expression exp) { super(-1); this.expression = exp; } @Override - public Object execute(Identifiable iCurrentRecord, CommandContext ctx) { + public Object execute(final Identifiable iCurrentRecord, final CommandContext ctx) { if (expression != null) { return expression.execute(iCurrentRecord, ctx); } @@ -60,7 +60,7 @@ public Object execute(Identifiable iCurrentRecord, CommandContext ctx) { } @Override - public Object execute(Result iCurrentRecord, CommandContext ctx) { + public Object execute(final Result iCurrentRecord, final CommandContext ctx) { if (expression != null) { return expression.execute(iCurrentRecord, ctx); } @@ -143,31 +143,32 @@ public SimpleNode splitForAggregation(AggregateProjectionSplit aggregateProj) { @Override public ParenthesisExpression copy() { - ParenthesisExpression result = new ParenthesisExpression(-1); + final ParenthesisExpression result = new ParenthesisExpression(-1); result.expression = expression == null ? null : expression.copy(); result.statement = statement == null ? null : statement.copy(); + result.cachedStringForm = cachedStringForm; return result; } - public void setStatement(Statement statement) { + public void setStatement(final Statement statement) { this.statement = statement; } - public void extractSubQueries(SubQueryCollector collector) { + public void extractSubQueries(final SubQueryCollector collector) { if (expression != null) { expression.extractSubQueries(collector); } else if (statement != null) { - Identifier alias = collector.addStatement(statement); + final Identifier alias = collector.addStatement(statement); statement = null; expression = new Expression(alias); } } - public void extractSubQueries(Identifier letAlias, SubQueryCollector collector) { + public void extractSubQueries(final Identifier letAlias, final SubQueryCollector collector) { if (expression != null) { expression.extractSubQueries(collector); } else if (statement != null) { - Identifier alias = collector.addStatement(letAlias, statement); + final Identifier alias = collector.addStatement(letAlias, statement); statement = null; expression = new Expression(alias); } @@ -181,7 +182,7 @@ public boolean refersToParent() { } @Override - public boolean equals(Object o) { + public boolean equals(final Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) @@ -189,7 +190,7 @@ public boolean equals(Object o) { if (!super.equals(o)) return false; - ParenthesisExpression that = (ParenthesisExpression) o; + final ParenthesisExpression that = (ParenthesisExpression) o; if (!Objects.equals(expression, that.expression)) return false; @@ -218,7 +219,7 @@ public void applyRemove(ResultInternal result, CommandContext ctx) { } public Result serialize() { - ResultInternal result = (ResultInternal) super.serialize(); + final ResultInternal result = (ResultInternal) super.serialize(); if (expression != null) { result.setProperty("expression", expression.serialize()); } @@ -228,7 +229,7 @@ public Result serialize() { return result; } - public void deserialize(Result fromResult) { + public void deserialize(final Result fromResult) { super.deserialize(fromResult); if (fromResult.getProperty("expression") != null) { expression = new Expression(-1); diff --git a/engine/src/main/java/com/arcadedb/query/sql/parser/SelectStatement.java b/engine/src/main/java/com/arcadedb/query/sql/parser/SelectStatement.java index b73dd8b834..050e12e7af 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/parser/SelectStatement.java +++ b/engine/src/main/java/com/arcadedb/query/sql/parser/SelectStatement.java @@ -156,20 +156,17 @@ public void validate() throws CommandSQLParsingException { @Override public boolean executionPlanCanBeCached() { - if (originalStatement == null) { + if (originalStatementAsString == null && originalStatement == null) return false; - } - if (this.target != null && !this.target.isCacheable()) { + + if (this.target != null && !this.target.isCacheable()) return false; - } - if (this.letClause != null && !this.letClause.isCacheable()) { + if (this.letClause != null && !this.letClause.isCacheable()) return false; - } - if (projection != null && !this.projection.isCacheable()) { + if (projection != null && !this.projection.isCacheable()) return false; - } return whereClause == null || whereClause.isCacheable(); } @@ -219,25 +216,23 @@ public InternalExecutionPlan createExecutionPlan(CommandContext ctx, boolean ena @Override public SelectStatement copy() { - SelectStatement result = null; try { - result = getClass().getConstructor(Integer.TYPE).newInstance(-1); + final SelectStatement result = getClass().getConstructor(Integer.TYPE).newInstance(-1); + result.originalStatement = originalStatement; + result.target = target == null ? null : target.copy(); + result.projection = projection == null ? null : projection.copy(); + result.whereClause = whereClause == null ? null : whereClause.copy(); + result.groupBy = groupBy == null ? null : groupBy.copy(); + result.orderBy = orderBy == null ? null : orderBy.copy(); + result.unwind = unwind == null ? null : unwind.copy(); + result.skip = skip == null ? null : skip.copy(); + result.limit = limit == null ? null : limit.copy(); + result.letClause = letClause == null ? null : letClause.copy(); + result.timeout = timeout == null ? null : timeout.copy(); + return result; } catch (Exception e) { throw new ArcadeDBException(e); } - result.originalStatement = originalStatement; - result.target = target == null ? null : target.copy(); - result.projection = projection == null ? null : projection.copy(); - result.whereClause = whereClause == null ? null : whereClause.copy(); - result.groupBy = groupBy == null ? null : groupBy.copy(); - result.orderBy = orderBy == null ? null : orderBy.copy(); - result.unwind = unwind == null ? null : unwind.copy(); - result.skip = skip == null ? null : skip.copy(); - result.limit = limit == null ? null : limit.copy(); - result.letClause = letClause == null ? null : letClause.copy(); - result.timeout = timeout == null ? null : timeout.copy(); - - return result; } @Override diff --git a/engine/src/main/java/com/arcadedb/query/sql/parser/SimpleNode.java b/engine/src/main/java/com/arcadedb/query/sql/parser/SimpleNode.java index 93dbec96ad..906918384e 100755 --- a/engine/src/main/java/com/arcadedb/query/sql/parser/SimpleNode.java +++ b/engine/src/main/java/com/arcadedb/query/sql/parser/SimpleNode.java @@ -30,16 +30,17 @@ public class SimpleNode implements Node { protected SqlParser parser; protected Token firstToken; protected Token lastToken; + protected String cachedStringForm; public SimpleNode() { id = -1; } - public SimpleNode(int i) { + public SimpleNode(final int i) { id = i; } - public SimpleNode(SqlParser p, int i) { + public SimpleNode(final SqlParser p, final int i) { this(i); parser = p; } @@ -50,7 +51,7 @@ public void jjtOpen() { public void jjtClose() { } - public void jjtSetParent(Node n) { + public void jjtSetParent(final Node n) { parent = n; } @@ -58,11 +59,11 @@ public Node jjtGetParent() { return parent; } - public void jjtAddChild(Node n, int i) { + public void jjtAddChild(final Node n, final int i) { if (children == null) { children = new Node[i + 1]; } else if (i >= children.length) { - Node[] c = new Node[i + 1]; + final Node[] c = new Node[i + 1]; System.arraycopy(children, 0, c, 0, children.length); children = c; } @@ -77,7 +78,7 @@ public int jjtGetNumChildren() { return (children == null) ? 0 : children.length; } - public void jjtSetValue(Object value) { + public void jjtSetValue(final Object value) { this.value = value; } @@ -89,7 +90,7 @@ public Token jjtGetFirstToken() { return firstToken; } - public void jjtSetFirstToken(Token token) { + public void jjtSetFirstToken(final Token token) { this.firstToken = token; } @@ -97,7 +98,7 @@ public Token jjtGetLastToken() { return lastToken; } - public void jjtSetLastToken(Token token) { + public void jjtSetLastToken(final Token token) { this.lastToken = token; } @@ -127,12 +128,15 @@ public Object childrenAccept(SqlParserVisitor visitor, Object data) { */ public String toString() { - StringBuilder result = new StringBuilder(); - toString(null, result); - return result.toString(); + if (cachedStringForm == null) { + final StringBuilder result = new StringBuilder(); + toString(null, result); + cachedStringForm = result.toString(); + } + return cachedStringForm; } - public String toString(String prefix) { + public String toString(final String prefix) { return prefix + this; } @@ -140,7 +144,7 @@ public String toString(String prefix) { * Override this method if you want to customize how the node dumps out its children. */ - public void dump(String prefix) { + public void dump(final String prefix) { System.out.println(toString(prefix)); if (children != null) { for (int i = 0; i < children.length; ++i) { @@ -152,8 +156,8 @@ public void dump(String prefix) { } } - public void toString(Map params, StringBuilder builder) { - throw new UnsupportedOperationException("not implemented in " + getClass().getSimpleName()); + public void toString(final Map params, final StringBuilder builder) { + throw new UnsupportedOperationException("Not implemented in " + getClass().getSimpleName()); } public Object getValue() { diff --git a/engine/src/main/java/com/arcadedb/query/sql/parser/Statement.java b/engine/src/main/java/com/arcadedb/query/sql/parser/Statement.java index bcbd4de272..733e92880b 100755 --- a/engine/src/main/java/com/arcadedb/query/sql/parser/Statement.java +++ b/engine/src/main/java/com/arcadedb/query/sql/parser/Statement.java @@ -34,9 +34,10 @@ public class Statement extends SimpleNode { //only for internal use!!! (caching) - protected String originalStatement; - protected Limit limit = null; - protected Timeout timeout = null; + protected Statement originalStatement; + protected String originalStatementAsString; + protected Limit limit = null; + protected Timeout timeout = null; public static final String CUSTOM_STRICT_SQL = "strictSql"; @@ -162,11 +163,16 @@ public boolean executionPlanCanBeCached() { } public String getOriginalStatement() { - return originalStatement; + if (originalStatementAsString == null) + originalStatementAsString = originalStatement.toString(); + return originalStatementAsString; } - public void setOriginalStatement(String originalStatement) { - this.originalStatement = originalStatement; + public void setOriginalStatement(final Statement originalStatement) { + if (!originalStatement.equals(this.originalStatement)) { + this.originalStatement = originalStatement; + this.originalStatementAsString = null; + } } public Limit getLimit() { diff --git a/engine/src/main/java/com/arcadedb/query/sql/parser/StatementCache.java b/engine/src/main/java/com/arcadedb/query/sql/parser/StatementCache.java index 8aa0096eac..a9167c1be6 100755 --- a/engine/src/main/java/com/arcadedb/query/sql/parser/StatementCache.java +++ b/engine/src/main/java/com/arcadedb/query/sql/parser/StatementCache.java @@ -107,10 +107,11 @@ protected Statement parse(final String statement) throws CommandSQLParsingExcept osql = new SqlParser(db, is); } } - Statement result = osql.parse(); - result.originalStatement = statement; + final Statement result = osql.parse(); + result.originalStatementAsString = statement; return result; + } catch (ParseException e) { throwParsingException(e, statement); } catch (TokenMgrError e2) { diff --git a/engine/src/main/java/com/arcadedb/query/sql/parser/WhileStep.java b/engine/src/main/java/com/arcadedb/query/sql/parser/WhileStep.java index efbd3ddc2d..a7d6e0d846 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/parser/WhileStep.java +++ b/engine/src/main/java/com/arcadedb/query/sql/parser/WhileStep.java @@ -70,7 +70,7 @@ public ScriptExecutionPlan initPlan(final CommandContext ctx) { final ScriptExecutionPlan plan = new ScriptExecutionPlan(subCtx1); for (Statement stm : statements) { if (stm.originalStatement == null) { - stm.originalStatement = stm.toString(); + stm.originalStatement = stm; } InternalExecutionPlan subPlan = stm.createExecutionPlan(subCtx1, profilingEnabled); plan.chain(subPlan, profilingEnabled);