diff --git a/engine/src/main/java/com/arcadedb/database/DatabaseContext.java b/engine/src/main/java/com/arcadedb/database/DatabaseContext.java index 84e66e7cd..d191f2fd8 100644 --- a/engine/src/main/java/com/arcadedb/database/DatabaseContext.java +++ b/engine/src/main/java/com/arcadedb/database/DatabaseContext.java @@ -28,6 +28,8 @@ * Thread local to store transaction data. */ public class DatabaseContext extends ThreadLocal> { + public static final DatabaseContext INSTANCE = new DatabaseContext(); + public DatabaseContextTL init(final DatabaseInternal database) { return init(database, null); } @@ -198,5 +200,4 @@ public void setMaxNested(final int maxNested) { } } - public static final DatabaseContext INSTANCE = new DatabaseContext(); } diff --git a/engine/src/main/java/com/arcadedb/database/LocalDatabase.java b/engine/src/main/java/com/arcadedb/database/LocalDatabase.java index bdb39d73c..f87a9e036 100644 --- a/engine/src/main/java/com/arcadedb/database/LocalDatabase.java +++ b/engine/src/main/java/com/arcadedb/database/LocalDatabase.java @@ -170,10 +170,9 @@ protected LocalDatabase(final String path, final ComponentFile.MODE mode, final queryEngineManager = new QueryEngineManager(); graphEngine = new GraphEngine(this); - } catch (final Exception e) { - if (e instanceof DatabaseOperationException) - throw (DatabaseOperationException) e; - + } catch (DatabaseOperationException e) { + throw e; + } catch (Exception e) { throw new DatabaseOperationException("Error on creating new database instance", e); } } diff --git a/engine/src/main/java/com/arcadedb/query/sql/executor/MultiValue.java b/engine/src/main/java/com/arcadedb/query/sql/executor/MultiValue.java index ab6b0cd85..52c850c3f 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/executor/MultiValue.java +++ b/engine/src/main/java/com/arcadedb/query/sql/executor/MultiValue.java @@ -30,6 +30,7 @@ import java.lang.reflect.*; import java.util.*; import java.util.logging.*; +import java.util.stream.StreamSupport; /** * Handles Multi-value types such as Arrays, Collections and Maps. It recognizes special Arcade collections. @@ -48,8 +49,7 @@ public class MultiValue { */ public static boolean isMultiValue(final Class iType) { return Collection.class.isAssignableFrom(iType) || Map.class.isAssignableFrom(iType) || MultiIterator.class.isAssignableFrom( - iType) || ( - Iterable.class.isAssignableFrom(iType) && !Identifiable.class.isAssignableFrom(iType)) || iType.isArray() + iType) || (Iterable.class.isAssignableFrom(iType) && !Identifiable.class.isAssignableFrom(iType)) || iType.isArray() || ResultSet.class.isAssignableFrom(iType); } @@ -82,23 +82,18 @@ public static int getSize(final Object object) { if (!isMultiValue(object)) return 0; - if (object instanceof Collection) - return ((Collection) object).size(); - else if (object instanceof Map) - return ((Map) object).size(); + if (object instanceof Collection collection) + return collection.size(); + else if (object instanceof Map map) + return map.size(); else if (object.getClass().isArray()) return Array.getLength(object); - else if ((object instanceof ResettableIterator)) - return (int) ((ResettableIterator) object).countEntries(); - else if ((object instanceof Iterable)) { - int i = 0; - for (final Object o : (Iterable) object) { - i++; - } - return i; - } else if ((object instanceof Iterator)) { - return (int) CollectionUtils.countEntries((Iterator) object); - } + else if (object instanceof ResettableIterator resettableIterator) + return (int) resettableIterator.countEntries(); + else if (object instanceof Iterable iterable) + return (int) StreamSupport.stream(iterable.spliterator(), false).count(); + else if (object instanceof Iterator iterator) + return (int) CollectionUtils.countEntries(iterator); return 0; } @@ -114,10 +109,10 @@ public static int getSizeIfAvailable(final Object object) { if (object == null) return 0; - if (object instanceof Collection) - return ((Collection) object).size(); - else if (object instanceof Map) - return ((Map) object).size(); + if (object instanceof Collection collection) + return collection.size(); + else if (object instanceof Map map) + return map.size(); else if (object.getClass().isArray()) return Array.getLength(object); return -1; @@ -141,12 +136,12 @@ public static Object getFirstValue(final Object object) { return null; try { - if (object instanceof List) - return ((List) object).get(0); - else if (object instanceof Iterable) - return ((Iterable) object).iterator().next(); - else if (object instanceof Map) - return ((Map) object).values().iterator().next(); + if (object instanceof List list) + return list.get(0); + else if (object instanceof Iterable iterable) + return iterable.iterator().next(); + else if (object instanceof Map map) + return map.values().iterator().next(); else if (object.getClass().isArray()) return Array.get(object, 0); } catch (final RuntimeException e) { @@ -176,16 +171,16 @@ public static Object getLastValue(final Object object) { return null; try { - if (object instanceof List) - return ((List) object).get(((List) object).size() - 1); - else if (object instanceof Iterable) { + if (object instanceof List list) + return list.get(list.size() - 1); + else if (object instanceof Iterable iterable) { Object last = null; - for (final Object o : (Iterable) object) + for (final Object o : iterable) last = o; return last; - } else if (object instanceof Map) { + } else if (object instanceof Map map) { Object last = null; - for (final Object o : ((Map) object).values()) + for (final Object o : map.values()) last = o; return last; } else if (object.getClass().isArray()) @@ -220,18 +215,18 @@ public static Object getValue(final Object iObject, final int iIndex) { return null; try { - if (iObject instanceof List) - return ((List) iObject).get(iIndex); - else if (iObject instanceof Set) { + if (iObject instanceof List list) + return (list.get(iIndex)); + else if (iObject instanceof Set set) { int i = 0; - for (final Object o : ((Set) iObject)) { + for (final Object o : set) { if (i++ == iIndex) { return o; } } - } else if (iObject instanceof Map) { + } else if (iObject instanceof Map map) { int i = 0; - for (final Object o : ((Map) iObject).values()) { + for (final Object o : map.values()) { if (i++ == iIndex) { return o; } @@ -249,14 +244,14 @@ else if (iObject instanceof Set) { for (int i = 0; it.hasNext(); ++i) { final Object o = it.next(); if (i == iIndex) { - if (it instanceof ResettableIterator) - ((ResettableIterator) it).reset(); + if (it instanceof ResettableIterator resettableIterator) + resettableIterator.reset(); return o; } } - if (it instanceof ResettableIterator) - ((ResettableIterator) it).reset(); + if (it instanceof ResettableIterator resettableIterator) + resettableIterator.reset(); } } } catch (final RuntimeException e) { @@ -268,17 +263,17 @@ else if (iObject instanceof Set) { } /** - * Sets the value of the Multi-value object (array or collection) at iIndex + * Sets the value of the Multi-value object (array or collection) at index * - * @param iObject Multi-value object (array, collection) - * @param iValue The value to set at this specified index. - * @param iIndex integer as the position requested + * @param multiValue Multi-value object (array, collection) + * @param value The value to set at this specified index. + * @param index integer as the position requested */ - public static void setValue(final Object iObject, final Object iValue, final int iIndex) { - if (iObject instanceof List) { - ((List) iObject).set(iIndex, iValue); - } else if (iObject.getClass().isArray()) { - Array.set(iObject, iIndex, iValue); + public static void setValue(final Object multiValue, final Object value, final int index) { + if (multiValue instanceof List list) { + list.set(index, value); + } else if (multiValue.getClass().isArray()) { + Array.set(multiValue, index, value); } else { throw new IllegalArgumentException("Can only set positional indices for Lists and Arrays"); } @@ -289,21 +284,22 @@ public static void setValue(final Object iObject, final Object iValue, final int * * @param iObject Multi-value object (array, collection or map) */ - public static Iterable getMultiValueIterable(final Object iObject) { + public static Iterable getMultiValueIterable(final Object iObject) { if (iObject == null) return null; - if (iObject instanceof Iterable) - return (Iterable) iObject; - else if (iObject instanceof Collection) - return ((Collection) iObject); - else if (iObject instanceof Map) - return ((Map) iObject).values(); + if (iObject instanceof Iterable iterable) + return iterable; + else if (iObject instanceof Collection collection) + return collection; + else if (iObject instanceof Map map) + return map.values(); else if (iObject.getClass().isArray()) return new IterableObjectArray<>(iObject); - else if (iObject instanceof Iterator) { + else if (iObject instanceof Iterator iterator) { + final List temp = new ArrayList<>(); - for (final Iterator it = (Iterator) iObject; it.hasNext(); ) + for (final Iterator it = iterator; it.hasNext(); ) temp.add(it.next()); return temp; } @@ -346,17 +342,17 @@ else if (iObject instanceof Iterator) { * @param iForceConvertRecord allow to force settings to convert RIDs to records while browsing. */ - public static Iterator getMultiValueIterator(final Object iObject, final boolean iForceConvertRecord) { + public static Iterator getMultiValueIterator(final Object iObject, final boolean iForceConvertRecord) { if (iObject == null) return null; - if (iObject instanceof Iterator) - return (Iterator) iObject; + if (iObject instanceof Iterator iterator) + return iterator; - if (iObject instanceof Iterable) - return ((Iterable) iObject).iterator(); - if (iObject instanceof Map) - return ((Map) iObject).values().iterator(); + if (iObject instanceof Iterable iterable) + return iterable.iterator(); + if (iObject instanceof Map map) + return map.values().iterator(); if (iObject.getClass().isArray()) return new IterableObjectArray<>(iObject).iterator(); @@ -369,17 +365,17 @@ public static Iterator getMultiValueIterator(final Object iObject, final * @param iObject Multi-value object (array, collection or map) */ - public static Iterator getMultiValueIterator(final Object iObject) { + public static Iterator getMultiValueIterator(final Object iObject) { if (iObject == null) return null; - if (iObject instanceof Iterator) - return (Iterator) iObject; + if (iObject instanceof Iterator iterator) + return iterator; - if (iObject instanceof Iterable) - return ((Iterable) iObject).iterator(); - if (iObject instanceof Map) - return ((Map) iObject).values().iterator(); + if (iObject instanceof Iterable iterable) + return iterable.iterator(); + if (iObject instanceof Map map) + return map.values().iterator(); if (iObject.getClass().isArray()) return new IterableObjectArray<>(iObject).iterator(); @@ -542,7 +538,7 @@ public static Object remove(Object iObject, Object iToRemove, final boolean iAll if (isMultiValue(o)) remove(coll, o, iAllOccurrences); else - removeFromOCollection(iObject, coll, o, iAllOccurrences); + removeFromCollection(iObject, coll, o, iAllOccurrences); } } else if (iToRemove != null && iToRemove.getClass().isArray()) { // ARRAY - COLLECTION @@ -551,7 +547,7 @@ public static Object remove(Object iObject, Object iToRemove, final boolean iAll if (isMultiValue(o)) remove(coll, o, iAllOccurrences); else - removeFromOCollection(iObject, coll, o, iAllOccurrences); + removeFromCollection(iObject, coll, o, iAllOccurrences); } } else if (iToRemove instanceof Map) { @@ -575,7 +571,7 @@ public static Object remove(Object iObject, Object iToRemove, final boolean iAll } } } else - removeFromOCollection(iObject, coll, iToRemove, iAllOccurrences); + removeFromCollection(iObject, coll, iToRemove, iAllOccurrences); } else if (iObject.getClass().isArray()) { // ARRAY - ? @@ -622,7 +618,7 @@ public static Object remove(Object iObject, Object iToRemove, final boolean iAll return iObject; } - protected static void removeFromOCollection(final Object iObject, final Collection coll, final Object iToRemove, + protected static void removeFromCollection(final Object iObject, final Collection coll, final Object iToRemove, final boolean iAllOccurrences) { if (iAllOccurrences && !(iObject instanceof Set)) { // BROWSE THE COLLECTION ONE BY ONE TO REMOVE ALL THE OCCURRENCES diff --git a/engine/src/main/java/com/arcadedb/query/sql/function/SQLFunctionFactoryTemplate.java b/engine/src/main/java/com/arcadedb/query/sql/function/SQLFunctionFactoryTemplate.java index 3590cf266..9a0efef45 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/function/SQLFunctionFactoryTemplate.java +++ b/engine/src/main/java/com/arcadedb/query/sql/function/SQLFunctionFactoryTemplate.java @@ -62,8 +62,8 @@ public SQLFunction getFunctionInstance(final String name) throws CommandExecutio if (obj == null) return null; - if (obj instanceof SQLFunction) - return (SQLFunction) obj; + if (obj instanceof SQLFunction sqlFunction) + return sqlFunction; else { // it's a class final Class typez = (Class) obj; diff --git a/engine/src/main/java/com/arcadedb/query/sql/function/SQLFunctionReflectionFactory.java b/engine/src/main/java/com/arcadedb/query/sql/function/SQLFunctionReflectionFactory.java index 2d525d265..169dec3b2 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/function/SQLFunctionReflectionFactory.java +++ b/engine/src/main/java/com/arcadedb/query/sql/function/SQLFunctionReflectionFactory.java @@ -40,7 +40,8 @@ public SQLFunctionReflectionFactory(final DefaultSQLFunctionFactory factory) { } public void register(final String prefix, final Class clazz) { - final Map> methodsMap = Arrays.stream(clazz.getMethods()).filter(m -> Modifier.isStatic(m.getModifiers())) + final Map> methodsMap = Arrays.stream(clazz.getMethods()) + .filter(m -> Modifier.isStatic(m.getModifiers())) .collect(Collectors.groupingBy(Method::getName)); for (final Map.Entry> entry : methodsMap.entrySet()) { diff --git a/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionAstar.java b/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionAstar.java index 8ee52a36b..83f86eb21 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionAstar.java +++ b/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionAstar.java @@ -29,7 +29,14 @@ import com.arcadedb.query.sql.executor.Result; import com.arcadedb.utility.FileUtils; -import java.util.*; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.Locale; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; /** * A*'s algorithm describes how to find the cheapest path from one node to another node in a directed weighted graph with husrestic @@ -45,21 +52,22 @@ public class SQLFunctionAstar extends SQLFunctionHeuristicPathFinderAbstract { public static final String NAME = "astar"; - private String paramWeightFieldName = "weight"; - private long currentDepth = 0; - protected final Set closedSet = new HashSet(); - protected final Map cameFrom = new HashMap(); + private String paramWeightFieldName = "weight"; + private long currentDepth = 0; + protected final Set closedSet = new HashSet(); + protected final Map cameFrom = new HashMap(); protected final Map gScore = new HashMap(); protected final Map fScore = new HashMap(); - protected final PriorityQueue open = new PriorityQueue(1, (nodeA, nodeB) -> Double.compare(fScore.get(nodeA), fScore.get(nodeB))); + protected final PriorityQueue open = new PriorityQueue(1, + (nodeA, nodeB) -> Double.compare(fScore.get(nodeA), fScore.get(nodeB))); public SQLFunctionAstar() { super(NAME); } - public LinkedList execute(final Object iThis, final Identifiable iCurrentRecord, final Object iCurrentResult, final Object[] iParams, - final CommandContext iContext) { + public LinkedList execute(final Object iThis, final Identifiable iCurrentRecord, final Object iCurrentResult, + final Object[] iParams, final CommandContext iContext) { context = iContext; final SQLFunctionAstar context = this; @@ -93,20 +101,22 @@ public LinkedList execute(final Object iThis, final Identifiable iCurren if (MultiValue.getSize(dest) > 1) throw new IllegalArgumentException("Only one destinationVertex is allowed"); dest = MultiValue.getFirstValue(dest); - if (dest instanceof Result && ((Result) dest).isElement()) { - dest = ((Result) dest).getElement().get(); + if (dest instanceof Result result && result.isElement()) { + dest = result.getElement().get(); } } + if (record != null) + dest = record.get((String) dest); if (record != null) dest = record.get((String) dest); - if (dest instanceof Identifiable) { - final Document elem = (Document) ((Identifiable) dest).getRecord(); - if (!(elem instanceof Vertex)) + if (dest instanceof Identifiable identifiable) { + final Document elem = (Document) identifiable.getRecord(); + if (!(elem instanceof Vertex vertex)) { throw new IllegalArgumentException("The destinationVertex must be a vertex record"); - - paramDestinationVertex = (Vertex) elem; + } + paramDestinationVertex = vertex; } else { throw new IllegalArgumentException("The destinationVertex must be a vertex record"); } @@ -232,7 +242,8 @@ private void bindAdditionalParams(final Object additionalParams, final SQLFuncti context.paramVertexAxisNames = stringArray(mapParams.get(SQLFunctionAstar.PARAM_VERTEX_AXIS_NAMES)); if (mapParams.get(SQLFunctionAstar.PARAM_DIRECTION) != null) { if (mapParams.get(SQLFunctionAstar.PARAM_DIRECTION) instanceof String) { - context.paramDirection = Vertex.DIRECTION.valueOf(stringOrDefault(mapParams.get(SQLFunctionAstar.PARAM_DIRECTION), "OUT").toUpperCase(Locale.ENGLISH)); + context.paramDirection = Vertex.DIRECTION.valueOf( + stringOrDefault(mapParams.get(SQLFunctionAstar.PARAM_DIRECTION), "OUT").toUpperCase(Locale.ENGLISH)); } else { context.paramDirection = (Vertex.DIRECTION) mapParams.get(SQLFunctionAstar.PARAM_DIRECTION); } @@ -240,7 +251,8 @@ private void bindAdditionalParams(final Object additionalParams, final SQLFuncti context.paramParallel = booleanOrDefault(mapParams.get(SQLFunctionAstar.PARAM_PARALLEL), false); context.paramMaxDepth = longOrDefault(mapParams.get(SQLFunctionAstar.PARAM_MAX_DEPTH), context.paramMaxDepth); - context.paramEmptyIfMaxDepth = booleanOrDefault(mapParams.get(SQLFunctionAstar.PARAM_EMPTY_IF_MAX_DEPTH), context.paramEmptyIfMaxDepth); + context.paramEmptyIfMaxDepth = booleanOrDefault(mapParams.get(SQLFunctionAstar.PARAM_EMPTY_IF_MAX_DEPTH), + context.paramEmptyIfMaxDepth); context.paramTieBreaker = booleanOrDefault(mapParams.get(SQLFunctionAstar.PARAM_TIE_BREAKER), context.paramTieBreaker); context.paramDFactor = doubleOrDefault(mapParams.get(SQLFunctionAstar.PARAM_D_FACTOR), context.paramDFactor); if (mapParams.get(SQLFunctionAstar.PARAM_HEURISTIC_FORMULA) != null) { diff --git a/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionDijkstra.java b/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionDijkstra.java index 02c2b9263..ff47e06fd 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionDijkstra.java +++ b/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionDijkstra.java @@ -22,7 +22,9 @@ import com.arcadedb.graph.Vertex; import com.arcadedb.query.sql.executor.CommandContext; -import java.util.*; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; /** * Dijkstra's algorithm describes how to find the cheapest path from one node to another node in a directed weighted graph. @@ -41,20 +43,20 @@ public SQLFunctionDijkstra() { super(NAME); } - public LinkedList execute(final Object iThis, final Identifiable iCurrentRecord, final Object iCurrentResult, final Object[] iParams, - final CommandContext iContext) { - return new SQLFunctionAstar().execute(this, iCurrentRecord, iCurrentResult, toAStarParams(iParams), iContext); + public LinkedList execute(final Object thisObj, final Identifiable currentRecord, final Object currentResult, + final Object[] params, final CommandContext context) { + return new SQLFunctionAstar().execute(thisObj, currentRecord, currentResult, toAStarParams(params), context); } - private Object[] toAStarParams(final Object[] iParams) { + private Object[] toAStarParams(final Object[] params) { final Object[] result = new Object[4]; - result[0] = iParams[0]; - result[1] = iParams[1]; - result[2] = iParams[2]; - final Map options = new HashMap(); + result[0] = params[0]; + result[1] = params[1]; + result[2] = params[2]; + final Map options = new HashMap<>(); options.put("emptyIfMaxDepth", true); - if (iParams.length > 3) { - options.put("direction", iParams[3]); + if (params.length > 3) { + options.put("direction", params[3]); } result[3] = options; return result; diff --git a/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionMove.java b/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionMove.java index bd3f1a25e..63b04365a 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionMove.java +++ b/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionMove.java @@ -29,7 +29,7 @@ import com.arcadedb.query.sql.function.SQLFunctionConfigurableAbstract; import com.arcadedb.utility.FileUtils; -import java.util.*; +import java.util.ArrayList; /** * Created by luigidellaquila on 03/01/17. @@ -45,45 +45,48 @@ public String getSyntax() { return "Syntax error: " + name + "([])"; } - public Object execute(final Object iThis, final Identifiable iCurrentRecord, final Object iCurrentResult, final Object[] iParameters, - final CommandContext iContext) { + public Object execute(final Object iThis, final Identifiable iCurrentRecord, final Object iCurrentResult, + final Object[] iParameters, final CommandContext iContext) { final String[] labels; if (iParameters != null && iParameters.length > 0 && iParameters[0] != null) - labels = MultiValue.array(iParameters, String.class, iArgument -> FileUtils.getStringContent(iArgument)); + labels = MultiValue.array(iParameters, String.class, FileUtils::getStringContent); else labels = null; return SQLQueryEngine.foreachRecord(iArgument -> move(iContext.getDatabase(), iArgument, labels), iThis, iContext); } - protected Object v2v(final Database graph, final Identifiable iRecord, final Vertex.DIRECTION iDirection, final String[] iLabels) { + protected Object v2v(final Database graph, final Identifiable iRecord, final Vertex.DIRECTION iDirection, + final String[] iLabels) { if (iRecord != null) { final Document rec = (Document) iRecord.getRecord(); - if (rec instanceof Vertex) - return ((Vertex) rec).getVertices(iDirection, iLabels); + if (rec instanceof Vertex vertex) + return vertex.getVertices(iDirection, iLabels); } return null; } - protected Object v2e(final Database graph, final Identifiable iRecord, final Vertex.DIRECTION iDirection, final String[] iLabels) { + protected Object v2e(final Database graph, final Identifiable iRecord, final Vertex.DIRECTION iDirection, + final String[] iLabels) { final Document rec = (Document) iRecord.getRecord(); - if (rec instanceof Vertex) - return ((Vertex) rec).getEdges(iDirection, iLabels); + if (rec instanceof Vertex vertex) + return vertex.getEdges(iDirection, iLabels); return null; } - protected Object e2v(final Database graph, final Identifiable iRecord, final Vertex.DIRECTION iDirection, final String[] iLabels) { + protected Object e2v(final Database graph, final Identifiable iRecord, final Vertex.DIRECTION iDirection, + final String[] iLabels) { final Document rec = (Document) iRecord.getRecord(); - if (rec instanceof Edge) { + if (rec instanceof Edge edge) { if (iDirection == Vertex.DIRECTION.BOTH) { - final List results = new ArrayList(); - results.add(((Edge) rec).getOutVertex()); - results.add(((Edge) rec).getInVertex()); + var results = new ArrayList(); + results.add(edge.getOutVertex()); + results.add(edge.getInVertex()); return results; } - return ((Edge) rec).getVertex(iDirection); + return edge.getVertex(iDirection); } return null; diff --git a/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionMoveFiltered.java b/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionMoveFiltered.java index 998b0cf79..b04f86b61 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionMoveFiltered.java +++ b/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionMoveFiltered.java @@ -38,15 +38,16 @@ protected SQLFunctionMoveFiltered(final String name) { } @Override - public Object execute(final Object iThis, final Identifiable iCurrentRecord, final Object iCurrentResult, final Object[] iParameters, - final Iterable iPossibleResults, final CommandContext iContext) { + public Object execute(final Object iThis, final Identifiable iCurrentRecord, final Object iCurrentResult, + final Object[] iParameters, final Iterable iPossibleResults, final CommandContext iContext) { final String[] labels; if (iParameters != null && iParameters.length > 0 && iParameters[0] != null) - labels = MultiValue.array(iParameters, String.class, iArgument -> FileUtils.getStringContent(iArgument)); + labels = MultiValue.array(iParameters, String.class, FileUtils::getStringContent); else labels = null; - return SQLQueryEngine.foreachRecord(iArgument -> move(iContext.getDatabase(), iArgument, labels, iPossibleResults), iThis, iContext); + return SQLQueryEngine.foreachRecord(iArgument -> move(iContext.getDatabase(), iArgument, labels, iPossibleResults), iThis, + iContext); } protected abstract Object move(Database graph, Identifiable iArgument, String[] labels, Iterable iPossibleResults); diff --git a/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionPathFinder.java b/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionPathFinder.java index f76117858..f3e3b9066 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionPathFinder.java +++ b/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionPathFinder.java @@ -23,7 +23,12 @@ import com.arcadedb.query.sql.executor.CommandContext; import com.arcadedb.query.sql.function.math.SQLFunctionMathAbstract; -import java.util.*; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Map; +import java.util.Set; /** * Abstract class to find paths between nodes. @@ -35,7 +40,7 @@ public abstract class SQLFunctionPathFinder extends SQLFunctionMathAbstract { protected Map predecessors; protected Map distance; - protected Vertex paramSourceVertex; + protected Vertex paramSourceVertex; protected Vertex paramDestinationVertex; protected final Vertex.DIRECTION paramDirection = Vertex.DIRECTION.OUT; protected CommandContext context; @@ -48,9 +53,9 @@ public SQLFunctionPathFinder(final String iName) { protected LinkedList execute(final CommandContext iContext) { context = iContext; - unSettledNodes = new HashSet(); - distance = new HashMap(); - predecessors = new HashMap(); + unSettledNodes = new HashSet<>(); + distance = new HashMap<>(); + predecessors = new HashMap<>(); distance.put(paramSourceVertex.getIdentity(), MIN); unSettledNodes.add(paramSourceVertex); diff --git a/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionShortestPath.java b/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionShortestPath.java index 745bd6aa8..d55c179cf 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionShortestPath.java +++ b/engine/src/main/java/com/arcadedb/query/sql/function/graph/SQLFunctionShortestPath.java @@ -32,7 +32,15 @@ import com.arcadedb.utility.MultiIterator; import com.arcadedb.utility.Pair; -import java.util.*; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; /** * Shortest path algorithm to find the shortest path from one node to another node in a directed graph. @@ -47,7 +55,7 @@ public SQLFunctionShortestPath() { super(NAME); } - private static class OShortestPathContext { + private static class ShortestPathContext { Vertex sourceVertex; Vertex destinationVertex; Vertex.DIRECTION directionLeft = Vertex.DIRECTION.BOTH; @@ -59,14 +67,14 @@ private static class OShortestPathContext { ArrayDeque queueLeft = new ArrayDeque<>(); ArrayDeque queueRight = new ArrayDeque<>(); - final Set leftVisited = new HashSet(); - final Set rightVisited = new HashSet(); - - final Map previouses = new HashMap(); - final Map nexts = new HashMap(); + final Set leftVisited = new HashSet<>(); + final Set rightVisited = new HashSet<>(); + final Map previouses = new HashMap<>(); + final Map nexts = new HashMap<>(); Vertex current; Vertex currentRight; + public Integer maxDepth; /** * option that decides whether or not to return the edge information @@ -74,99 +82,98 @@ private static class OShortestPathContext { public Boolean edge; } - public List execute(final Object iThis, final Identifiable iCurrentRecord, final Object iCurrentResult, final Object[] iParams, - final CommandContext iContext) { + public List execute(final Object iThis, final Identifiable currentRecord, final Object currentResult, final Object[] params, + final CommandContext context) { - final OShortestPathContext context = new OShortestPathContext(); + final ShortestPathContext shortestPathContext = new ShortestPathContext(); - Object source = iParams[0]; + Object source = params[0]; if (MultiValue.isMultiValue(source)) { if (MultiValue.getSize(source) > 1) throw new IllegalArgumentException("Only one sourceVertex is allowed"); source = MultiValue.getFirstValue(source); - if (source instanceof Result && ((Result) source).isElement()) { - source = ((Result) source).getElement().get(); + if (source instanceof Result result && result.isElement()) { + source = result.getElement().get(); } } // source = record.get((String) source); - if (source instanceof Identifiable) { - final Document elem = (Document) ((Identifiable) source).getRecord(); + if (source instanceof Identifiable identifiable) { + final Document elem = (Document) identifiable.getRecord(); if (!(elem instanceof Vertex)) throw new IllegalArgumentException("The sourceVertex must be a vertex record"); - context.sourceVertex = (Vertex) elem; + shortestPathContext.sourceVertex = (Vertex) elem; } else { throw new IllegalArgumentException("The sourceVertex must be a vertex record"); } - Object dest = iParams[1]; + Object dest = params[1]; if (MultiValue.isMultiValue(dest)) { if (MultiValue.getSize(dest) > 1) throw new IllegalArgumentException("Only one destinationVertex is allowed"); dest = MultiValue.getFirstValue(dest); - if (dest instanceof Result && ((Result) dest).isElement()) { - dest = ((Result) dest).getElement().get(); + if (dest instanceof Result result && result.isElement()) { + dest = result.getElement().get(); } } // dest = record.get((String) dest); - if (dest instanceof Identifiable) { - final Document elem = (Document) ((Identifiable) dest).getRecord(); - if (!(elem instanceof Vertex)) + if (dest instanceof Identifiable identifiable1) { + final Document elem = (Document) identifiable1.getRecord(); + if (!(elem instanceof Vertex vertex)) throw new IllegalArgumentException("The destinationVertex must be a vertex record"); - context.destinationVertex = (Vertex) elem; + shortestPathContext.destinationVertex = vertex; } else { throw new IllegalArgumentException("The destinationVertex must be a vertex record"); } - if (context.sourceVertex.equals(context.destinationVertex)) { - final List result = new ArrayList(1); - result.add(context.destinationVertex.getIdentity()); + if (shortestPathContext.sourceVertex.equals(shortestPathContext.destinationVertex)) { + final List result = new ArrayList<>(1); + result.add(shortestPathContext.destinationVertex.getIdentity()); return result; } - if (iParams.length > 2 && iParams[2] != null) { - context.directionLeft = Vertex.DIRECTION.valueOf(iParams[2].toString().toUpperCase(Locale.ENGLISH)); + if (params.length > 2 && params[2] != null) { + shortestPathContext.directionLeft = Vertex.DIRECTION.valueOf(params[2].toString().toUpperCase(Locale.ENGLISH)); } - if (context.directionLeft == Vertex.DIRECTION.OUT) { - context.directionRight = Vertex.DIRECTION.IN; - } else if (context.directionLeft == Vertex.DIRECTION.IN) { - context.directionRight = Vertex.DIRECTION.OUT; + if (shortestPathContext.directionLeft == Vertex.DIRECTION.OUT) { + shortestPathContext.directionRight = Vertex.DIRECTION.IN; + } else if (shortestPathContext.directionLeft == Vertex.DIRECTION.IN) { + shortestPathContext.directionRight = Vertex.DIRECTION.OUT; } - context.edgeType = null; - if (iParams.length > 3) { - context.edgeType = iParams[3] == null ? null : "" + iParams[3]; + shortestPathContext.edgeType = null; + if (params.length > 3) { + shortestPathContext.edgeType = params[3] == null ? null : "" + params[3]; } - context.edgeTypeParam = null; - if (iParams.length > 3 && iParams[3] != null) { - if (iParams[3] instanceof List) { - final List list = (List) iParams[3]; - context.edgeTypeParam = list.toArray(new String[list.size()]); + shortestPathContext.edgeTypeParam = null; + if (params.length > 3 && params[3] != null) { + if (params[3] instanceof List list) { + shortestPathContext.edgeTypeParam = list.toArray(new String[0]); } else - context.edgeTypeParam = new String[] { context.edgeType }; + shortestPathContext.edgeTypeParam = new String[] { shortestPathContext.edgeType }; } - if (iParams.length > 4) { - bindAdditionalParams(iParams[4], context); + if (params.length > 4) { + bindAdditionalParams(params[4], shortestPathContext); } - context.queueLeft.add(context.sourceVertex); - context.leftVisited.add(context.sourceVertex.getIdentity()); + shortestPathContext.queueLeft.add(shortestPathContext.sourceVertex); + shortestPathContext.leftVisited.add(shortestPathContext.sourceVertex.getIdentity()); - context.queueRight.add(context.destinationVertex); - context.rightVisited.add(context.destinationVertex.getIdentity()); + shortestPathContext.queueRight.add(shortestPathContext.destinationVertex); + shortestPathContext.rightVisited.add(shortestPathContext.destinationVertex.getIdentity()); int depth = 1; while (true) { - if (context.maxDepth != null && context.maxDepth <= depth) { + if (shortestPathContext.maxDepth != null && shortestPathContext.maxDepth <= depth) { break; } - if (context.queueLeft.isEmpty() || context.queueRight.isEmpty()) + if (shortestPathContext.queueLeft.isEmpty() || shortestPathContext.queueRight.isEmpty()) break; if (Thread.interrupted()) @@ -174,57 +181,57 @@ public List execute(final Object iThis, final Identifiable iCurrentRecord, List neighborIdentity; - if (context.queueLeft.size() <= context.queueRight.size()) { + if (shortestPathContext.queueLeft.size() <= shortestPathContext.queueRight.size()) { // START EVALUATING FROM LEFT - neighborIdentity = walkLeft(context); + neighborIdentity = walkLeft(shortestPathContext); if (neighborIdentity != null) return neighborIdentity; depth++; - if (context.maxDepth != null && context.maxDepth <= depth) { + if (shortestPathContext.maxDepth != null && shortestPathContext.maxDepth <= depth) { break; } - if (context.queueLeft.isEmpty()) + if (shortestPathContext.queueLeft.isEmpty()) break; - neighborIdentity = walkRight(context); + neighborIdentity = walkRight(shortestPathContext); if (neighborIdentity != null) return neighborIdentity; } else { // START EVALUATING FROM RIGHT - neighborIdentity = walkRight(context); + neighborIdentity = walkRight(shortestPathContext); if (neighborIdentity != null) return neighborIdentity; depth++; - if (context.maxDepth != null && context.maxDepth <= depth) { + if (shortestPathContext.maxDepth != null && shortestPathContext.maxDepth <= depth) { break; } - if (context.queueRight.isEmpty()) + if (shortestPathContext.queueRight.isEmpty()) break; - neighborIdentity = walkLeft(context); + neighborIdentity = walkLeft(shortestPathContext); if (neighborIdentity != null) return neighborIdentity; } depth++; } - return new ArrayList(); + return new ArrayList<>(); } - private void bindAdditionalParams(final Object additionalParams, final OShortestPathContext context) { + private void bindAdditionalParams(final Object additionalParams, final ShortestPathContext context) { if (additionalParams == null) return; Map mapParams = null; - if (additionalParams instanceof Map) - mapParams = (Map) additionalParams; - else if (additionalParams instanceof Identifiable) - mapParams = ((Document) ((Identifiable) additionalParams).getRecord()).toMap(); + if (additionalParams instanceof Map map) + mapParams = map; + else if (additionalParams instanceof Identifiable identifiable) + mapParams = identifiable.getRecord().asDocument().toMap(); if (mapParams != null) { context.maxDepth = integer(mapParams.get("maxDepth")); @@ -237,12 +244,12 @@ private Integer integer(final Object fromObject) { if (fromObject == null) return null; - if (fromObject instanceof Number) - return ((Number) fromObject).intValue(); + if (fromObject instanceof Number number) + return number.intValue(); - if (fromObject instanceof String) { + if (fromObject instanceof String string) { try { - return Integer.parseInt(fromObject.toString()); + return Integer.parseInt(string); } catch (final NumberFormatException ignore) { } } @@ -258,12 +265,12 @@ private Boolean toBoolean(final Object fromObject) { if (fromObject == null) return null; - if (fromObject instanceof Boolean) - return (Boolean) fromObject; + if (fromObject instanceof Boolean bool) + return bool; - if (fromObject instanceof String) { + if (fromObject instanceof String string) { try { - return Boolean.parseBoolean(fromObject.toString()); + return Boolean.parseBoolean(string); } catch (final NumberFormatException ignore) { } } @@ -281,7 +288,8 @@ private Boolean toBoolean(final Object fromObject) { * * @author Thomas Young (YJJThomasYoung@hotmail.com) */ - private Pair, Iterable> getVerticesAndEdges(final Vertex srcVertex, final Vertex.DIRECTION direction, final String... types) { + private Pair, Iterable> getVerticesAndEdges(final Vertex srcVertex, final Vertex.DIRECTION direction, + final String... types) { if (direction == Vertex.DIRECTION.BOTH) { final MultiIterator vertexIterator = new MultiIterator<>(); final MultiIterator edgeIterator = new MultiIterator<>(); @@ -317,7 +325,7 @@ public String getSyntax() { return "shortestPath(, , [, [ ]])"; } - protected List walkLeft(final SQLFunctionShortestPath.OShortestPathContext context) { + protected List walkLeft(final ShortestPathContext context) { final ArrayDeque nextLevelQueue = new ArrayDeque<>(); if (!Boolean.TRUE.equals(context.edge)) { while (!context.queueLeft.isEmpty()) { @@ -330,8 +338,7 @@ protected List walkLeft(final SQLFunctionShortestPath.OShortestPathContext neighbors = context.current.getVertices(context.directionLeft, context.edgeTypeParam); } for (final Vertex neighbor : neighbors) { - final Vertex v = neighbor; - final RID neighborIdentity = v.getIdentity(); + final RID neighborIdentity = neighbor.getIdentity(); if (context.rightVisited.contains(neighborIdentity)) { context.previouses.put(neighborIdentity, context.current.getIdentity()); @@ -340,7 +347,7 @@ protected List walkLeft(final SQLFunctionShortestPath.OShortestPathContext if (!context.leftVisited.contains(neighborIdentity)) { context.previouses.put(neighborIdentity, context.current.getIdentity()); - nextLevelQueue.offer(v); + nextLevelQueue.offer(neighbor); context.leftVisited.add(neighborIdentity); } @@ -382,7 +389,7 @@ protected List walkLeft(final SQLFunctionShortestPath.OShortestPathContext return null; } - protected List walkRight(final SQLFunctionShortestPath.OShortestPathContext context) { + protected List walkRight(final ShortestPathContext context) { final ArrayDeque nextLevelQueue = new ArrayDeque<>(); if (!Boolean.TRUE.equals(context.edge)) { while (!context.queueRight.isEmpty()) { @@ -395,8 +402,7 @@ protected List walkRight(final SQLFunctionShortestPath.OShortestPathContext neighbors = context.currentRight.getVertices(context.directionRight, context.edgeTypeParam); } for (final Vertex neighbor : neighbors) { - final Vertex v = neighbor; - final RID neighborIdentity = v.getIdentity(); + final RID neighborIdentity = neighbor.getIdentity(); if (context.leftVisited.contains(neighborIdentity)) { context.nexts.put(neighborIdentity, context.currentRight.getIdentity()); @@ -406,7 +412,7 @@ protected List walkRight(final SQLFunctionShortestPath.OShortestPathContext context.nexts.put(neighborIdentity, context.currentRight.getIdentity()); - nextLevelQueue.offer(v); + nextLevelQueue.offer(neighbor); context.rightVisited.add(neighborIdentity); } diff --git a/engine/src/main/java/com/arcadedb/query/sql/function/misc/SQLFunctionUUID.java b/engine/src/main/java/com/arcadedb/query/sql/function/misc/SQLFunctionUUID.java index 1104dd364..2011fbd6b 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/function/misc/SQLFunctionUUID.java +++ b/engine/src/main/java/com/arcadedb/query/sql/function/misc/SQLFunctionUUID.java @@ -22,7 +22,7 @@ import com.arcadedb.query.sql.executor.CommandContext; import com.arcadedb.query.sql.function.SQLFunctionAbstract; -import java.util.*; +import java.util.UUID; /** * Generates a UUID as a 128-bits value using the Leach-Salz variant. For more information look at: @@ -45,17 +45,8 @@ public Object execute(final Object iThis, final Identifiable iCurrentRecord, fin return UUID.randomUUID().toString(); } - @Override - public boolean aggregateResults() { - return false; - } - public String getSyntax() { return "uuid()"; } - @Override - public Object getResult() { - return null; - } } diff --git a/engine/src/main/java/com/arcadedb/query/sql/function/misc/SQLFunctionVersion.java b/engine/src/main/java/com/arcadedb/query/sql/function/misc/SQLFunctionVersion.java index 513835b38..a3e69ec61 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/function/misc/SQLFunctionVersion.java +++ b/engine/src/main/java/com/arcadedb/query/sql/function/misc/SQLFunctionVersion.java @@ -23,8 +23,6 @@ import com.arcadedb.query.sql.executor.CommandContext; import com.arcadedb.query.sql.function.SQLFunctionAbstract; -import java.util.*; - /** * Generates a UUID as a 128-bits value using the Leach-Salz variant. For more information look at: * http://docs.oracle.com/javase/6/docs/api/java/util/UUID.html. @@ -46,17 +44,8 @@ public Object execute(final Object iThis, final Identifiable iCurrentRecord, fin return Constants.getVersion(); } - @Override - public boolean aggregateResults() { - return false; - } - public String getSyntax() { return "version()"; } - @Override - public Object getResult() { - return null; - } } diff --git a/engine/src/main/java/com/arcadedb/query/sql/function/time/SQLFunctionDuration.java b/engine/src/main/java/com/arcadedb/query/sql/function/time/SQLFunctionDuration.java index 2a5fd853b..f4319a13f 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/function/time/SQLFunctionDuration.java +++ b/engine/src/main/java/com/arcadedb/query/sql/function/time/SQLFunctionDuration.java @@ -25,7 +25,7 @@ import com.arcadedb.query.sql.function.SQLFunctionAbstract; import com.arcadedb.utility.DateUtils; -import java.time.*; +import java.time.Duration; /** * Returns a java.time.Duration. @@ -43,20 +43,23 @@ public SQLFunctionDuration() { super(NAME); } - public Object execute(final Object iThis, final Identifiable iCurrentRecord, final Object iCurrentResult, final Object[] iParams, - final CommandContext iContext) { - if (iParams.length != 2) + public Object execute(final Object thisObject, final Identifiable currentRecord, final Object currentResult, + final Object[] params, final CommandContext context) { + if (params.length != 2) throw new IllegalArgumentException("duration() function expected 2 parameters: amount and time-unit"); - long amount; - if (iParams[0] instanceof Number) - amount = ((Number) iParams[0]).longValue(); - else if (iParams[0] instanceof String) - amount = Long.parseLong(iParams[0].toString()); - else - throw new IllegalArgumentException("amount '" + iParams[0] + "' not a number or a string"); + long amount = getAmount(params[0]); + + return Duration.of(amount, DateUtils.parsePrecision(params[1].toString())); + } - return Duration.of(amount, DateUtils.parsePrecision(iParams[1].toString())); + private static long getAmount(Object param) { + if (param instanceof Number number) + return number.longValue(); + else if (param instanceof String string) + return Long.parseLong(string); + else + throw new IllegalArgumentException("amount '" + param + "' not a number or a string"); } public String getSyntax() { diff --git a/engine/src/main/java/com/arcadedb/query/sql/function/time/SQLFunctionSysdate.java b/engine/src/main/java/com/arcadedb/query/sql/function/time/SQLFunctionSysdate.java index 1f25e1029..cfa0fbda8 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/function/time/SQLFunctionSysdate.java +++ b/engine/src/main/java/com/arcadedb/query/sql/function/time/SQLFunctionSysdate.java @@ -25,7 +25,8 @@ import com.arcadedb.query.sql.function.SQLFunctionAbstract; import com.arcadedb.utility.DateUtils; -import java.time.*; +import java.time.LocalDateTime; +import java.time.ZoneId; /** * Returns the current date time. If the `zoneid` parameter is passed, then a ZonedDateTime instance is returned, otherwise a LocalDateTime. @@ -43,17 +44,17 @@ public SQLFunctionSysdate() { super(NAME); } - public Object execute(final Object iThis, final Identifiable iCurrentRecord, final Object iCurrentResult, final Object[] iParams, - final CommandContext iContext) { + public Object execute(final Object thisObject, final Identifiable currentRecord, final Object currentResult, + final Object[] params, final CommandContext context) { final LocalDateTime now = LocalDateTime.now(); Object result = now; - if (iParams.length > 0) { - if (iParams.length > 1) - result = now.atZone(ZoneId.of(iParams[1].toString())); + if (params.length > 0) { + if (params.length > 1) + result = now.atZone(ZoneId.of(params[1].toString())); } - return DateUtils.getDate(result, iContext.getDatabase().getSerializer().getDateTimeImplementation()); + return DateUtils.getDate(result, context.getDatabase().getSerializer().getDateTimeImplementation()); } public String getSyntax() { diff --git a/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodField.java b/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodField.java index d0b2f2624..775240589 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodField.java +++ b/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodField.java @@ -36,14 +36,15 @@ public SQLMethodField() { } @Override - public Object execute(final Object value, final Identifiable iCurrentRecord, final CommandContext iContext, final Object[] iParams) { + public Object execute(final Object value, final Identifiable iCurrentRecord, final CommandContext iContext, + final Object[] iParams) { if (iParams[0] == null) return null; final String field = iParams[0].toString(); - if (value instanceof Identifiable) { - final Document doc = (Document) ((Identifiable) value).getRecord(); + if (value instanceof Identifiable identifiable) { + final Document doc = (Document) identifiable.getRecord(); return doc.get(field); } diff --git a/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodJoin.java b/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodJoin.java index 89f748536..e1c61c068 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodJoin.java +++ b/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodJoin.java @@ -18,48 +18,40 @@ */ package com.arcadedb.query.sql.method.collection; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - import com.arcadedb.database.Identifiable; import com.arcadedb.query.sql.executor.CommandContext; import com.arcadedb.query.sql.method.AbstractSQLMethod; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + /** * Joins a list of objects using a delimiter. */ public class SQLMethodJoin extends AbstractSQLMethod { - public static final String NAME = "join"; + public static final String NAME = "join"; - public SQLMethodJoin() { - super(NAME, 1); - } + public SQLMethodJoin() { + super(NAME, 1); + } - @Override - public Object execute(final Object value, - final Identifiable record, - final CommandContext context, - final Object[] params) { + @Override + public Object execute(final Object value, final Identifiable record, final CommandContext context, final Object[] params) { - if (value == null) { - return null; - } + if (value == null) { + return null; + } - if (value instanceof List) { + if (value instanceof List list) { - final String separator = Optional.ofNullable(params) - .filter(p -> p.length > 0) - .filter(p -> p[0] != null) - .map(p -> p[0].toString()) - .orElse(","); + final String separator = Optional.ofNullable(params).filter(p -> p.length > 0).filter(p -> p[0] != null) + .map(p -> p[0].toString()).orElse(","); - return ((List) value).stream() - .map(Object::toString) - .collect(Collectors.joining(separator)); + return list.stream().map(Object::toString).collect(Collectors.joining(separator)); - } else - return value.toString(); - } + } else + return value.toString(); + } } diff --git a/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodKeys.java b/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodKeys.java index 76feed4c7..6725fd5cb 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodKeys.java +++ b/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodKeys.java @@ -24,7 +24,10 @@ import com.arcadedb.query.sql.executor.Result; import com.arcadedb.query.sql.method.AbstractSQLMethod; -import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; /** * @author Johann Sorel (Geomatys) @@ -40,22 +43,19 @@ public SQLMethodKeys() { @Override public Object execute(final Object value, final Identifiable iCurrentRecord, final CommandContext iContext, final Object[] iParams) { - if (value instanceof Map) - return ((Map) value).keySet(); + if (value instanceof Map map) + return map.keySet(); - if (value instanceof Document) - return Collections.singletonList(((Document) value).getPropertyNames()); + if (value instanceof Document document) + return Collections.singletonList(document.getPropertyNames()); - if (value instanceof Result) { - final Result res = (Result) value; - return res.getPropertyNames(); + if (value instanceof Result result) { + return result.getPropertyNames(); } - if (value instanceof Collection) { - final List result = new ArrayList<>(); - for (final Object o : (Collection) value) { - result.addAll((Collection) execute(value, iCurrentRecord, iContext, iParams)); - } + if (value instanceof Collection collection) { + final List result = collection.stream() + .flatMap(o -> ((Collection) execute(o, iCurrentRecord, iContext, iParams)).stream()).toList(); return result; } return null; diff --git a/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodRemove.java b/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodRemove.java index 263ed6b16..73f92069a 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodRemove.java +++ b/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodRemove.java @@ -41,8 +41,8 @@ public SQLMethodRemove() { public Object execute(Object value, final Identifiable currentRecord, final CommandContext context, final Object[] params) { if (params != null && params.length > 0 && params[0] != null) { final Object[] arguments = MultiValue.array(params, Object.class, argument -> { - if (argument instanceof String && ((String) argument).startsWith("$")) { - return context.getVariable((String) argument); + if (argument instanceof String string && string.startsWith("$")) { + return context.getVariable(string); } return argument; }); diff --git a/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodRemoveAll.java b/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodRemoveAll.java index f8c04f524..772cbe88b 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodRemoveAll.java +++ b/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodRemoveAll.java @@ -41,9 +41,8 @@ public SQLMethodRemoveAll() { public Object execute(Object value, final Identifiable currentRecord, final CommandContext context, final Object[] params) { if (params != null && params.length > 0 && params[0] != null) { final Object[] arguments = MultiValue.array(params, Object.class, iArgument -> { - if (iArgument instanceof String && - ((String) iArgument).startsWith("$")) { - return context.getVariable((String) iArgument); + if (iArgument instanceof String string && string.startsWith("$")) { + return context.getVariable(string); } return iArgument; }); diff --git a/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodSort.java b/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodSort.java index 9d5e00e3d..9134f4b9c 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodSort.java +++ b/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodSort.java @@ -23,7 +23,8 @@ import com.arcadedb.query.sql.method.AbstractSQLMethod; import com.arcadedb.serializer.BinaryComparator; -import java.util.*; +import java.util.ArrayList; +import java.util.List; /** * @author Christian Himpe @@ -41,9 +42,9 @@ public SQLMethodSort() { public Object execute(final Object value, final Identifiable iCurrentRecord, final CommandContext iContext, final Object[] iParams) { - if (value != null && value instanceof List) { - List result = new ArrayList((List) value); - if (iParams != null && iParams.length > 0 && iParams[0] != null && iParams[0] instanceof Boolean && !((Boolean) iParams[0])) + if (value != null && value instanceof List list) { + List result = new ArrayList(list); + if (iParams != null && iParams.length > 0 && iParams[0] != null && iParams[0] instanceof Boolean bool && !bool) result.sort((left, right) -> BinaryComparator.compareTo(right, left)); else result.sort((left, right) -> BinaryComparator.compareTo(left, right)); diff --git a/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodTransform.java b/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodTransform.java index 2d5c92a29..d5dc82873 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodTransform.java +++ b/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodTransform.java @@ -28,7 +28,10 @@ import com.arcadedb.query.sql.method.AbstractSQLMethod; import com.arcadedb.query.sql.method.DefaultSQLMethodFactory; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; /** * Transform the element in a collections or map. @@ -50,11 +53,13 @@ public String getSyntax() { } @Override - public Object execute(final Object value, final Identifiable iCurrentRecord, final CommandContext iContext, final Object[] iParams) { + public Object execute(final Object value, final Identifiable iCurrentRecord, final CommandContext iContext, + final Object[] iParams) { if (value == null || iParams == null || iParams.length == 0) return null; - final DefaultSQLMethodFactory methodFactory = ((SQLQueryEngine) iContext.getDatabase().getQueryEngine("SQL")).getMethodFactory(); + final DefaultSQLMethodFactory methodFactory = ((SQLQueryEngine) iContext.getDatabase() + .getQueryEngine("SQL")).getMethodFactory(); final List transformers = new ArrayList<>(iParams.length); for (Object o : iParams) { if (o == null) @@ -62,9 +67,9 @@ public Object execute(final Object value, final Identifiable iCurrentRecord, fin transformers.add(methodFactory.createMethod(o.toString())); } - if (value instanceof List) { - final List newList = new ArrayList<>(((List) value).size()); - for (Object o : (List) value) { + if (value instanceof List list) { + final List newList = new ArrayList<>(list.size()); + for (Object o : list) { Object transformed = o; for (SQLMethod m : transformers) @@ -73,9 +78,9 @@ public Object execute(final Object value, final Identifiable iCurrentRecord, fin newList.add(transformed); } return newList; - } else if (value instanceof Set) { - final Set newSet = new HashSet<>(((Set) value).size()); - for (Object o : (Set) value) { + } else if (value instanceof Set set) { + final Set newSet = new HashSet<>(set.size()); + for (Object o : set) { Object transformed = o; for (SQLMethod m : transformers) diff --git a/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodValues.java b/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodValues.java index d14818a2a..54d1bb9ce 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodValues.java +++ b/engine/src/main/java/com/arcadedb/query/sql/method/collection/SQLMethodValues.java @@ -24,7 +24,8 @@ import com.arcadedb.query.sql.executor.Result; import com.arcadedb.query.sql.method.AbstractSQLMethod; -import java.util.*; +import java.util.List; +import java.util.Map; /** * Returns the values of a map. @@ -40,15 +41,16 @@ public SQLMethodValues() { } @Override - public Object execute(final Object value, final Identifiable iCurrentRecord, final CommandContext iContext, final Object[] iParams) { - if (value instanceof Map) - return ((Map) value).values(); - else if (value instanceof Document) - return List.of(((Document) value).toMap().values()); - else if (value instanceof Result) { - final Result res = (Result) value; - return res.toMap().values(); - } + public Object execute(final Object value, final Identifiable iCurrentRecord, final CommandContext iContext, + final Object[] iParams) { + + if (value instanceof Map map) + return map.values(); + else if (value instanceof Document document) + return List.of(document.toMap().values()); + else if (value instanceof Result result) + return result.toMap().values(); + return null; } } diff --git a/engine/src/main/java/com/arcadedb/query/sql/method/conversion/SQLMethodAsBoolean.java b/engine/src/main/java/com/arcadedb/query/sql/method/conversion/SQLMethodAsBoolean.java index b5bf2fcc0..5efd9cf22 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/method/conversion/SQLMethodAsBoolean.java +++ b/engine/src/main/java/com/arcadedb/query/sql/method/conversion/SQLMethodAsBoolean.java @@ -35,16 +35,15 @@ public SQLMethodAsBoolean() { } @Override - public Object execute(final Object value, final Identifiable currentRecord, final CommandContext context, - final Object[] params) { + public Object execute(final Object value, final Identifiable currentRecord, final CommandContext context, final Object[] params) { if (value == null) return null; if (value instanceof Boolean) return value; - if (value instanceof String) - return Boolean.valueOf(((String) value).trim()); - else if (value instanceof Number) - return ((Number) value).intValue() != 0; + if (value instanceof String string) + return Boolean.valueOf(string.trim()); + else if (value instanceof Number number) + return number.intValue() != 0; return Boolean.FALSE; } } diff --git a/engine/src/main/java/com/arcadedb/query/sql/method/conversion/SQLMethodAsByte.java b/engine/src/main/java/com/arcadedb/query/sql/method/conversion/SQLMethodAsByte.java index 564934efb..f22b0388b 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/method/conversion/SQLMethodAsByte.java +++ b/engine/src/main/java/com/arcadedb/query/sql/method/conversion/SQLMethodAsByte.java @@ -38,8 +38,8 @@ public SQLMethodAsByte() { @Override public Object execute(final Object value, final Identifiable iCurrentRecord, final CommandContext iContext, final Object[] iParams) { - if (value instanceof Number) - return ((Number) value).byteValue(); + if (value instanceof Number number) + return number.byteValue(); return value != null ? Byte.valueOf(value.toString().trim()) : null; } } diff --git a/engine/src/main/java/com/arcadedb/query/sql/method/conversion/SQLMethodAsDate.java b/engine/src/main/java/com/arcadedb/query/sql/method/conversion/SQLMethodAsDate.java index 22527c232..d11fb9849 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/method/conversion/SQLMethodAsDate.java +++ b/engine/src/main/java/com/arcadedb/query/sql/method/conversion/SQLMethodAsDate.java @@ -25,7 +25,7 @@ import com.arcadedb.query.sql.method.AbstractSQLMethod; import com.arcadedb.utility.DateUtils; -import java.util.*; +import java.util.Date; /** * Transforms a value to date. If the conversion is not possible, null is returned. @@ -47,16 +47,17 @@ public String getSyntax() { } @Override - public Object execute(final Object value, final Identifiable iCurrentRecord, final CommandContext context, final Object[] iParams) { + public Object execute(final Object value, final Identifiable currentRecord, final CommandContext context, final Object[] params) { if (value == null) return null; if (value instanceof Date) return value; - else if (value instanceof Number) - return new Date(((Number) value).longValue()); + else if (value instanceof Number number) + return new Date(number.longValue()); - final String format = iParams.length > 0 ? iParams[0].toString() : context.getDatabase().getSchema().getDateFormat(); - return DateUtils.getDate(DateUtils.parse(value.toString(), format), context.getDatabase().getSerializer().getDateImplementation()); + final String format = params.length > 0 ? params[0].toString() : context.getDatabase().getSchema().getDateFormat(); + return DateUtils.getDate(DateUtils.parse(value.toString(), format), + context.getDatabase().getSerializer().getDateImplementation()); } } diff --git a/engine/src/main/java/com/arcadedb/query/sql/method/conversion/SQLMethodAsDateTime.java b/engine/src/main/java/com/arcadedb/query/sql/method/conversion/SQLMethodAsDateTime.java index 0b0c001ad..163fcec35 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/method/conversion/SQLMethodAsDateTime.java +++ b/engine/src/main/java/com/arcadedb/query/sql/method/conversion/SQLMethodAsDateTime.java @@ -25,7 +25,7 @@ import com.arcadedb.query.sql.method.AbstractSQLMethod; import com.arcadedb.utility.DateUtils; -import java.util.*; +import java.util.Date; /** * Transforms a value to datetime. If the conversion is not possible, null is returned. @@ -47,14 +47,15 @@ public String getSyntax() { } @Override - public Object execute(final Object value, final Identifiable iCurrentRecord, final CommandContext context, final Object[] iParams) { + public Object execute(final Object value, final Identifiable iCurrentRecord, final CommandContext context, + final Object[] iParams) { if (value == null) return null; if (value instanceof Date) return value; - else if (value instanceof Number) - return new Date(((Number) value).longValue()); + else if (value instanceof Number number) + return new Date(number.longValue()); final String format = iParams.length > 0 ? iParams[0].toString() : context.getDatabase().getSchema().getDateTimeFormat(); final Object date = DateUtils.parse(value.toString(), format); diff --git a/engine/src/main/java/com/arcadedb/query/sql/method/misc/SQLMethodPrecision.java b/engine/src/main/java/com/arcadedb/query/sql/method/misc/SQLMethodPrecision.java index 8af8c6b33..3d54cbc41 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/method/misc/SQLMethodPrecision.java +++ b/engine/src/main/java/com/arcadedb/query/sql/method/misc/SQLMethodPrecision.java @@ -24,9 +24,14 @@ import com.arcadedb.query.sql.method.AbstractSQLMethod; import com.arcadedb.utility.DateUtils; -import java.time.*; -import java.time.temporal.*; -import java.util.*; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Calendar; +import java.util.Date; + +import static java.time.temporal.ChronoUnit.MILLIS; /** * Modifies the precision of a datetime. @@ -42,26 +47,27 @@ public SQLMethodPrecision() { } @Override - public Object execute(final Object value, final Identifiable iCurrentRecord, final CommandContext iContext, final Object[] iParams) { + public Object execute(final Object value, final Identifiable iCurrentRecord, final CommandContext iContext, + final Object[] iParams) { if (iParams == null || iParams.length == 0 || iParams[0] == null) throw new IllegalArgumentException("precision method was expecting the time unit"); final ChronoUnit targetPrecision = DateUtils.parsePrecision(iParams[0].toString()); - if (value instanceof LocalDateTime) - return ((LocalDateTime) value).truncatedTo(targetPrecision); - else if (value instanceof ZonedDateTime) - return ((ZonedDateTime) value).truncatedTo(targetPrecision); - else if (value instanceof Instant) - return ((Instant) value).truncatedTo(targetPrecision); - else if (value instanceof Date) { - if (targetPrecision == ChronoUnit.MILLIS) - return value; - return DateUtils.dateTime(iContext.getDatabase(), ((Date) value).getTime(), ChronoUnit.MILLIS, LocalDateTime.class, targetPrecision); - } else if (value instanceof Calendar) { - if (targetPrecision == ChronoUnit.MILLIS) + if (value instanceof LocalDateTime localDateTime) + return localDateTime.truncatedTo(targetPrecision); + else if (value instanceof ZonedDateTime zonedDateTime) + return zonedDateTime.truncatedTo(targetPrecision); + else if (value instanceof Instant instant) + return instant.truncatedTo(targetPrecision); + else if (value instanceof Date date) { + if (targetPrecision == MILLIS) return value; - return DateUtils.dateTime(iContext.getDatabase(), ((Calendar) value).getTimeInMillis(), ChronoUnit.MILLIS, LocalDateTime.class, targetPrecision); + return DateUtils.dateTime(iContext.getDatabase(), date.getTime(), MILLIS, LocalDateTime.class, targetPrecision); + } else if (value instanceof Calendar calendar) { + if (targetPrecision == MILLIS) + return calendar; + return DateUtils.dateTime(iContext.getDatabase(), calendar.getTimeInMillis(), MILLIS, LocalDateTime.class, targetPrecision); } throw new CommandExecutionException("Error on changing precision for unsupported type '" + value.getClass() + "'"); diff --git a/engine/src/main/java/com/arcadedb/query/sql/method/string/SQLMethodFormat.java b/engine/src/main/java/com/arcadedb/query/sql/method/string/SQLMethodFormat.java index 9e26b631e..ff8f3f9f1 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/method/string/SQLMethodFormat.java +++ b/engine/src/main/java/com/arcadedb/query/sql/method/string/SQLMethodFormat.java @@ -24,7 +24,9 @@ import com.arcadedb.query.sql.method.AbstractSQLMethod; import com.arcadedb.utility.DateUtils; -import java.util.*; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; /** * @author Johann Sorel (Geomatys) @@ -52,7 +54,7 @@ public Object execute(final Object value, final Identifiable iRecord, final Comm if (isCollectionOfDates(value)) { final List result = new ArrayList(); - final Iterator iterator = MultiValue.getMultiValueIterator(value); + final Iterator iterator = MultiValue.getMultiValueIterator(value); while (iterator.hasNext()) result.add(DateUtils.format(iterator.next(), format)); @@ -67,7 +69,7 @@ public Object execute(final Object value, final Identifiable iRecord, final Comm private boolean isCollectionOfDates(final Object value) { if (MultiValue.isMultiValue(value)) { - final Iterator iterator = MultiValue.getMultiValueIterator(value); + final Iterator iterator = MultiValue.getMultiValueIterator(value); while (iterator.hasNext()) { final Object item = iterator.next(); if (item != null && !DateUtils.isDate(item)) { diff --git a/engine/src/main/java/com/arcadedb/query/sql/parser/AndBlock.java b/engine/src/main/java/com/arcadedb/query/sql/parser/AndBlock.java index 991faeb23..635ed056b 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/parser/AndBlock.java +++ b/engine/src/main/java/com/arcadedb/query/sql/parser/AndBlock.java @@ -25,7 +25,9 @@ import com.arcadedb.query.sql.executor.Result; import com.arcadedb.schema.DocumentType; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; public class AndBlock extends BooleanExpression { final List subBlocks; @@ -39,13 +41,13 @@ public AndBlock(final List... expressions) { super(-1); int total = 0; - for (int i = 0; i < expressions.length; i++) - total += expressions[i].size(); + for (List expression : expressions) + total += expression.size(); this.subBlocks = new ArrayList<>(total); - for (int i = 0; i < expressions.length; i++) - subBlocks.addAll(expressions[i]); + for (List expression : expressions) + subBlocks.addAll(expression); } @Override @@ -81,7 +83,7 @@ public List getSubBlocks() { } public void toString(final Map params, final StringBuilder builder) { - if (subBlocks == null || subBlocks.size() == 0) + if (subBlocks == null || subBlocks.isEmpty()) return; boolean first = true; @@ -101,11 +103,11 @@ public List getIndexedFunctionConditions(final DocumentType iSc final List result = new ArrayList<>(); for (final BooleanExpression exp : subBlocks) { final List sub = exp.getIndexedFunctionConditions(iSchemaClass, context); - if (sub != null && sub.size() > 0) { + if (sub != null && !sub.isEmpty()) { result.addAll(sub); } } - return result.size() == 0 ? null : result; + return result.isEmpty() ? null : result; } public List flatten() { diff --git a/engine/src/main/java/com/arcadedb/query/sql/parser/ArrayConcatExpression.java b/engine/src/main/java/com/arcadedb/query/sql/parser/ArrayConcatExpression.java index 750f2c7f2..649426b33 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/parser/ArrayConcatExpression.java +++ b/engine/src/main/java/com/arcadedb/query/sql/parser/ArrayConcatExpression.java @@ -27,7 +27,11 @@ import com.arcadedb.query.sql.executor.MultiValue; import com.arcadedb.query.sql.executor.Result; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Map; public class ArrayConcatExpression extends SimpleNode { @@ -69,7 +73,7 @@ public Object apply(final Object left, final Object right) { final List result = new ArrayList<>(); if (MultiValue.isMultiValue(left)) { - final Iterator leftIter = MultiValue.getMultiValueIterator(left); + final Iterator leftIter = MultiValue.getMultiValueIterator(left); while (leftIter.hasNext()) { result.add(leftIter.next()); } @@ -78,7 +82,7 @@ public Object apply(final Object left, final Object right) { } if (MultiValue.isMultiValue(right)) { - final Iterator rightIter = MultiValue.getMultiValueIterator(right); + final Iterator rightIter = MultiValue.getMultiValueIterator(right); while (rightIter.hasNext()) { result.add(rightIter.next()); } diff --git a/engine/src/main/java/com/arcadedb/query/sql/parser/ArraySingleValuesSelector.java b/engine/src/main/java/com/arcadedb/query/sql/parser/ArraySingleValuesSelector.java index 0d55ede34..0c10790fa 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/parser/ArraySingleValuesSelector.java +++ b/engine/src/main/java/com/arcadedb/query/sql/parser/ArraySingleValuesSelector.java @@ -27,8 +27,12 @@ import com.arcadedb.query.sql.executor.Result; import com.arcadedb.query.sql.executor.ResultInternal; -import java.util.*; -import java.util.stream.*; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; public class ArraySingleValuesSelector extends SimpleNode { @@ -65,7 +69,7 @@ public Object execute(final Identifiable iCurrentRecord, final Object iResult, f } else if (iResult instanceof Result && index instanceof String) { result.add(((Result) iResult).getProperty((String) index)); } else if (MultiValue.isMultiValue(iResult)) { - final Iterator iter = MultiValue.getMultiValueIterator(iResult); + final Iterator iter = MultiValue.getMultiValueIterator(iResult); while (iter.hasNext()) { result.add(calculateValue(iter.next(), index)); } @@ -97,7 +101,7 @@ public Object execute(final Result iCurrentRecord, final Object iResult, final C } else if (iResult instanceof Result && index instanceof String) { result.add(((Result) iResult).getProperty((String) index)); } else if (MultiValue.isMultiValue(iResult)) { - final Iterator iter = MultiValue.getMultiValueIterator(iResult); + final Iterator iter = MultiValue.getMultiValueIterator(iResult); while (iter.hasNext()) { result.add(calculateValue(iter.next(), index)); } @@ -121,7 +125,7 @@ private Object calculateValue(final Object item, final Object index) { } else if (item instanceof Result && index instanceof String) { return ((Result) item).getProperty((String) index); } else if (MultiValue.isMultiValue(item)) { - final Iterator iter = MultiValue.getMultiValueIterator(item); + final Iterator iter = MultiValue.getMultiValueIterator(item); final List result = new ArrayList<>(); while (iter.hasNext()) { result.add(calculateValue(iter.next(), index)); @@ -198,7 +202,8 @@ public void applyRemove(final Object currentValue, final ResultInternal original ((ResultInternal) currentValue).removeProperty("" + val); } } else { - throw new CommandExecutionException("Trying to remove elements from " + currentValue + " (" + currentValue.getClass().getSimpleName() + ")"); + throw new CommandExecutionException( + "Trying to remove elements from " + currentValue + " (" + currentValue.getClass().getSimpleName() + ")"); } } diff --git a/engine/src/main/java/com/arcadedb/query/sql/parser/ContainsAllCondition.java b/engine/src/main/java/com/arcadedb/query/sql/parser/ContainsAllCondition.java index 81f15a2a3..b29aa2685 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/parser/ContainsAllCondition.java +++ b/engine/src/main/java/com/arcadedb/query/sql/parser/ContainsAllCondition.java @@ -26,7 +26,12 @@ import com.arcadedb.query.sql.executor.Result; import com.arcadedb.query.sql.executor.ResultInternal; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Map; public class ContainsAllCondition extends BooleanExpression { protected Expression left; @@ -93,7 +98,7 @@ public Boolean evaluate(final Identifiable currentRecord, final CommandContext c if (!MultiValue.isMultiValue(leftValue)) return false; - final Iterator iter = MultiValue.getMultiValueIterator(leftValue); + final Iterator iter = MultiValue.getMultiValueIterator(leftValue); while (iter.hasNext()) { final Object item = iter.next(); if (item instanceof Identifiable) { @@ -122,7 +127,7 @@ public Boolean evaluate(final Result currentRecord, final CommandContext context if (!MultiValue.isMultiValue(leftValue)) return false; - final Iterator iter = MultiValue.getMultiValueIterator(leftValue); + final Iterator iter = MultiValue.getMultiValueIterator(leftValue); while (iter.hasNext()) { final Object item = iter.next(); if (item instanceof Identifiable) { diff --git a/engine/src/main/java/com/arcadedb/query/sql/parser/ContainsAnyCondition.java b/engine/src/main/java/com/arcadedb/query/sql/parser/ContainsAnyCondition.java index 3bd5ef696..b5be562fb 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/parser/ContainsAnyCondition.java +++ b/engine/src/main/java/com/arcadedb/query/sql/parser/ContainsAnyCondition.java @@ -27,7 +27,12 @@ import com.arcadedb.query.sql.executor.Result; import com.arcadedb.query.sql.executor.ResultInternal; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Map; public class ContainsAnyCondition extends BooleanExpression { protected Expression left; @@ -85,7 +90,7 @@ public Boolean evaluate(final Identifiable currentRecord, final CommandContext c if (!MultiValue.isMultiValue(leftValue)) return false; - final Iterator iter = MultiValue.getMultiValueIterator(leftValue); + final Iterator iter = MultiValue.getMultiValueIterator(leftValue); while (iter.hasNext()) { final Object item = iter.next(); if (item instanceof Identifiable) { @@ -111,7 +116,7 @@ public Boolean evaluate(final Result currentRecord, final CommandContext context if (!MultiValue.isMultiValue(leftValue)) return false; - final Iterator iter = MultiValue.getMultiValueIterator(leftValue); + final Iterator iter = MultiValue.getMultiValueIterator(leftValue); while (iter.hasNext()) { final Object item = iter.next(); if (item instanceof Identifiable) { diff --git a/engine/src/main/java/com/arcadedb/query/sql/parser/ContainsCondition.java b/engine/src/main/java/com/arcadedb/query/sql/parser/ContainsCondition.java index 5ff872428..996204552 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/parser/ContainsCondition.java +++ b/engine/src/main/java/com/arcadedb/query/sql/parser/ContainsCondition.java @@ -28,7 +28,12 @@ import com.arcadedb.query.sql.executor.Result; import com.arcadedb.query.sql.executor.ResultInternal; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Map; public class ContainsCondition extends BooleanExpression { @@ -136,7 +141,7 @@ public Boolean evaluate(final Identifiable currentRecord, final CommandContext c if (!MultiValue.isMultiValue(leftValue)) return false; - final Iterator iter = MultiValue.getMultiValueIterator(leftValue); + final Iterator iter = MultiValue.getMultiValueIterator(leftValue); while (iter.hasNext()) { final Object item = iter.next(); if (item instanceof Identifiable && condition.evaluate((Identifiable) item, context)) @@ -160,7 +165,7 @@ public Boolean evaluate(final Result currentRecord, final CommandContext context if (!MultiValue.isMultiValue(leftValue)) return false; - final Iterator iter = MultiValue.getMultiValueIterator(leftValue); + final Iterator iter = MultiValue.getMultiValueIterator(leftValue); while (iter.hasNext()) { final Object item = iter.next(); if (item instanceof Identifiable && condition.evaluate((Identifiable) item, context)) diff --git a/engine/src/main/java/com/arcadedb/utility/DateUtils.java b/engine/src/main/java/com/arcadedb/utility/DateUtils.java index 2ba77632c..e7ddd4882 100755 --- a/engine/src/main/java/com/arcadedb/utility/DateUtils.java +++ b/engine/src/main/java/com/arcadedb/utility/DateUtils.java @@ -23,11 +23,22 @@ import com.arcadedb.schema.Type; import com.arcadedb.serializer.BinaryTypes; -import java.time.*; -import java.time.format.*; -import java.time.temporal.*; -import java.util.*; -import java.util.concurrent.*; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.time.temporal.ChronoField; +import java.time.temporal.ChronoUnit; +import java.time.temporal.TemporalAccessor; +import java.util.Calendar; +import java.util.Date; +import java.util.Locale; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; public class DateUtils { public static final String DATE_TIME_ISO_8601_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZ"; @@ -190,30 +201,19 @@ else if (value instanceof String) { } public static ChronoUnit parsePrecision(final String precision) { - switch (precision) { - case "year": - return ChronoUnit.YEARS; - case "month": - return ChronoUnit.MONTHS; - case "week": - return ChronoUnit.WEEKS; - case "day": - return ChronoUnit.DAYS; - case "hour": - return ChronoUnit.HOURS; - case "minute": - return ChronoUnit.MINUTES; - case "second": - return ChronoUnit.SECONDS; - case "millisecond": - return ChronoUnit.MILLIS; - case "microsecond": - return ChronoUnit.MICROS; - case "nanosecond": - return ChronoUnit.NANOS; - default: - throw new SerializationException("Unsupported datetime precision '" + precision + "'"); - } + return switch (precision.toLowerCase(Locale.ENGLISH)) { + case "year", "years" -> ChronoUnit.YEARS; + case "month", "months" -> ChronoUnit.MONTHS; + case "week", "weeks" -> ChronoUnit.WEEKS; + case "day", "days" -> ChronoUnit.DAYS; + case "hour", "hours" -> ChronoUnit.HOURS; + case "minute", "minutes" -> ChronoUnit.MINUTES; + case "second", "seconds" -> ChronoUnit.SECONDS; + case "millisecond", "milliseconds", "millis" -> ChronoUnit.MILLIS; + case "microsecond", "microseconds", "micros" -> ChronoUnit.MICROS; + case "nanosecond", "nanoseconds", "nanos" -> ChronoUnit.NANOS; + default -> throw new SerializationException("Unsupported datetime precision '" + precision + "'"); + }; } public static ChronoUnit getPrecision(final int nanos) { diff --git a/engine/src/test/java/com/arcadedb/TestHelper.java b/engine/src/test/java/com/arcadedb/TestHelper.java index 1ccda4d57..6e682a30f 100644 --- a/engine/src/test/java/com/arcadedb/TestHelper.java +++ b/engine/src/test/java/com/arcadedb/TestHelper.java @@ -30,12 +30,13 @@ import com.arcadedb.utility.FileUtils; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; - import org.junit.jupiter.api.BeforeEach; -import java.io.*; -import java.util.*; -import java.util.logging.*; +import java.io.File; +import java.util.Collection; +import java.util.Random; +import java.util.UUID; +import java.util.logging.Level; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; @@ -74,7 +75,33 @@ protected boolean isCheckingDatabaseIntegrity() { } public static void executeInNewDatabase(final DatabaseTest callback) throws Exception { - try (final DatabaseFactory factory = new DatabaseFactory("./target/databases/" + UUID.randomUUID())) { + executeInNewDatabase(UUID.randomUUID().toString(), callback); +// try (final DatabaseFactory factory = new DatabaseFactory("./target/databases/" + UUID.randomUUID())) { +// if (factory.exists()) { +// factory.open().drop(); +// assertThat(DatabaseFactory.getActiveDatabaseInstance(factory.getDatabasePath())).isNull(); +// } +// +// final Database database = factory.create(); +// assertThat(DatabaseFactory.getActiveDatabaseInstance(factory.getDatabasePath())).isEqualTo(database); +// try { +// database.begin(); +// callback.call(database); +// database.commit(); +// } finally { +// if (database.isTransactionActive()) +// database.rollback(); +// database.drop(); +// } +// } + } + + public static DocumentType createRandomType(final Database database) { + return database.getSchema().createDocumentType("RandomType" + new Random().nextInt(100_000)); + } + + public static void executeInNewDatabase(final String testName, final DatabaseTest callback) throws Exception { + try (final DatabaseFactory factory = new DatabaseFactory("./target/databases" + testName)) { if (factory.exists()) { factory.open().drop(); assertThat(DatabaseFactory.getActiveDatabaseInstance(factory.getDatabasePath())).isNull(); @@ -94,26 +121,6 @@ public static void executeInNewDatabase(final DatabaseTest callback) t } } - public static DocumentType createRandomType(final Database database) { - return database.getSchema().createDocumentType("RandomType" + new Random().nextInt(100_000)); - } - - public static void executeInNewDatabase(final String testName, final DatabaseTest callback) throws Exception { - try (final DatabaseFactory factory = new DatabaseFactory("./target/" + testName)) { - if (factory.exists()) - factory.open().drop(); - - final DatabaseInternal database = (DatabaseInternal) factory.create(); - assertThat(DatabaseFactory.getActiveDatabaseInstance(factory.getDatabasePath())).isEqualTo(database); - try { - callback.call(database); - } finally { - database.drop(); - assertThat(DatabaseFactory.getActiveDatabaseInstance(database.getDatabasePath())).isNull(); - } - } - } - public static Database createDatabase(final String databaseName) { return dropDatabase(databaseName).create(); } diff --git a/engine/src/test/java/com/arcadedb/index/LSMTreeIndexTest.java b/engine/src/test/java/com/arcadedb/index/LSMTreeIndexTest.java index f16d9f817..5abfb49e7 100644 --- a/engine/src/test/java/com/arcadedb/index/LSMTreeIndexTest.java +++ b/engine/src/test/java/com/arcadedb/index/LSMTreeIndexTest.java @@ -18,7 +18,6 @@ */ package com.arcadedb.index; -import com.arcadedb.GlobalConfiguration; import com.arcadedb.TestHelper; import com.arcadedb.database.Document; import com.arcadedb.database.Identifiable; @@ -31,13 +30,19 @@ import com.arcadedb.query.sql.executor.ResultSet; import com.arcadedb.schema.DocumentType; import com.arcadedb.schema.Schema; - import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import java.util.*; -import java.util.concurrent.atomic.*; -import java.util.logging.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; +import java.util.logging.Level; import static org.assertj.core.api.Assertions.assertThat; @@ -217,9 +222,7 @@ public void testRemoveKeys() { } } - assertThat(found) - .withFailMessage("Key '" + Arrays.toString(key) + "' found " + found + " times") - .isEqualTo(1); + assertThat(found).withFailMessage("Key '" + Arrays.toString(key) + "' found " + found + " times").isEqualTo(1); } assertThat(total).isEqualTo(TOT); @@ -229,9 +232,8 @@ public void testRemoveKeys() { for (final Index index : indexes) { if (index instanceof TypeIndex) continue; - assertThat(index.get(new Object[] { i }).hasNext()) - .withFailMessage("Found item with key " + i + " inside the TX by using get()") - .isFalse(); + assertThat(index.get(new Object[] { i }).hasNext()).withFailMessage( + "Found item with key " + i + " inside the TX by using get()").isFalse(); } } @@ -255,9 +257,8 @@ public void testRemoveKeys() { for (final Index index : indexes) { if (index instanceof TypeIndex) continue; - assertThat(index.get(new Object[] { i }).hasNext()) - .withFailMessage("Found item with key " + i + " after the TX was committed") - .isFalse(); + assertThat(index.get(new Object[] { i }).hasNext()).withFailMessage( + "Found item with key " + i + " after the TX was committed").isFalse(); } } @@ -269,9 +270,8 @@ public void testRemoveKeys() { final IndexCursor cursor = ((RangeIndex) index).range(true, new Object[] { i }, true, new Object[] { i }, true); - assertThat(cursor.hasNext() && cursor.next() != null) - .withFailMessage("Found item with key " + i + " after the TX was committed by using range()") - .isFalse(); + assertThat(cursor.hasNext() && cursor.next() != null).withFailMessage( + "Found item with key " + i + " after the TX was committed by using range()").isFalse(); } } }, true, 0); @@ -302,9 +302,7 @@ public void testRemoveEntries() { } } - assertThat(found) - .withFailMessage("Key '" + Arrays.toString(key) + "' found " + found + " times") - .isEqualTo(1); + assertThat(found).withFailMessage("Key '" + Arrays.toString(key) + "' found " + found + " times").isEqualTo(1); } assertThat(total).isEqualTo(TOT); @@ -340,9 +338,8 @@ public void testRemoveEntries() { if (index instanceof TypeIndex) continue; - assertThat(index.get(new Object[] { i }).hasNext()) - .withFailMessage("Found item with key " + i + " after the TX was committed") - .isFalse(); + assertThat(index.get(new Object[] { i }).hasNext()).withFailMessage( + "Found item with key " + i + " after the TX was committed").isFalse(); } } @@ -354,9 +351,8 @@ public void testRemoveEntries() { final IndexCursor cursor = ((RangeIndex) index).range(true, new Object[] { i }, true, new Object[] { i }, true); - assertThat(cursor.hasNext() && cursor.next() != null) - .withFailMessage("Found item with key " + i + " after the TX was committed by using range()") - .isFalse(); + assertThat(cursor.hasNext() && cursor.next() != null).withFailMessage( + "Found item with key " + i + " after the TX was committed by using range()").isFalse(); } } }, true, 0); @@ -509,8 +505,8 @@ public void testUpdateKeys() { int total = 0; final ResultSet resultSet = database.query("sql", "select from " + TYPE_NAME); - for (final ResultSet it = resultSet; it.hasNext(); ) { - final Result r = it.next(); + while (resultSet.hasNext()) { + final Result r = resultSet.next(); assertThat(r.getElement().get().get("id")).isNotNull(); @@ -1063,8 +1059,8 @@ public void run() { if (threadInserted % 1000 == 0) LogManager.instance() .log(this, Level.INFO, "%s Thread %d inserted record %s, total %d records with key %d (total=%d)", null, - getClass(), - Thread.currentThread().getId(), v.getIdentity(), i, threadInserted, crossThreadsInserted.get()); + getClass(), Thread.currentThread().getId(), v.getIdentity(), i, threadInserted, + crossThreadsInserted.get()); keyPresent = true; @@ -1116,8 +1112,7 @@ public void run() { LogManager.instance() .log(this, Level.INFO, "%s Completed (inserted=%d needRetryExceptions=%d duplicatedExceptions=%d)", null, getClass(), - crossThreadsInserted.get(), - needRetryExceptions.get(), duplicatedExceptions.get()); + crossThreadsInserted.get(), needRetryExceptions.get(), duplicatedExceptions.get()); if (total != crossThreadsInserted.get()) { LogManager.instance().log(this, Level.INFO, "DUMP OF INSERTED RECORDS (ORDERED BY ID)"); diff --git a/engine/src/test/java/com/arcadedb/query/sql/executor/AlterTypeExecutionTest.java b/engine/src/test/java/com/arcadedb/query/sql/executor/AlterTypeExecutionTest.java index dbb4cf2f9..af176f69c 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/executor/AlterTypeExecutionTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/executor/AlterTypeExecutionTest.java @@ -21,11 +21,12 @@ import com.arcadedb.TestHelper; import com.arcadedb.database.bucketselectionstrategy.BucketSelectionStrategy; import com.arcadedb.database.bucketselectionstrategy.PartitionedBucketSelectionStrategy; +import com.arcadedb.schema.DocumentType; import com.arcadedb.serializer.json.JSONObject; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import java.util.stream.*; +import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; @@ -43,10 +44,10 @@ public void sqlAlterTypeInheritanceUsing() { database.command("sql", "ALTER TYPE Car SUPERTYPE +Vehicle"); assertThat(database.getSchema().getType("Car").getSuperTypes().size()).isEqualTo(1); - assertThat(database.getSchema().getType("Car").getSuperTypes().stream().map(x -> x.getName()).collect(Collectors.toSet()) + assertThat(database.getSchema().getType("Car").getSuperTypes().stream().map(DocumentType::getName).collect(Collectors.toSet()) .contains("Vehicle")).isTrue(); assertThat(database.getSchema().getType("Vehicle").getSubTypes().size()).isEqualTo(1); - assertThat(database.getSchema().getType("Vehicle").getSubTypes().stream().map(x -> x.getName()).collect(Collectors.toSet()) + assertThat(database.getSchema().getType("Vehicle").getSubTypes().stream().map(DocumentType::getName).toList() .contains("Car")).isTrue(); assertThat(database.getSchema().getType("Vehicle").isSuperTypeOf("Car")).isTrue(); @@ -57,7 +58,7 @@ public void sqlAlterTypeInheritanceUsing() { assertThat(database.getSchema().getType("Suv").getSuperTypes().size()).isEqualTo(1); assertThat(database.getSchema().getType("Car").isSuperTypeOf("Suv")).isTrue(); assertThat(database.getSchema().getType("Car").getSubTypes().size()).isEqualTo(1); - assertThat(database.getSchema().getType("Car").getSubTypes().stream().map(x -> x.getName()).collect(Collectors.toSet()) + assertThat(database.getSchema().getType("Car").getSubTypes().stream().map(DocumentType::getName).collect(Collectors.toSet()) .contains("Suv")).isTrue(); assertThat(database.getSchema().getType("Car").isSuperTypeOf("Suv")).isTrue(); @@ -71,7 +72,7 @@ public void sqlAlterTypeInheritanceUsing() { assertThat(database.getSchema().getType("Vehicle").isSuperTypeOf("Suv")).isTrue(); assertThat(database.getSchema().getType("Car").getSubTypes().size()).isEqualTo(1); assertThat(database.getSchema().getType("Vehicle").getSubTypes().size()).isEqualTo(1); - assertThat(database.getSchema().getType("Car").getSubTypes().stream().map(x -> x.getName()).collect(Collectors.toSet()) + assertThat(database.getSchema().getType("Car").getSubTypes().stream().map(DocumentType::getName).collect(Collectors.toSet()) .contains("Suv")).isTrue(); assertThat(database.getSchema().getType("Car").isSuperTypeOf("Suv")).isTrue(); assertThat(database.getSchema().getType("Vehicle").isSuperTypeOf("Suv")).isTrue(); @@ -116,17 +117,12 @@ public void sqlAlterTypeName() { database.command("sql", "CREATE INDEX ON Mpv(engine_number) UNIQUE"); database.begin(); - database.getSchema().getType("Mpv").newRecord() - .set("vehicle_model", "Blista Compact") - .set("engine_number", "456") - .save(); + database.getSchema().getType("Mpv").newRecord().set("vehicle_model", "Blista Compact").set("engine_number", "456").save(); database.commit(); Assertions.assertThrows(Exception.class, () -> { database.begin(); - database.getSchema().getType("Mpv").newRecord() - .set("vehicle_model", "Maibatsu Monstrosity") - .set("engine_number", "456") + database.getSchema().getType("Mpv").newRecord().set("vehicle_model", "Maibatsu Monstrosity").set("engine_number", "456") .save(); database.commit(); }); @@ -138,19 +134,13 @@ public void sqlAlterTypeName() { Assertions.assertFalse(result.stream().anyMatch(x -> x.getProperty("name").equals("Mpv"))); database.begin(); - database.getSchema().getType("Sedan").newRecord() - .set("engine_number", "123") - .set("vehicle_model", "Diablo Stallion") - .save(); + database.getSchema().getType("Sedan").newRecord().set("engine_number", "123").set("vehicle_model", "Diablo Stallion").save(); database.commit(); Assertions.assertThrows(Exception.class, () -> { database.begin(); // insert a record with the same engine_number - database.getSchema().getType("Sedan").newRecord() - .set("engine_number", "123") - .set("vehicle_model", "Cartel Cruiser") - .save(); + database.getSchema().getType("Sedan").newRecord().set("engine_number", "123").set("vehicle_model", "Cartel Cruiser").save(); database.commit(); }); } diff --git a/engine/src/test/java/com/arcadedb/query/sql/executor/BeginStatementExecutionTest.java b/engine/src/test/java/com/arcadedb/query/sql/executor/BeginStatementExecutionTest.java index ce3e42c26..939593a96 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/executor/BeginStatementExecutionTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/executor/BeginStatementExecutionTest.java @@ -19,12 +19,11 @@ package com.arcadedb.query.sql.executor; import com.arcadedb.TestHelper; - import org.junit.jupiter.api.Test; -import java.util.*; +import java.util.Iterator; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; /** * @author Luigi Dell'Aquila (l.dellaquila-(at)-orientdb.com) @@ -32,8 +31,8 @@ public class BeginStatementExecutionTest { @Test public void testBegin() throws Exception { - TestHelper.executeInNewDatabase("OCommitStatementExecutionTest", (db) -> { - assertThat(db.getTransaction() == null || !db.getTransaction().isActive()).isTrue(); + TestHelper.executeInNewDatabase((db) -> { + assertThat(db.isTransactionActive()).isTrue(); final ResultSet result = db.command("sql", "begin"); //printExecutionPlan(null, result); assertThat((Iterator) result).isNotNull(); @@ -41,8 +40,8 @@ public void testBegin() throws Exception { final Result item = result.next(); assertThat(item.getProperty("operation")).isEqualTo("begin"); assertThat(result.hasNext()).isFalse(); - assertThat(db.getTransaction() == null || !db.getTransaction().isActive()).isFalse(); db.commit(); +// assertThat(db.isTransactionActive()).isFalse(); }); } } diff --git a/engine/src/test/java/com/arcadedb/query/sql/executor/CreateVertexStatementExecutionTest.java b/engine/src/test/java/com/arcadedb/query/sql/executor/CreateVertexStatementExecutionTest.java index e0af3143b..ace3bff29 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/executor/CreateVertexStatementExecutionTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/executor/CreateVertexStatementExecutionTest.java @@ -21,10 +21,12 @@ import com.arcadedb.TestHelper; import com.arcadedb.exception.CommandExecutionException; import com.arcadedb.schema.Schema; - import org.junit.jupiter.api.Test; -import java.util.*; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; @@ -40,24 +42,18 @@ public CreateVertexStatementExecutionTest() { @Test public void testVerticesContentJsonArray() { final String className = "testVertexContentArray"; - database.getSchema().createVertexType(className, 1); - - String array = "["; - for (int i = 0; i < 1000; i++) { - if (i > 0) - array += ","; - array += "{'name':'name" + i + "', 'surname':'surname" + i + "'}"; - } - array += "]"; + database.getSchema().buildVertexType().withName(className).withTotalBuckets(1).create(); + String array = IntStream.range(0, 1000).mapToObj(i -> String.format("{'name':'name%d', 'surname':'surname%d'}", i, i)) + .collect(Collectors.joining(",", "[", "]")); ResultSet result = database.command("sql", "create vertex " + className + " content " + array); for (int i = 0; i < 1000; i++) { assertThat(result.hasNext()).isTrue(); final Result item = result.next(); assertThat(item).isNotNull(); - assertThat(item.getProperty("name").toString()).isEqualTo("name" + i); - assertThat(item.getProperty("surname").toString()).isEqualTo("surname" + i); + assertThat(item.getProperty("name")).isEqualTo("name" + i); + assertThat(item.getProperty("surname")).isEqualTo("surname" + i); } assertThat(result.hasNext()).isFalse(); @@ -67,8 +63,8 @@ public void testVerticesContentJsonArray() { assertThat(result.hasNext()).isTrue(); Result item = result.next(); assertThat(item).isNotNull(); - assertThat(item.getProperty("name").toString()).isEqualTo("name" + i); - assertThat(item.getProperty("surname").toString()).isEqualTo("surname" + i); + assertThat(item.getProperty("name")).isEqualTo("name" + i); + assertThat(item.getProperty("surname")).isEqualTo("surname" + i); } assertThat(result.hasNext()).isFalse(); diff --git a/engine/src/test/java/com/arcadedb/query/sql/executor/GroupByExecutionTest.java b/engine/src/test/java/com/arcadedb/query/sql/executor/GroupByExecutionTest.java index 3479019da..b890c3ce9 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/executor/GroupByExecutionTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/executor/GroupByExecutionTest.java @@ -21,7 +21,8 @@ import com.arcadedb.TestHelper; import org.junit.jupiter.api.Test; -import java.util.*; +import java.util.Random; +import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @@ -48,7 +49,12 @@ public void testGroupByCount() { } } - final ResultSet result = database.query("sql", "select address, count(*) as occurrences from InputTx where address is not null group by address limit 10"); + final ResultSet result = database.query("sql", """ + select address, count(*) as occurrences + from InputTx where address is not null + group by address + limit 10 + """); while (result.hasNext()) { final Result row = result.next(); assertThat(row.getProperty("address")).isNotNull(); diff --git a/engine/src/test/java/com/arcadedb/query/sql/executor/MatchInheritanceTest.java b/engine/src/test/java/com/arcadedb/query/sql/executor/MatchInheritanceTest.java index 5fb7d0805..5e531e673 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/executor/MatchInheritanceTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/executor/MatchInheritanceTest.java @@ -1,7 +1,6 @@ package com.arcadedb.query.sql.executor; import com.arcadedb.TestHelper; -import com.arcadedb.graph.Vertex; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -11,9 +10,7 @@ public class MatchInheritanceTest extends TestHelper { public void testInheritance() { ResultSet result = null; - String sql = "SELECT FROM Services"; - - result = database.command("SQL", sql); + result = database.command("SQL", "SELECT FROM Services"); int selectFromServices = 0; while (result.hasNext()) { Result record = result.next(); @@ -21,8 +18,7 @@ public void testInheritance() { } assertThat(selectFromServices).isEqualTo(4); - sql = "SELECT FROM Attractions"; - result = database.command("SQL", sql); + result = database.command("SQL", "SELECT FROM Attractions"); int selectFromAttractions = 0; while (result.hasNext()) { Result record = result.next(); @@ -30,9 +26,7 @@ public void testInheritance() { } assertThat(selectFromAttractions).isEqualTo(4); - sql = "SELECT FROM Locations"; - - result = database.command("SQL", sql); + result = database.command("SQL", "SELECT FROM Locations"); int selectFromLocations = 0; while (result.hasNext()) { Result record = result.next(); @@ -40,32 +34,29 @@ public void testInheritance() { } assertThat(selectFromLocations).isEqualTo(8); - sql = "MATCH {type: Customers, as: customer, where: (OrderedId=1)}--{type: Monuments} " + "RETURN $pathelements"; - result = database.query("SQL", sql); + result = database.query("SQL", + "MATCH {type: Customers, as: customer, where: (OrderedId=1)}--{type: Monuments} RETURN $pathelements"); assertThat(result.stream().count()).isEqualTo(2); - sql = "MATCH {type: Customers, as: customer, where: (OrderedId=1)}--{type: Services} " + "RETURN $pathelements"; - result = database.query("SQL", sql); + result = database.query("SQL", + "MATCH {type: Customers, as: customer, where: (OrderedId=1)}--{type: Services} RETURN $pathelements"); assertThat(result.stream().count()).isEqualTo(8); - sql = "MATCH {type: Customers, as: customer, where: (OrderedId=1)}--{type: Attractions} " + "RETURN $pathelements"; - result = database.query("SQL", sql); + result = database.query("SQL", + "MATCH {type: Customers, as: customer, where: (OrderedId=1)}--{type: Attractions} RETURN $pathelements"); assertThat(result.stream().count()).isEqualTo(8); - sql = "MATCH {type: Customers, as: customer, where: (OrderedId=1)}--{type: Locations} " + "RETURN $pathelements"; - result = database.query("SQL", sql); + result = database.query("SQL", + "MATCH {type: Customers, as: customer, where: (OrderedId=1)}--{type: Locations} RETURN $pathelements"); assertThat(result.stream().count()).isEqualTo(16); } @Override public void beginTest() { - StringBuilder sb = new StringBuilder(); - - sb.append("BEGIN;"); /* -- Locations -- + Services @@ -77,95 +68,96 @@ public void beginTest() { -- + Theatres -- + Archaeological Sites */ - sb.append("CREATE VERTEX TYPE Locations;"); - sb.append("CREATE PROPERTY Locations.Id LONG;"); - sb.append("CREATE PROPERTY Locations.Type STRING;"); - sb.append("CREATE PROPERTY Locations.Name STRING;"); - - sb.append("CREATE INDEX ON Locations (Type) NOTUNIQUE;"); - sb.append("CREATE INDEX ON Locations (Name) FULL_TEXT;"); + String sqlScript = """ + BEGIN; + CREATE VERTEX TYPE Locations; + CREATE PROPERTY Locations.Id LONG; + CREATE PROPERTY Locations.Type STRING; + CREATE PROPERTY Locations.Name STRING; - sb.append("CREATE VERTEX TYPE Services EXTENDS Locations;"); - sb.append("CREATE VERTEX TYPE Hotels EXTENDS Services;"); - sb.append("CREATE INDEX ON Hotels (Id) UNIQUE;"); + CREATE INDEX ON Locations (Type) NOTUNIQUE; + CREATE INDEX ON Locations (Name) FULL_TEXT; - sb.append("CREATE VERTEX TYPE Restaurants EXTENDS Services;\n"); - sb.append("CREATE INDEX ON Restaurants(Id) UNIQUE;\n"); + CREATE VERTEX TYPE Services EXTENDS Locations; + CREATE VERTEX TYPE Hotels EXTENDS Services; + CREATE INDEX ON Hotels (Id) UNIQUE; - sb.append("CREATE VERTEX TYPE Attractions EXTENDS Locations;\n"); - sb.append("CREATE VERTEX TYPE Monuments EXTENDS Attractions;\n"); - sb.append("CREATE INDEX ON Monuments (Id) UNIQUE;\n"); + CREATE VERTEX TYPE Restaurants EXTENDS Services; + CREATE INDEX ON Restaurants(Id) UNIQUE; - sb.append("CREATE VERTEX TYPE Castles EXTENDS Attractions;\n"); - sb.append("CREATE INDEX ON Castles(Id) UNIQUE;\n"); + CREATE VERTEX TYPE Attractions EXTENDS Locations; + CREATE VERTEX TYPE Monuments EXTENDS Attractions; + CREATE INDEX ON Monuments (Id) UNIQUE; - sb.append("CREATE VERTEX TYPE Theatres EXTENDS Attractions;\n"); - sb.append("CREATE INDEX ON Theatres(Id) UNIQUE;\n"); + CREATE VERTEX TYPE Castles EXTENDS Attractions; + CREATE INDEX ON Castles(Id) UNIQUE; - sb.append("CREATE VERTEX TYPE ArchaeologicalSites EXTENDS Attractions;\n"); - sb.append("CREATE INDEX ON ArchaeologicalSites(Id) UNIQUE;\n"); + CREATE VERTEX TYPE Theatres EXTENDS Attractions; + CREATE INDEX ON Theatres(Id) UNIQUE; - sb.append("CREATE VERTEX TYPE Customers;"); - sb.append("CREATE PROPERTY Customers.OrderedId LONG;"); + CREATE VERTEX TYPE ArchaeologicalSites EXTENDS Attractions; + CREATE INDEX ON ArchaeologicalSites(Id) UNIQUE; - sb.append("CREATE VERTEX TYPE Orders;"); - sb.append("CREATE PROPERTY Orders.Id LONG;"); - sb.append("CREATE PROPERTY Orders.Amount LONG;"); - sb.append("CREATE PROPERTY Orders.OrderDate DATE;"); + CREATE VERTEX TYPE Customers; + CREATE PROPERTY Customers.OrderedId LONG; - sb.append("CREATE INDEX ON Customers(OrderedId) UNIQUE;"); + CREATE VERTEX TYPE Orders; + CREATE PROPERTY Orders.Id LONG; + CREATE PROPERTY Orders.Amount LONG; + CREATE PROPERTY Orders.OrderDate DATE; - sb.append("CREATE INDEX ON Orders(Id) UNIQUE;"); + CREATE INDEX ON Customers(OrderedId) UNIQUE; - sb.append("CREATE EDGE TYPE HasUsedService;"); - sb.append("CREATE PROPERTY HasUsedService.out LINK OF Customers;"); + CREATE INDEX ON Orders(Id) UNIQUE; - sb.append("CREATE EDGE TYPE HasStayed EXTENDS HasUsedService;"); - sb.append("CREATE PROPERTY HasStayed.in LINK OF Hotels;"); + CREATE EDGE TYPE HasUsedService; + CREATE PROPERTY HasUsedService.out LINK OF Customers; - sb.append("CREATE EDGE TYPE HasEaten EXTENDS HasUsedService;"); - sb.append("CREATE PROPERTY HasEaten.in LINK OF Restaurants;"); + CREATE EDGE TYPE HasStayed EXTENDS HasUsedService; + CREATE PROPERTY HasStayed.in LINK OF Hotels; - sb.append("CREATE EDGE TYPE HasVisited;"); - sb.append("CREATE PROPERTY HasVisited.out LINK OF Customers;"); - sb.append("CREATE PROPERTY HasVisited.in LINK;"); - sb.append("CREATE INDEX ON HasVisited (`in`, `out`) UNIQUE;"); + CREATE EDGE TYPE HasEaten EXTENDS HasUsedService; + CREATE PROPERTY HasEaten.in LINK OF Restaurants; - sb.append("CREATE EDGE TYPE HasCustomer;"); - sb.append("CREATE PROPERTY HasCustomer.in LINK OF Customers;"); - sb.append("CREATE PROPERTY HasCustomer.out LINK OF Orders ;"); + CREATE EDGE TYPE HasVisited; + CREATE PROPERTY HasVisited.out LINK OF Customers; + CREATE PROPERTY HasVisited.in LINK; + CREATE INDEX ON HasVisited (`in`, `out`) UNIQUE; - sb.append("INSERT INTO Customers SET OrderedId = 1, Phone = '+1400844724';"); - sb.append("INSERT INTO Orders SET Id = 1, Amount = 536, OrderDate = '2013-05-23';"); + CREATE EDGE TYPE HasCustomer; + CREATE PROPERTY HasCustomer.in LINK OF Customers; + CREATE PROPERTY HasCustomer.out LINK OF Orders; - sb.append("INSERT INTO Hotels SET Id = 730, Name = 'Toules', Type = 'alpine_hut';"); + INSERT INTO Customers SET OrderedId = 1, Phone = '+1400844724'; + INSERT INTO Orders SET Id = 1, Amount = 536, OrderDate = '2013-05-23'; - sb.append("INSERT INTO Restaurants SET Id = 1834, Name = 'Uliassi', Type = 'restaurant';"); - sb.append("INSERT INTO Restaurants SET Id = 1099, Name = 'L\\'Angelo d\\'Oro', Type = 'restaurant';"); + INSERT INTO Hotels SET Id = 730, Name = 'Toules', Type = 'alpine_hut'; - sb.append("INSERT INTO Restaurants SET Id = 1738, Name = 'Johnny Paranza', Type = 'fast_food';"); + INSERT INTO Restaurants SET Id = 1834, Name = 'Uliassi', Type = 'restaurant'; + INSERT INTO Restaurants SET Id = 1099, Name = 'L\\'Angelo d\\'Oro', Type = 'restaurant'; - sb.append("INSERT INTO Castles SET Id = 127, Name = 'Haselburg', Type = 'castle';"); - sb.append("INSERT INTO ArchaeologicalSites SET Id = 47, Name = 'Villa Romana', Type = 'archaeological_site';"); - sb.append("INSERT INTO Monuments SET Id = 62, Name = 'Giuseppe Garibaldi', Type = 'monument';"); - sb.append("INSERT INTO Theatres SET Id = 65, Name = 'Teatro Civico', Type = 'theatre';"); + INSERT INTO Restaurants SET Id = 1738, Name = 'Johnny Paranza', Type = 'fast_food'; - sb.append("CREATE EDGE HasStayed FROM (SELECT FROM Customers WHERE OrderedId=1) TO (SELECT FROM Hotels WHERE Id=730);"); + INSERT INTO Castles SET Id = 127, Name = 'Haselburg', Type = 'castle'; + INSERT INTO ArchaeologicalSites SET Id = 47, Name = 'Villa Romana', Type = 'archaeological_site'; + INSERT INTO Monuments SET Id = 62, Name = 'Giuseppe Garibaldi', Type = 'monument'; + INSERT INTO Theatres SET Id = 65, Name = 'Teatro Civico', Type = 'theatre'; - sb.append("CREATE EDGE HasEaten FROM (SELECT FROM Customers WHERE OrderedId=1) TO (SELECT FROM Restaurants WHERE Id=1834);"); - sb.append("CREATE EDGE HasEaten FROM (SELECT FROM Customers WHERE OrderedId=1) TO (SELECT FROM Restaurants WHERE Id=1099);"); - sb.append("CREATE EDGE HasEaten FROM (SELECT FROM Customers WHERE OrderedId=1) TO (SELECT FROM Restaurants WHERE Id=1738);"); + CREATE EDGE HasStayed FROM (SELECT FROM Customers WHERE OrderedId=1) TO (SELECT FROM Hotels WHERE Id=730); - sb.append("CREATE EDGE HasCustomer FROM (SELECT FROM Orders WHERE Id=1) TO (SELECT FROM Customers WHERE OrderedId=1);"); + CREATE EDGE HasEaten FROM (SELECT FROM Customers WHERE OrderedId=1) TO (SELECT FROM Restaurants WHERE Id=1834); + CREATE EDGE HasEaten FROM (SELECT FROM Customers WHERE OrderedId=1) TO (SELECT FROM Restaurants WHERE Id=1099); + CREATE EDGE HasEaten FROM (SELECT FROM Customers WHERE OrderedId=1) TO (SELECT FROM Restaurants WHERE Id=1738); - sb.append("CREATE EDGE HasVisited FROM (SELECT FROM Customers WHERE OrderedId=1) TO (SELECT FROM Castles WHERE Id=127);"); - sb.append( - "CREATE EDGE HasVisited FROM (SELECT FROM Customers WHERE OrderedId=1) TO (SELECT FROM ArchaeologicalSites WHERE Id=47);"); - sb.append("CREATE EDGE HasVisited FROM (SELECT FROM Customers WHERE OrderedId=1) TO (SELECT FROM Monuments WHERE Id=62);"); - sb.append("CREATE EDGE HasVisited FROM (SELECT FROM Customers WHERE OrderedId=1) TO (SELECT FROM Theatres WHERE Id=65);"); + CREATE EDGE HasCustomer FROM (SELECT FROM Orders WHERE Id=1) TO (SELECT FROM Customers WHERE OrderedId=1); - sb.append("COMMIT;"); + CREATE EDGE HasVisited FROM (SELECT FROM Customers WHERE OrderedId=1) TO (SELECT FROM Castles WHERE Id=127); + CREATE EDGE HasVisited FROM (SELECT FROM Customers WHERE OrderedId=1) TO (SELECT FROM ArchaeologicalSites WHERE Id=47); + CREATE EDGE HasVisited FROM (SELECT FROM Customers WHERE OrderedId=1) TO (SELECT FROM Monuments WHERE Id=62); + CREATE EDGE HasVisited FROM (SELECT FROM Customers WHERE OrderedId=1) TO (SELECT FROM Theatres WHERE Id=65); - database.command("SQLScript", sb.toString()); + COMMIT; + """; + database.command("SQLScript", sqlScript); } } diff --git a/engine/src/test/java/com/arcadedb/query/sql/executor/MatchResultTest.java b/engine/src/test/java/com/arcadedb/query/sql/executor/MatchResultTest.java index fa0059400..10076f2aa 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/executor/MatchResultTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/executor/MatchResultTest.java @@ -5,7 +5,8 @@ import com.arcadedb.graph.Vertex; import org.junit.jupiter.api.Test; -import java.util.*; +import java.util.HashSet; +import java.util.Set; import static org.assertj.core.api.Assertions.assertThat; @@ -17,24 +18,23 @@ public class MatchResultTest extends TestHelper { */ @Test public void testIssue1689() { - database.transaction(() -> database.command("sqlscript", "CREATE VERTEX TYPE Person IF NOT EXISTS;\n" - + "CREATE PROPERTY Person.role IF NOT EXISTS STRING;\n" - + "CREATE VERTEX TYPE House IF NOT EXISTS;\n" - + "CREATE EDGE TYPE LivesIn IF NOT EXISTS;\n" -// + "CREATE EDGE TYPE DummyEdge IF NOT EXISTS;\n" -// + "DELETE FROM LivesIn;\n" -// + "DELETE FROM Person;\n" -// + "DELETE FROM House;\n" - + "CREATE VERTEX House;\n" - + "CREATE VERTEX Person SET role='mom';\n" - + "CREATE VERTEX Person SET role='dad';\n" - + "CREATE VERTEX Person SET role='child';\n" - + "CREATE EDGE LivesIn FROM (SELECT FROM Person) TO (SELECT FROM House);")); - - final ResultSet resultSet = database.query("sql", "MATCH {TYPE: Person, AS: personVertex} -LivesIn-> {TYPE: House}\n" - + ", NOT {AS: personVertex} -DummyEdge-> {TYPE: House}\n" - + "RETURN personVertex"); - + database.transaction(() -> database.command("sqlscript", """ + CREATE VERTEX TYPE Person IF NOT EXISTS; + CREATE PROPERTY Person.role IF NOT EXISTS STRING; + CREATE VERTEX TYPE House IF NOT EXISTS; + CREATE EDGE TYPE LivesIn IF NOT EXISTS; + CREATE VERTEX House; + CREATE VERTEX Person SET role='mom'; + CREATE VERTEX Person SET role='dad'; + CREATE VERTEX Person SET role='child'; + CREATE EDGE LivesIn FROM (SELECT FROM Person) TO (SELECT FROM House); + """)); + + final ResultSet resultSet = database.query("sql", """ + MATCH {TYPE: Person, AS: personVertex} -LivesIn-> {TYPE: House} + , NOT {AS: personVertex} -DummyEdge-> {TYPE: House} + RETURN personVertex + """); Set set = new HashSet<>(); while (resultSet.hasNext()) { final Vertex next = resultSet.nextIfAvailable().getProperty("personVertex"); diff --git a/engine/src/test/java/com/arcadedb/query/sql/executor/MatchStatementExecutionTest.java b/engine/src/test/java/com/arcadedb/query/sql/executor/MatchStatementExecutionTest.java index d02de5fe6..a77ebdad9 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/executor/MatchStatementExecutionTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/executor/MatchStatementExecutionTest.java @@ -19,9 +19,14 @@ package com.arcadedb.query.sql.executor; import com.arcadedb.TestHelper; -import com.arcadedb.database.*; +import com.arcadedb.database.Database; +import com.arcadedb.database.Document; +import com.arcadedb.database.Identifiable; +import com.arcadedb.database.MutableDocument; +import com.arcadedb.database.RID; import com.arcadedb.graph.MutableVertex; import com.arcadedb.graph.Vertex; +import com.arcadedb.index.Index; import com.arcadedb.index.TypeIndex; import org.junit.jupiter.api.Test; @@ -926,17 +931,18 @@ public void testManagedArrows() { } private ResultSet getManagedByArrows(final String managerName) { - final StringBuilder query = new StringBuilder(); - query.append("select expand(managed) from ("); - query.append(" match {type:Employee, where: (name = '" + managerName + "')}"); - query.append(" -ManagerOf->{}<-ParentDepartment-{"); - query.append(" while: ($depth = 0 or in('ManagerOf').size() = 0),"); - query.append(" where: ($depth = 0 or in('ManagerOf').size() = 0)"); - query.append(" }<-WorksAt-{as: managed}"); - query.append(" return managed"); - query.append(")"); + final String query = """ + select expand(managed) from ( + match {type:Employee, where: (name = '%s')} + -ManagerOf->{}<-ParentDepartment-{ + while: ($depth = 0 or in('ManagerOf').size() = 0), + where: ($depth = 0 or in('ManagerOf').size() = 0) + }<-WorksAt-{as: managed} + return managed + ) + """.formatted(managerName); - return database.query("sql", query.toString()); + return database.query("sql", query); } @Test @@ -969,19 +975,20 @@ public void testManaged2() { } private ResultSet getManagedBy2(final String managerName) { - final StringBuilder query = new StringBuilder(); - query.append("select expand(managed) from ("); - query.append(" match {type:Employee, where: (name = '" + managerName + "')}"); - query.append(" .out('ManagerOf')"); - query.append(" .(inE('ParentDepartment').outV()){"); - query.append(" while: ($depth = 0 or in('ManagerOf').size() = 0),"); - query.append(" where: ($depth = 0 or in('ManagerOf').size() = 0)"); - query.append(" }"); - query.append(" .in('WorksAt'){as: managed}"); - query.append(" return managed"); - query.append(")"); + final String query = """ + select expand(managed) from ( + match {type:Employee, where: (name = '%s')} + .out('ManagerOf') + .(inE('ParentDepartment').outV()){ + while: ($depth = 0 or in('ManagerOf').size() = 0), + where: ($depth = 0 or in('ManagerOf').size() = 0) + } + .in('WorksAt'){as: managed} + return managed + ) + """.formatted(managerName); - return database.query("sql", query.toString()); + return database.query("sql", query); } @Test @@ -1014,33 +1021,33 @@ public void testManaged2Arrows() { } private ResultSet getManagedBy2Arrows(final String managerName) { - final StringBuilder query = new StringBuilder(); - query.append("select expand(managed) from ("); - query.append(" match {type:Employee, where: (name = '" + managerName + "')}"); - query.append(" -ManagerOf->{}"); - query.append(" .(inE('ParentDepartment').outV()){"); - query.append(" while: ($depth = 0 or in('ManagerOf').size() = 0),"); - query.append(" where: ($depth = 0 or in('ManagerOf').size() = 0)"); - query.append(" }<-WorksAt-{as: managed}"); - query.append(" return managed"); - query.append(")"); + final String query = """ + select expand(managed) from ( + match {type:Employee, where: (name = '%s')} + -ManagerOf->{} + .(inE('ParentDepartment').outV()){ + while: ($depth = 0 or in('ManagerOf').size() = 0), + where: ($depth = 0 or in('ManagerOf').size() = 0) + }<-WorksAt-{as: managed} + return managed + ) + """.formatted(managerName); - return database.query("sql", query.toString()); + return database.query("sql", query); } @Test public void testTriangle1() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:TriangleV, as: friend1, where: (uid = 0)}"); - query.append(" .out('TriangleE'){as: friend2}"); - query.append(" .out('TriangleE'){as: friend3},"); - query.append("{type:TriangleV, as: friend1}"); - query.append(" .out('TriangleE'){as: friend3}"); - query.append("return $matches"); - - final ResultSet result = database.query("sql", query.toString()); + final String query = """ + match {type:TriangleV, as: friend1, where: (uid = 0)} + .out('TriangleE'){as: friend2} + .out('TriangleE'){as: friend3}, + {type:TriangleV, as: friend1} + .out('TriangleE'){as: friend3} + return $matches + """; + final ResultSet result = database.query("sql", query); assertThat(result.hasNext()).isTrue(); result.next(); assertThat(result.hasNext()).isFalse(); @@ -1049,13 +1056,14 @@ public void testTriangle1() { @Test public void testTriangle1Arrows() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:TriangleV, as: friend1, where: (uid = 0)} -TriangleE-> {as: friend2} -TriangleE-> {as: friend3},"); - query.append("{type:TriangleV, as: friend1} -TriangleE-> {as: friend3}"); - query.append("return $matches"); + final String query = """ + match {type:TriangleV, as: friend1, where: (uid = 0)} -TriangleE-> {as: friend2} -TriangleE-> {as: friend3}, + {type:TriangleV, as: friend1} -TriangleE-> {as: friend3} + return $matches + """; - final ResultSet result = database.query("sql", query.toString()); + final ResultSet result = database.query("sql", query); + assertThat(result.hasNext()).isTrue(); assertThat(result.hasNext()).isTrue(); result.next(); assertThat(result.hasNext()).isFalse(); @@ -1064,17 +1072,16 @@ public void testTriangle1Arrows() { @Test public void testTriangle2Old() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:TriangleV, as: friend1}"); - query.append(" .out('TriangleE'){type:TriangleV, as: friend2, where: (uid = 1)}"); - query.append(" .out('TriangleE'){as: friend3},"); - query.append("{type:TriangleV, as: friend1}"); - query.append(" .out('TriangleE'){as: friend3}"); - query.append("return $matches"); - - final ResultSet result = database.query("sql", query.toString()); + final String query = """ + match {type:TriangleV, as: friend1} + .out('TriangleE'){type:TriangleV, as: friend2, where: (uid = 1)} + .out('TriangleE'){as: friend3}, + {type:TriangleV, as: friend1} + .out('TriangleE'){as: friend3} + return $matches + """; + final ResultSet result = database.query("sql", query); assertThat(result.hasNext()).isTrue(); final Result doc = result.next(); final Document friend1 = doc.getProperty("friend1"); @@ -1088,16 +1095,17 @@ public void testTriangle2Old() { @Test public void testTriangle2() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:TriangleV, as: friend1}"); - query.append(" .out('TriangleE'){type:TriangleV, as: friend2, where: (uid = 1)}"); - query.append(" .out('TriangleE'){as: friend3},"); - query.append("{type:TriangleV, as: friend1}"); - query.append(" .out('TriangleE'){as: friend3}"); - query.append("return $patterns"); + final String query = """ + match {type:TriangleV, as: friend1} + .out('TriangleE'){type:TriangleV, as: friend2, where: (uid = 1)} + .out('TriangleE'){as: friend3}, + {type:TriangleV, as: friend1} + .out('TriangleE'){as: friend3} + return $patterns + """; - final ResultSet result = database.query("sql", query.toString()); + final ResultSet result = database.query("sql", query); + assertThat(result.hasNext()).isTrue(); assertThat(result.hasNext()).isTrue(); final Result doc = result.next(); assertThat(result.hasNext()).isFalse(); @@ -1112,16 +1120,17 @@ public void testTriangle2() { @Test public void testTriangle2Arrows() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:TriangleV, as: friend1}"); - query.append(" -TriangleE->{type:TriangleV, as: friend2, where: (uid = 1)}"); - query.append(" -TriangleE->{as: friend3},"); - query.append("{type:TriangleV, as: friend1}"); - query.append(" -TriangleE->{as: friend3}"); - query.append("return $matches"); + final String query = """ + match {type:TriangleV, as: friend1} + -TriangleE->{type:TriangleV, as: friend2, where: (uid = 1)} + -TriangleE->{as: friend3}, + {type:TriangleV, as: friend1} + -TriangleE->{as: friend3} + return $matches + """; - final ResultSet result = database.query("sql", query.toString()); + final ResultSet result = database.query("sql", query); + assertThat(result.hasNext()).isTrue(); assertThat(result.hasNext()).isTrue(); final Result doc = result.next(); assertThat(result.hasNext()).isFalse(); @@ -1136,16 +1145,16 @@ public void testTriangle2Arrows() { @Test public void testTriangle3() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:TriangleV, as: friend1}"); - query.append(" -TriangleE->{as: friend2}"); - query.append(" -TriangleE->{as: friend3, where: (uid = 2)},"); - query.append("{type:TriangleV, as: friend1}"); - query.append(" -TriangleE->{as: friend3}"); - query.append("return $matches"); + final String query = """ + match {type:TriangleV, as: friend1} + -TriangleE->{as: friend2} + -TriangleE->{as: friend3, where: (uid = 2)}, + {type:TriangleV, as: friend1} + -TriangleE->{as: friend3} + return $matches + """; - final ResultSet result = database.query("sql", query.toString()); + final ResultSet result = database.query("sql", query); assertThat(result.hasNext()).isTrue(); final Result doc = result.next(); assertThat(result.hasNext()).isFalse(); @@ -1154,16 +1163,17 @@ public void testTriangle3() { @Test public void testTriangle4() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:TriangleV, as: friend1}"); - query.append(" .out('TriangleE'){as: friend2, where: (uid = 1)}"); - query.append(" .out('TriangleE'){as: friend3},"); - query.append("{type:TriangleV, as: friend1}"); - query.append(" .out('TriangleE'){as: friend3}"); - query.append("return $matches"); + final String query = """ + match {type:TriangleV, as: friend1} + .out('TriangleE'){as: friend2, where: (uid = 1)} + .out('TriangleE'){as: friend3}, + {type:TriangleV, as: friend1} + .out('TriangleE'){as: friend3} + return $matches + """; - final ResultSet result = database.query("sql", query.toString()); + final ResultSet result = database.query("sql", query); + assertThat(result.hasNext()).isTrue(); assertThat(result.hasNext()).isTrue(); final Result doc = result.next(); assertThat(result.hasNext()).isFalse(); @@ -1172,16 +1182,17 @@ public void testTriangle4() { @Test public void testTriangle4Arrows() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:TriangleV, as: friend1}"); - query.append(" -TriangleE->{as: friend2, where: (uid = 1)}"); - query.append(" -TriangleE->{as: friend3},"); - query.append("{type:TriangleV, as: friend1}"); - query.append(" -TriangleE->{as: friend3}"); - query.append("return $matches"); + final String query = """ + match {type:TriangleV, as: friend1} + -TriangleE->{as: friend2, where: (uid = 1)} + -TriangleE->{as: friend3}, + {type:TriangleV, as: friend1} + -TriangleE->{as: friend3} + return $matches + """; - final ResultSet result = database.query("sql", query.toString()); + final ResultSet result = database.query("sql", query); + assertThat(result.hasNext()).isTrue(); assertThat(result.hasNext()).isTrue(); final Result doc = result.next(); assertThat(result.hasNext()).isFalse(); @@ -1190,17 +1201,16 @@ public void testTriangle4Arrows() { @Test public void testTriangleWithEdges4() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:TriangleV, as: friend1}"); - query.append(" .outE('TriangleE').inV(){as: friend2, where: (uid = 1)}"); - query.append(" .outE('TriangleE').inV(){as: friend3},"); - query.append("{type:TriangleV, as: friend1}"); - query.append(" .outE('TriangleE').inV(){as: friend3}"); - query.append("return $matches"); - - final ResultSet result = database.query("sql", query.toString()); + final String query = """ + match {type:TriangleV, as: friend1} + .outE('TriangleE').inV(){as: friend2, where: (uid = 1)} + .outE('TriangleE').inV(){as: friend3}, + {type:TriangleV, as: friend1} + .outE('TriangleE').inV(){as: friend3} + return $matches + """; + final ResultSet result = database.query("sql", query); assertThat(result.hasNext()).isTrue(); final Result doc = result.next(); assertThat(result.hasNext()).isFalse(); @@ -1209,14 +1219,13 @@ public void testTriangleWithEdges4() { @Test public void testCartesianProduct() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:TriangleV, as: friend1, where:(uid = 1)},"); - query.append("{type:TriangleV, as: friend2, where:(uid = 2 or uid = 3)}"); - query.append("return $matches"); - - final ResultSet result = database.query("sql", query.toString()); + final String query = """ + match {type:TriangleV, as: friend1, where:(uid = 1)}, + {type:TriangleV, as: friend2, where:(uid = 2 or uid = 3)} + return $matches + """; + final ResultSet result = database.query("sql", query); for (int i = 0; i < 2; i++) { assertThat(result.hasNext()).isTrue(); final Result doc = result.next(); @@ -1229,13 +1238,12 @@ public void testCartesianProduct() { @Test public void testNoPrefetch() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:IndexedVertex, as: one}"); - query.append("return $patterns"); - - final ResultSet result = database.query("sql", query.toString()); + final String query = """ + match {type:IndexedVertex, as: one} + return $patterns + """; + final ResultSet result = database.query("sql", query); result.getExecutionPlan() .ifPresent(x -> x.getSteps().stream().filter(y -> y instanceof MatchPrefetchStep).forEach(prefetchStepFound -> fail())); @@ -1249,14 +1257,13 @@ public void testNoPrefetch() { @Test public void testCartesianProductLimit() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:TriangleV, as: friend1, where:(uid = 1)},"); - query.append("{type:TriangleV, as: friend2, where:(uid = 2 or uid = 3)}"); - query.append("return $matches LIMIT 1"); - - final ResultSet result = database.query("sql", query.toString()); + final String query = """ + match {type:TriangleV, as: friend1, where:(uid = 1)}, + {type:TriangleV, as: friend2, where:(uid = 2 or uid = 3)} + return $matches LIMIT 1 + """; + final ResultSet result = database.query("sql", query); assertThat(result.hasNext()).isTrue(); final Result d = result.next(); final Document friend1 = d.getProperty("friend1"); @@ -1322,12 +1329,12 @@ public void testArrayRangeSelectors1() { @Test public void testArrayRange2() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:TriangleV, as: friend1, where: (uid = 0)}"); - query.append("return friend1.out('TriangleE')[0..2] as foo"); + final String query = """ + match {type:TriangleV, as: friend1, where: (uid = 0)} + return friend1.out('TriangleE')[0..2] as foo + """; - final ResultSet result = database.query("sql", query.toString()); + final ResultSet result = database.query("sql", query); assertThat(result.hasNext()).isTrue(); final Result doc = result.next(); assertThat(result.hasNext()).isFalse(); @@ -1341,12 +1348,12 @@ public void testArrayRange2() { @Test public void testArrayRange3() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:TriangleV, as: friend1, where: (uid = 0)}"); - query.append("return friend1.out('TriangleE')[0..3] as foo"); + final String query = """ + match {type:TriangleV, as: friend1, where: (uid = 0)} + return friend1.out('TriangleE')[0..3] as foo + """; - final ResultSet result = database.query("sql", query.toString()); + final ResultSet result = database.query("sql", query); assertThat(result.hasNext()).isTrue(); final Result doc = result.next(); assertThat(result.hasNext()).isFalse(); @@ -1360,12 +1367,12 @@ public void testArrayRange3() { @Test public void testConditionInSquareBrackets() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:TriangleV, as: friend1, where: (uid = 0)}"); - query.append("return friend1.out('TriangleE')[uid = 2] as foo"); + final String query = """ + match {type:TriangleV, as: friend1, where: (uid = 0)} + return friend1.out('TriangleE')[uid = 2] as foo + """; - final ResultSet result = database.query("sql", query.toString()); + final ResultSet result = database.query("sql", query); assertThat(result.hasNext()).isTrue(); final Result doc = result.next(); assertThat(result.hasNext()).isFalse(); @@ -1381,14 +1388,13 @@ public void testConditionInSquareBrackets() { @Test public void testIndexedEdge() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:IndexedVertex, as: one, where: (uid = 0)}"); - query.append(".out('IndexedEdge'){type:IndexedVertex, as: two, where: (uid = 1)}"); - query.append("return one, two"); - - final ResultSet result = database.query("sql", query.toString()); + final String query = """ + match {type:IndexedVertex, as: one, where: (uid = 0)} + .out('IndexedEdge'){type:IndexedVertex, as: two, where: (uid = 1)} + return one, two + """; + final ResultSet result = database.query("sql", query); assertThat(result.hasNext()).isTrue(); final Result doc = result.next(); assertThat(result.hasNext()).isFalse(); @@ -1397,13 +1403,13 @@ public void testIndexedEdge() { @Test public void testIndexedEdgeArrows() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:IndexedVertex, as: one, where: (uid = 0)}"); - query.append("-IndexedEdge->{type:IndexedVertex, as: two, where: (uid = 1)}"); - query.append("return one, two"); + final String query = """ + match {type:IndexedVertex, as: one, where: (uid = 0)} + -IndexedEdge->{type:IndexedVertex, as: two, where: (uid = 1)} + return one, two + """; - final ResultSet result = database.query("sql", query.toString()); + final ResultSet result = database.query("sql", query); assertThat(result.hasNext()).isTrue(); final Result doc = result.next(); assertThat(result.hasNext()).isFalse(); @@ -1412,12 +1418,11 @@ public void testIndexedEdgeArrows() { @Test public void testJson() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:IndexedVertex, as: one, where: (uid = 0)} "); - query.append("return {'name':'foo', 'uuid':one.uid}"); + final String query = """ + match {type:IndexedVertex, as: one, where: (uid = 0)} + return {'name':'foo', 'uuid':one.uid}"""; - final ResultSet result = database.query("sql", query.toString()); + final ResultSet result = database.query("sql", query); assertThat(result.hasNext()).isTrue(); final Result doc = result.next(); assertThat(result.hasNext()).isFalse(); @@ -1430,12 +1435,12 @@ public void testJson() { @Test public void testJson2() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:IndexedVertex, as: one, where: (uid = 0)} "); - query.append("return {'name':'foo', 'sub': {'uuid':one.uid}}"); + final String query = """ + match {type:IndexedVertex, as: one, where: (uid = 0)} + return {'name':'foo', 'sub': {'uuid':one.uid}} + """; - final ResultSet result = database.query("sql", query.toString()); + final ResultSet result = database.query("sql", query); assertThat(result.hasNext()).isTrue(); final Result doc = result.next(); assertThat(result.hasNext()).isFalse(); @@ -1447,12 +1452,12 @@ public void testJson2() { @Test public void testJson3() { - final StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:IndexedVertex, as: one, where: (uid = 0)} "); - query.append("return {'name':'foo', 'sub': [{'uuid':one.uid}]}"); + final String query = """ + match {type:IndexedVertex, as: one, where: (uid = 0)} + return {'name':'foo', 'sub': [{'uuid':one.uid}]} + """; - final ResultSet result = database.query("sql", query.toString()); + final ResultSet result = database.query("sql", query); assertThat(result.hasNext()).isTrue(); final Result doc = result.next(); assertThat(result.hasNext()).isFalse(); @@ -1465,42 +1470,41 @@ public void testJson3() { @Test public void testUnique() { - StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:DiamondV, as: one, where: (uid = 0)}.out('DiamondE').out('DiamondE'){as: two} "); - query.append("return DISTINCT one, two"); + String query = """ + match {type:DiamondV, as: one, where: (uid = 0)} + .out('DiamondE').out('DiamondE'){as: two} + return DISTINCT one, two + """; - ResultSet result = database.query("sql", query.toString()); + ResultSet result = database.query("sql", query); assertThat(result.hasNext()).isTrue(); Result doc = result.next(); assertThat(result.hasNext()).isFalse(); - query = new StringBuilder(); - query.append("match "); - query.append("{type:DiamondV, as: one, where: (uid = 0)}.out('DiamondE').out('DiamondE'){as: two} "); - query.append("return DISTINCT one.uid, two.uid"); + query = """ + match {type:DiamondV, as: one, where: (uid = 0)} + .out('DiamondE').out('DiamondE'){as: two} + return DISTINCT one.uid, two.uid + """; result.close(); - result = database.query("sql", query.toString()); + result = database.query("sql", query); assertThat(result.hasNext()).isTrue(); doc = result.next(); assertThat(result.hasNext()).isFalse(); result.close(); - // Document doc = result.get(0); - // assertEquals("foo", doc.set("name"); - // assertEquals(0, doc.set("sub[0].uuid"); } @Test public void testNotUnique() { - StringBuilder query = new StringBuilder(); - query.append("match "); - query.append("{type:DiamondV, as: one, where: (uid = 0)}.out('DiamondE').out('DiamondE'){as: two} "); - query.append("return one, two"); + String query = """ + match {type:DiamondV, as: one, where: (uid = 0)}.out('DiamondE').out('DiamondE'){as: two} + return one, two + """; - ResultSet result = database.query("sql", query.toString()); + ResultSet result = database.query("sql", query); assertThat(result.hasNext()).isTrue(); Result doc = result.next(); @@ -1509,21 +1513,18 @@ public void testNotUnique() { assertThat(result.hasNext()).isFalse(); result.close(); - query = new StringBuilder(); - query.append("match "); - query.append("{type:DiamondV, as: one, where: (uid = 0)}.out('DiamondE').out('DiamondE'){as: two} "); - query.append("return one.uid, two.uid"); + query = """ + match {type:DiamondV, as: one, where: (uid = 0)}.out('DiamondE').out('DiamondE'){as: two} + return one.uid, two.uid + """; - result = database.query("sql", query.toString()); + result = database.query("sql", query); assertThat(result.hasNext()).isTrue(); doc = result.next(); assertThat(result.hasNext()).isTrue(); doc = result.next(); assertThat(result.hasNext()).isFalse(); result.close(); - // Document doc = result.get(0); - // assertEquals("foo", doc.set("name"); - // assertEquals(0, doc.set("sub[0].uuid"); } @Test @@ -1550,15 +1551,16 @@ public void testManagedElements() { } private ResultSet getManagedElements(final String managerName) { - final StringBuilder query = new StringBuilder(); - query.append(" match {type:Employee, as:boss, where: (name = '" + managerName + "')}"); - query.append(" -ManagerOf->{}<-ParentDepartment-{"); - query.append(" while: ($depth = 0 or in('ManagerOf').size() = 0),"); - query.append(" where: ($depth = 0 or in('ManagerOf').size() = 0)"); - query.append(" }<-WorksAt-{as: managed}"); - query.append(" return distinct $elements"); + final String query = """ + match {type:Employee, as:boss, where: (name = '%s')} + -ManagerOf->{}<-ParentDepartment-{ + while: ($depth = 0 or in('ManagerOf').size() = 0), + where: ($depth = 0 or in('ManagerOf').size() = 0) + }<-WorksAt-{as: managed} + return distinct $elements + """.formatted(managerName); - return database.query("sql", query.toString()); + return database.query("sql", query); } @Test @@ -1622,11 +1624,13 @@ public void testOptional2() { @Test public void testOptional3() { - final ResultSet qResult = database.query("sql", "select friend.name as name, b from (" - + "match {type:Person, as:a, where:(name = 'n1' and 1 + 1 = 2)}.out('Friend'){as:friend, where:(name = 'n2' and 1 + 1 = 2)}," - + "{as:a}.out(){as:b, where:(nonExisting = 12), optional:true}," + "{as:friend}.out(){as:b, optional:true}" - + " return friend, b)"); - + final ResultSet qResult = database.query("sql", """ + select friend.name as name, b from ( + match {type:Person, as:a, where:(name = 'n1' and 1 + 1 = 2)}.out('Friend'){as:friend, where:(name = 'n2' and 1 + 1 = 2)}, + {as:a}.out(){as:b, where:(nonExisting = 12), optional:true}, + {as:friend}.out(){as:b, optional:true} + return friend, b) + """); assertThat(qResult.hasNext()).isTrue(); final Result doc = qResult.next(); assertThat(doc.getProperty("name")).isEqualTo("n2"); @@ -1841,7 +1845,7 @@ public void testUnwind() { for (int i = 0; i < 4; i++) { assertThat(result.hasNext()).isTrue(); final Result item = result.next(); - sum += item.getProperty("num"); + sum += item.getProperty("num"); } assertThat(result.hasNext()).isFalse(); @@ -1960,20 +1964,23 @@ public void testPathAlias() { final List thePath = (List) path; final String bname = item.getProperty("bname"); - if (bname.equals("aaa")) { - assertThat(thePath.size()).isEqualTo(0); - } else if (bname.equals("aaa")) { + switch (bname) { + case "aaa" -> assertThat(thePath.size()).isEqualTo(0); + case "bbb" -> { assertThat(thePath.size()).isEqualTo(1); - assertThat(((Document) thePath.get(0).getRecord()).getString("name")).isEqualTo("bbb"); - } else if (bname.equals("ccc")) { + assertThat(thePath.get(0).getRecord().asDocument().getString("name")).isEqualTo("bbb"); + } + case "ccc" -> { assertThat(thePath.size()).isEqualTo(2); - assertThat(((Document) thePath.get(0).getRecord()).getString("name")).isEqualTo("bbb"); - assertThat(((Document) thePath.get(1).getRecord()).getString("name")).isEqualTo("ccc"); - } else if (bname.equals("ddd")) { + assertThat(thePath.get(0).getRecord().asDocument().getString("name")).isEqualTo("bbb"); + assertThat(thePath.get(1).getRecord().asDocument().getString("name")).isEqualTo("ccc"); + } + case "ddd" -> { assertThat(thePath.size()).isEqualTo(3); - assertThat(((Document) thePath.get(0).getRecord()).getString("name")).isEqualTo("bbb"); - assertThat(((Document) thePath.get(1).getRecord()).getString("name")).isEqualTo("ccc"); - assertThat(((Document) thePath.get(2).getRecord()).getString("name")).isEqualTo("ddd"); + assertThat(thePath.get(0).getRecord().asDocument().getString("name")).isEqualTo("bbb"); + assertThat(thePath.get(1).getRecord().asDocument().getString("name")).isEqualTo("ccc"); + assertThat(thePath.get(2).getRecord().asDocument().getString("name")).isEqualTo("ddd"); + } } } assertThat(result.hasNext()).isFalse(); @@ -2024,49 +2031,49 @@ public void testBucketTarget() { assertThat(result.hasNext()).isFalse(); - assertThat(database.getSchema().getIndexByName(clazz + "[name]").get(new String[]{"one"}).hasNext()).isTrue(); - assertThat(database.getSchema().getIndexByName(clazz + "[name]").get(new String[]{"onex"}).hasNext()).isTrue(); - assertThat(database.getSchema().getIndexByName(clazz + "[name]").get(new String[]{"two"}).hasNext()).isTrue(); - assertThat(database.getSchema().getIndexByName(clazz + "[name]").get(new String[]{"three"}).hasNext()).isTrue(); + assertThat(database.getSchema().getIndexByName(clazz + "[name]").get(new String[] { "one" }).hasNext()).isTrue(); + assertThat(database.getSchema().getIndexByName(clazz + "[name]").get(new String[] { "onex" }).hasNext()).isTrue(); + assertThat(database.getSchema().getIndexByName(clazz + "[name]").get(new String[] { "two" }).hasNext()).isTrue(); + assertThat(database.getSchema().getIndexByName(clazz + "[name]").get(new String[] { "three" }).hasNext()).isTrue(); //-------------------------------------------------------------------------------------------------------- // CHECK THE SUB-INDEX EXISTS assertThat(Set.of(((TypeIndex) database.getSchema().getIndexByName(clazz + "[name]")).getIndexesOnBuckets()).stream() - .map((r) -> r.getAssociatedBucketId()).collect(Collectors.toSet()) - .contains(database.getSchema().getBucketByName(clazz + "_one").getFileId())).isTrue(); + .map(Index::getAssociatedBucketId).collect(Collectors.toSet()) + .contains(database.getSchema().getBucketByName(clazz + "_one").getFileId())).isTrue(); database.command("SQL", "ALTER TYPE " + clazz + " BUCKET -" + clazz + "_one").close(); // CHECK THE SUB-INDEX HAS BEN REMOVED assertThat(Set.of(((TypeIndex) database.getSchema().getIndexByName(clazz + "[name]")).getIndexesOnBuckets()).stream() - .map((r) -> r.getAssociatedBucketId()).collect(Collectors.toSet()) - .contains(database.getSchema().getBucketByName(clazz + "_one").getFileId())).isFalse(); + .map(Index::getAssociatedBucketId).collect(Collectors.toSet()) + .contains(database.getSchema().getBucketByName(clazz + "_one").getFileId())).isFalse(); //-------------------------------------------------------------------------------------------------------- // CHECK THE SUB-INDEX EXISTS assertThat(Set.of(((TypeIndex) database.getSchema().getIndexByName(clazz + "[name]")).getIndexesOnBuckets()).stream() - .map((r) -> r.getAssociatedBucketId()).collect(Collectors.toSet()) - .contains(database.getSchema().getBucketByName(clazz + "_two").getFileId())).isTrue(); + .map(Index::getAssociatedBucketId).collect(Collectors.toSet()) + .contains(database.getSchema().getBucketByName(clazz + "_two").getFileId())).isTrue(); database.command("SQL", "ALTER TYPE " + clazz + " BUCKET -" + clazz + "_two").close(); // CHECK THE SUB-INDEX HAS BEN REMOVED assertThat(Set.of(((TypeIndex) database.getSchema().getIndexByName(clazz + "[name]")).getIndexesOnBuckets()).stream() - .map((r) -> r.getAssociatedBucketId()).collect(Collectors.toSet()) - .contains(database.getSchema().getBucketByName(clazz + "_two").getFileId())).isFalse(); + .map(Index::getAssociatedBucketId).collect(Collectors.toSet()) + .contains(database.getSchema().getBucketByName(clazz + "_two").getFileId())).isFalse(); //-------------------------------------------------------------------------------------------------------- // CHECK THE SUB-INDEX EXISTS assertThat(Set.of(((TypeIndex) database.getSchema().getIndexByName(clazz + "[name]")).getIndexesOnBuckets()).stream() - .map((r) -> r.getAssociatedBucketId()).collect(Collectors.toSet()) - .contains(database.getSchema().getBucketByName(clazz + "_three").getFileId())).isTrue(); + .map(Index::getAssociatedBucketId).collect(Collectors.toSet()) + .contains(database.getSchema().getBucketByName(clazz + "_three").getFileId())).isTrue(); database.command("SQL", "ALTER TYPE " + clazz + " BUCKET -" + clazz + "_three").close(); // CHECK THE SUB-INDEX HAS BEN REMOVED assertThat(Set.of(((TypeIndex) database.getSchema().getIndexByName(clazz + "[name]")).getIndexesOnBuckets()).stream() - .map((r) -> r.getAssociatedBucketId()).collect(Collectors.toSet()) - .contains(database.getSchema().getBucketByName(clazz + "_three").getFileId())).isFalse(); + .map(Index::getAssociatedBucketId).collect(Collectors.toSet()) + .contains(database.getSchema().getBucketByName(clazz + "_three").getFileId())).isFalse(); result.close(); } @@ -2218,15 +2225,16 @@ public void testPathTraversal() { } private ResultSet getManagedPathElements(final String managerName) { - final StringBuilder query = new StringBuilder(); - query.append(" match {type:Employee, as:boss, where: (name = '" + managerName + "')}"); - query.append(" -ManagerOf->{}<-ParentDepartment-{"); - query.append(" while: ($depth = 0 or in('ManagerOf').size() = 0),"); - query.append(" where: ($depth = 0 or in('ManagerOf').size() = 0)"); - query.append(" }<-WorksAt-{as: managed}"); - query.append(" return distinct $pathElements"); + final String query = """ + match {type:Employee, as:boss, where: (name = '%s')} + -ManagerOf->{}<-ParentDepartment-{ + while: ($depth = 0 or in('ManagerOf').size() = 0), + where: ($depth = 0 or in('ManagerOf').size() = 0) + }<-WorksAt-{as: managed} + return distinct $pathElements + """.formatted(managerName); - return database.query("sql", query.toString()); + return database.query("sql", query); } @Test @@ -2244,8 +2252,7 @@ public void testQuotedClassName() { @Test public void testMatchInSubQuery() { - try (final ResultSet rs = database.query("SQL", - "SELECT $a LET $a=(MATCH{type:Person,as:Person_0}RETURN expand(Person_0))")) { + try (final ResultSet rs = database.query("SQL", "SELECT $a LET $a=(MATCH{type:Person,as:Person_0}RETURN expand(Person_0))")) { assertThat(rs.stream().count()).isEqualTo(1L); } } diff --git a/engine/src/test/java/com/arcadedb/query/sql/executor/WhileBlockExecutionTest.java b/engine/src/test/java/com/arcadedb/query/sql/executor/WhileBlockExecutionTest.java index b9cc28c72..8c0dc54b2 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/executor/WhileBlockExecutionTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/executor/WhileBlockExecutionTest.java @@ -38,21 +38,21 @@ public void testPlain() { database.getSchema().createDocumentType(className); - String script = ""; - script += "LET $i = 0;"; - script += "WHILE ($i < 3){\n"; - script += " insert into " + className + " set value = $i;\n"; - script += " LET $i = $i + 1;"; - script += "}"; - script += "SELECT FROM " + className + ";"; - + String script = """ + LET $i = 0; + WHILE ($i < 3){ + insert into %s set value = $i; + LET $i = $i + 1; + } + SELECT FROM %s; + """.formatted(className, className); final ResultSet results = database.command("sqlscript", script); int tot = 0; int sum = 0; while (results.hasNext()) { final Result item = results.next(); - sum += item.getProperty("value"); + sum += item.getProperty("value"); tot++; } assertThat(tot).isEqualTo(3); @@ -66,16 +66,16 @@ public void testReturn() { database.getSchema().createDocumentType(className); - String script = ""; - script += "LET $i = 0;"; - script += "WHILE ($i < 3){\n"; - script += " insert into " + className + " set value = $i;\n"; - script += " IF ($i = 1) {"; - script += " RETURN;"; - script += " }"; - script += " LET $i = $i + 1;"; - script += "}"; - + String script = """ + LET $i = 0; + WHILE ($i < 3){ + insert into %s set value = $i; + IF ($i = 1) { + RETURN; + } + LET $i = $i + 1; + } + """.formatted(className); ResultSet results = database.command("sqlscript", script); results.close(); results = database.query("sql", "SELECT FROM " + className); @@ -84,7 +84,7 @@ public void testReturn() { int sum = 0; while (results.hasNext()) { final Result item = results.next(); - sum += item.getProperty("value"); + sum += item.getProperty("value"); tot++; } assertThat(tot).isEqualTo(2); diff --git a/engine/src/test/java/com/arcadedb/query/sql/function/coll/SQLFunctionDifferenceTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/coll/SQLFunctionDifferenceTest.java new file mode 100644 index 000000000..2767e3554 --- /dev/null +++ b/engine/src/test/java/com/arcadedb/query/sql/function/coll/SQLFunctionDifferenceTest.java @@ -0,0 +1,59 @@ +/* + * Copyright © 2021-present Arcade Data Ltd (info@arcadedata.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) + * SPDX-License-Identifier: Apache-2.0 + */ +package com.arcadedb.query.sql.function.coll; + +import com.arcadedb.query.sql.executor.BasicCommandContext; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author edegtyarenko + * @since 11.10.12 14:40 + */ +public class SQLFunctionDifferenceTest { + + @Test + public void testExecute() { + final SQLFunctionDifference function = new SQLFunctionDifference(); + + List> incomes = Arrays.asList(Arrays.asList(1, 2, 3, 4, 5, 1), Arrays.asList(3, 5, 6, 7, 0, 1, 3, 3, 6), + Arrays.asList(2, 2, 8, 9)); + + Set expectedResult = new HashSet(Arrays.asList(4)); + + Set actualResult = (Set) function.execute(null, null, null, incomes.toArray(), new BasicCommandContext()); + + assertThat(actualResult).isEqualTo(expectedResult); + + incomes = Arrays.asList(Arrays.asList(1, 2, 3, 4, 5, 1), Arrays.asList(3, 5, 6, 7, 0, 1, 3, 3, 6)); + + expectedResult = new HashSet<>(Arrays.asList(2, 4)); + + actualResult = (Set) function.execute(null, null, null, incomes.toArray(), new BasicCommandContext()); + + assertThat(actualResult).isEqualTo(expectedResult); + } + +} diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/coll/SQLFunctionIntersectTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/coll/SQLFunctionIntersectTest.java similarity index 89% rename from engine/src/test/java/com/arcadedb/query/sql/functions/coll/SQLFunctionIntersectTest.java rename to engine/src/test/java/com/arcadedb/query/sql/function/coll/SQLFunctionIntersectTest.java index f1a3de832..6c88e52cf 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/coll/SQLFunctionIntersectTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/function/coll/SQLFunctionIntersectTest.java @@ -16,13 +16,15 @@ * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) * SPDX-License-Identifier: Apache-2.0 */ -package com.arcadedb.query.sql.functions.coll; +package com.arcadedb.query.sql.function.coll; import com.arcadedb.query.sql.executor.BasicCommandContext; -import com.arcadedb.query.sql.function.coll.SQLFunctionIntersect; import org.junit.jupiter.api.Test; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -38,7 +40,8 @@ public void intersectInline() { final List coll1 = Arrays.asList(1, 1, 2, 3, 4, 5, 5, 6, 7, 9, 0, 1, 1, 1); final List coll2 = Arrays.asList(1, 3, 0, 8); - final ArrayList result = (ArrayList) function.execute(null, null, null, new Object[] { coll1, coll2 }, new BasicCommandContext()); + final ArrayList result = (ArrayList) function.execute(null, null, null, new Object[] { coll1, coll2 }, + new BasicCommandContext()); assertThat(new HashSet<>(Arrays.asList(1, 3, 0))).isEqualTo(new HashSet<>(result)); } diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/coll/SQLFunctionSymmetricDifferenceTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/coll/SQLFunctionSymmetricDifferenceTest.java similarity index 88% rename from engine/src/test/java/com/arcadedb/query/sql/functions/coll/SQLFunctionSymmetricDifferenceTest.java rename to engine/src/test/java/com/arcadedb/query/sql/function/coll/SQLFunctionSymmetricDifferenceTest.java index 5301f3045..44838ba68 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/coll/SQLFunctionSymmetricDifferenceTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/function/coll/SQLFunctionSymmetricDifferenceTest.java @@ -16,13 +16,15 @@ * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) * SPDX-License-Identifier: Apache-2.0 */ -package com.arcadedb.query.sql.functions.coll; +package com.arcadedb.query.sql.function.coll; import com.arcadedb.query.sql.executor.BasicCommandContext; -import com.arcadedb.query.sql.function.coll.SQLFunctionSymmetricDifference; import org.junit.jupiter.api.Test; -import java.util.*; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import static org.assertj.core.api.Assertions.assertThat; @@ -52,8 +54,8 @@ public void testOperator() { public void testExecute() { final SQLFunctionSymmetricDifference function = new SQLFunctionSymmetricDifference(); - final List> incomes = Arrays - .asList(Arrays.asList(1, 2, 3, 4, 5, 1), Arrays.asList(3, 5, 6, 7, 0, 1, 3, 3, 6), Arrays.asList(2, 2, 8, 9)); + final List> incomes = Arrays.asList(Arrays.asList(1, 2, 3, 4, 5, 1), Arrays.asList(3, 5, 6, 7, 0, 1, 3, 3, 6), + Arrays.asList(2, 2, 8, 9)); final Set expectedResult = new HashSet(Arrays.asList(4, 7, 8, 9, 0)); diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/geo/SQLGeoFunctionsTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/geo/SQLGeoFunctionsTest.java similarity index 98% rename from engine/src/test/java/com/arcadedb/query/sql/functions/geo/SQLGeoFunctionsTest.java rename to engine/src/test/java/com/arcadedb/query/sql/function/geo/SQLGeoFunctionsTest.java index 265d54b10..2b1c28919 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/geo/SQLGeoFunctionsTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/function/geo/SQLGeoFunctionsTest.java @@ -16,7 +16,7 @@ * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) * SPDX-License-Identifier: Apache-2.0 */ -package com.arcadedb.query.sql.functions.geo; +package com.arcadedb.query.sql.function.geo; import com.arcadedb.TestHelper; import com.arcadedb.database.Document; @@ -26,8 +26,6 @@ import com.arcadedb.schema.DocumentType; import com.arcadedb.schema.Schema; import com.arcadedb.schema.Type; - -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.locationtech.spatial4j.io.GeohashUtils; import org.locationtech.spatial4j.shape.Circle; @@ -35,7 +33,7 @@ import org.locationtech.spatial4j.shape.Rectangle; import org.locationtech.spatial4j.shape.Shape; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; /** * @author Luca Garulli (l.garulli@arcadedata.com) diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/graph/SQLFunctionAdjacencyTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/graph/SQLFunctionAdjacencyTest.java similarity index 84% rename from engine/src/test/java/com/arcadedb/query/sql/functions/graph/SQLFunctionAdjacencyTest.java rename to engine/src/test/java/com/arcadedb/query/sql/function/graph/SQLFunctionAdjacencyTest.java index 21e91e4cc..41020df7c 100755 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/graph/SQLFunctionAdjacencyTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/function/graph/SQLFunctionAdjacencyTest.java @@ -16,7 +16,7 @@ * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) * SPDX-License-Identifier: Apache-2.0 */ -package com.arcadedb.query.sql.functions.graph; +package com.arcadedb.query.sql.function.graph; import com.arcadedb.TestHelper; import com.arcadedb.database.Database; @@ -27,22 +27,16 @@ import com.arcadedb.graph.MutableVertex; import com.arcadedb.graph.Vertex; import com.arcadedb.query.sql.executor.BasicCommandContext; -import com.arcadedb.query.sql.function.graph.SQLFunctionBoth; -import com.arcadedb.query.sql.function.graph.SQLFunctionBothE; -import com.arcadedb.query.sql.function.graph.SQLFunctionBothV; -import com.arcadedb.query.sql.function.graph.SQLFunctionIn; -import com.arcadedb.query.sql.function.graph.SQLFunctionInE; -import com.arcadedb.query.sql.function.graph.SQLFunctionInV; -import com.arcadedb.query.sql.function.graph.SQLFunctionOut; -import com.arcadedb.query.sql.function.graph.SQLFunctionOutE; -import com.arcadedb.query.sql.function.graph.SQLFunctionOutV; - -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; public class SQLFunctionAdjacencyTest { @@ -54,8 +48,8 @@ public void testOutE() throws Exception { TestHelper.executeInNewDatabase("testOutE", (graph) -> { setUpDatabase(graph); - final Iterator iterator = ((Iterable) new SQLFunctionOutE().execute(vertices.get(3), null, null, new Object[] {}, - new BasicCommandContext().setDatabase(graph))).iterator(); + final Iterator iterator = ((Iterable) new SQLFunctionOutE().execute(vertices.get(3), null, null, + new Object[] {}, new BasicCommandContext().setDatabase(graph))).iterator(); final Set result = new HashSet<>(); while (iterator.hasNext()) { @@ -76,8 +70,8 @@ public void testInE() throws Exception { TestHelper.executeInNewDatabase("testInE", (graph) -> { setUpDatabase(graph); - final Iterator iterator = ((Iterable) new SQLFunctionInE().execute(vertices.get(3), null, null, new Object[] {}, - new BasicCommandContext().setDatabase(graph))).iterator(); + final Iterator iterator = ((Iterable) new SQLFunctionInE().execute(vertices.get(3), null, null, + new Object[] {}, new BasicCommandContext().setDatabase(graph))).iterator(); final Set result = new HashSet<>(); while (iterator.hasNext()) { @@ -97,8 +91,8 @@ public void testBothE() throws Exception { TestHelper.executeInNewDatabase("testBothE", (graph) -> { setUpDatabase(graph); - final Iterator iterator = ((Iterable) new SQLFunctionBothE().execute(vertices.get(3), null, null, new Object[] {}, - new BasicCommandContext().setDatabase(graph))).iterator(); + final Iterator iterator = ((Iterable) new SQLFunctionBothE().execute(vertices.get(3), null, null, + new Object[] {}, new BasicCommandContext().setDatabase(graph))).iterator(); final Set result = new HashSet<>(); while (iterator.hasNext()) { @@ -120,8 +114,8 @@ public void testBoth() throws Exception { TestHelper.executeInNewDatabase("testBoth", (graph) -> { setUpDatabase(graph); - final Iterator iterator = ((Iterable) new SQLFunctionBoth().execute(vertices.get(3), null, null, new Object[] {}, - new BasicCommandContext().setDatabase(graph))).iterator(); + final Iterator iterator = ((Iterable) new SQLFunctionBoth().execute(vertices.get(3), null, null, + new Object[] {}, new BasicCommandContext().setDatabase(graph))).iterator(); final Set result = new HashSet<>(); while (iterator.hasNext()) { @@ -143,8 +137,8 @@ public void testOut() throws Exception { TestHelper.executeInNewDatabase("testOut", (graph) -> { setUpDatabase(graph); - final Iterator iterator = ((Iterable) new SQLFunctionOut().execute(vertices.get(3), null, null, new Object[] {}, - new BasicCommandContext().setDatabase(graph))).iterator(); + final Iterator iterator = ((Iterable) new SQLFunctionOut().execute(vertices.get(3), null, null, + new Object[] {}, new BasicCommandContext().setDatabase(graph))).iterator(); final Set result = new HashSet<>(); while (iterator.hasNext()) { @@ -165,8 +159,8 @@ public void testIn() throws Exception { TestHelper.executeInNewDatabase("testIn", (graph) -> { setUpDatabase(graph); - final Iterator iterator = ((Iterable) new SQLFunctionIn().execute(vertices.get(3), null, null, new Object[] {}, - new BasicCommandContext().setDatabase(graph))).iterator(); + final Iterator iterator = ((Iterable) new SQLFunctionIn().execute(vertices.get(3), null, null, + new Object[] {}, new BasicCommandContext().setDatabase(graph))).iterator(); final Set result = new HashSet<>(); while (iterator.hasNext()) { @@ -186,7 +180,8 @@ public void testOutV() throws Exception { TestHelper.executeInNewDatabase("testOutV", (graph) -> { setUpDatabase(graph); - final Vertex v = (Vertex) new SQLFunctionOutV().execute(edges.get(3), null, null, new Object[] {}, new BasicCommandContext().setDatabase(graph)); + final Vertex v = (Vertex) new SQLFunctionOutV().execute(edges.get(3), null, null, new Object[] {}, + new BasicCommandContext().setDatabase(graph)); assertThat(vertices.get(3).getIdentity()).isEqualTo(v.getIdentity()); }); @@ -197,7 +192,8 @@ public void testInV() throws Exception { TestHelper.executeInNewDatabase("testInV", (graph) -> { setUpDatabase(graph); - final Vertex v = (Vertex) new SQLFunctionInV().execute(edges.get(3), null, null, new Object[] {}, new BasicCommandContext().setDatabase(graph)); + final Vertex v = (Vertex) new SQLFunctionInV().execute(edges.get(3), null, null, new Object[] {}, + new BasicCommandContext().setDatabase(graph)); assertThat(vertices.get(1).getIdentity()).isEqualTo(v.getIdentity()); }); @@ -208,8 +204,8 @@ public void testBothV() throws Exception { TestHelper.executeInNewDatabase("testBothV", (graph) -> { setUpDatabase(graph); - final ArrayList iterator = (ArrayList) new SQLFunctionBothV().execute(edges.get(3), null, null, new Object[] {}, - new BasicCommandContext().setDatabase(graph)); + final ArrayList iterator = (ArrayList) new SQLFunctionBothV().execute(edges.get(3), null, null, + new Object[] {}, new BasicCommandContext().setDatabase(graph)); assertThat(iterator.contains(vertices.get(3).getIdentity())).isTrue(); assertThat(iterator.contains(vertices.get(1).getIdentity())).isTrue(); diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/graph/SQLFunctionAstarTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/graph/SQLFunctionAstarTest.java similarity index 98% rename from engine/src/test/java/com/arcadedb/query/sql/functions/graph/SQLFunctionAstarTest.java rename to engine/src/test/java/com/arcadedb/query/sql/function/graph/SQLFunctionAstarTest.java index 5df39e18f..6224de233 100755 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/graph/SQLFunctionAstarTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/function/graph/SQLFunctionAstarTest.java @@ -16,7 +16,7 @@ * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) * SPDX-License-Identifier: Apache-2.0 */ -package com.arcadedb.query.sql.functions.graph; +package com.arcadedb.query.sql.function.graph; import com.arcadedb.TestHelper; import com.arcadedb.database.Database; @@ -26,15 +26,15 @@ import com.arcadedb.query.sql.executor.BasicCommandContext; import com.arcadedb.query.sql.executor.Result; import com.arcadedb.query.sql.executor.ResultSet; -import com.arcadedb.query.sql.function.graph.SQLFunctionAstar; -import com.arcadedb.query.sql.function.graph.SQLHeuristicFormula; import org.junit.jupiter.api.Test; -import java.util.*; -import java.util.stream.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; /* * @author Saeed Tabrizi (saeed a_t nowcando.com) diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/graph/SQLFunctionDijkstraTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/graph/SQLFunctionDijkstraTest.java similarity index 91% rename from engine/src/test/java/com/arcadedb/query/sql/functions/graph/SQLFunctionDijkstraTest.java rename to engine/src/test/java/com/arcadedb/query/sql/function/graph/SQLFunctionDijkstraTest.java index 3f866608d..f31c85fa6 100755 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/graph/SQLFunctionDijkstraTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/function/graph/SQLFunctionDijkstraTest.java @@ -16,7 +16,7 @@ * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) * SPDX-License-Identifier: Apache-2.0 */ -package com.arcadedb.query.sql.functions.graph; +package com.arcadedb.query.sql.function.graph; import com.arcadedb.TestHelper; import com.arcadedb.database.Database; @@ -24,13 +24,11 @@ import com.arcadedb.graph.MutableVertex; import com.arcadedb.graph.Vertex; import com.arcadedb.query.sql.executor.BasicCommandContext; -import com.arcadedb.query.sql.function.graph.SQLFunctionDijkstra; import org.junit.jupiter.api.Test; -import java.util.*; +import java.util.List; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; public class SQLFunctionDijkstraTest { @@ -79,7 +77,8 @@ public void setUp(final Database graph) throws Exception { public void testExecute() throws Exception { TestHelper.executeInNewDatabase("SQLFunctionDijkstraTest", (graph) -> { setUp(graph); - final List result = functionDijkstra.execute(null, null, null, new Object[] { v1, v4, "'weight'" }, new BasicCommandContext()); + final List result = functionDijkstra.execute(null, null, null, new Object[] { v1, v4, "'weight'" }, + new BasicCommandContext()); assertThat(result).hasSize(4); assertThat(result.get(0)).isEqualTo(v1); diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/graph/SQLFunctionShortestPathTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/graph/SQLFunctionShortestPathTest.java similarity index 83% rename from engine/src/test/java/com/arcadedb/query/sql/functions/graph/SQLFunctionShortestPathTest.java rename to engine/src/test/java/com/arcadedb/query/sql/function/graph/SQLFunctionShortestPathTest.java index 0b0d63e01..99748b5a7 100755 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/graph/SQLFunctionShortestPathTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/function/graph/SQLFunctionShortestPathTest.java @@ -16,21 +16,21 @@ * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) * SPDX-License-Identifier: Apache-2.0 */ -package com.arcadedb.query.sql.functions.graph; +package com.arcadedb.query.sql.function.graph; import com.arcadedb.TestHelper; import com.arcadedb.database.Database; import com.arcadedb.database.RID; import com.arcadedb.graph.MutableVertex; import com.arcadedb.query.sql.executor.BasicCommandContext; -import com.arcadedb.query.sql.function.graph.SQLFunctionShortestPath; import org.junit.jupiter.api.Test; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; -import static java.util.Arrays.*; +import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; public class SQLFunctionShortestPathTest { @@ -43,7 +43,8 @@ public void testExecute() throws Exception { setUpDatabase(graph); function = new SQLFunctionShortestPath(); - final List result = function.execute(null, null, null, new Object[] { vertices.get(1), vertices.get(4) }, new BasicCommandContext()); + final List result = function.execute(null, null, null, new Object[] { vertices.get(1), vertices.get(4) }, + new BasicCommandContext()); assertThat(result).hasSize(3); assertThat(result.get(0)).isEqualTo(vertices.get(1).getIdentity()); assertThat(result.get(1)).isEqualTo(vertices.get(3).getIdentity()); @@ -57,7 +58,8 @@ public void testExecuteOut() throws Exception { setUpDatabase(graph); function = new SQLFunctionShortestPath(); - final List result = function.execute(null, null, null, new Object[] { vertices.get(1), vertices.get(4), "out", null }, new BasicCommandContext()); + final List result = function.execute(null, null, null, new Object[] { vertices.get(1), vertices.get(4), "out", null }, + new BasicCommandContext()); assertThat(result).hasSize(4); assertThat(result.get(0)).isEqualTo(vertices.get(1).getIdentity()); @@ -73,7 +75,8 @@ public void testExecuteOnlyEdge1() throws Exception { setUpDatabase(graph); function = new SQLFunctionShortestPath(); - final List result = function.execute(null, null, null, new Object[] { vertices.get(1), vertices.get(4), null, "Edge1" }, new BasicCommandContext()); + final List result = function.execute(null, null, null, new Object[] { vertices.get(1), vertices.get(4), null, "Edge1" }, + new BasicCommandContext()); assertThat(result).hasSize(4); assertThat(result.get(0)).isEqualTo(vertices.get(1).getIdentity()); @@ -89,8 +92,8 @@ public void testExecuteOnlyEdge1AndEdge2() throws Exception { setUpDatabase(graph); function = new SQLFunctionShortestPath(); - final List result = function - .execute(null, null, null, new Object[] { vertices.get(1), vertices.get(4), "BOTH", asList("Edge1", "Edge2") }, new BasicCommandContext()); + final List result = function.execute(null, null, null, + new Object[] { vertices.get(1), vertices.get(4), "BOTH", asList("Edge1", "Edge2") }, new BasicCommandContext()); assertThat(result).hasSize(3); assertThat(result.get(0)).isEqualTo(vertices.get(1).getIdentity()); @@ -105,7 +108,8 @@ public void testLong() throws Exception { setUpDatabase(graph); function = new SQLFunctionShortestPath(); - final List result = function.execute(null, null, null, new Object[] { vertices.get(1), vertices.get(20) }, new BasicCommandContext()); + final List result = function.execute(null, null, null, new Object[] { vertices.get(1), vertices.get(20) }, + new BasicCommandContext()); assertThat(result).hasSize(11); assertThat(result.get(0)).isEqualTo(vertices.get(1).getIdentity()); @@ -125,8 +129,8 @@ public void testMaxDepth1() throws Exception { final Map additionalParams = new HashMap(); additionalParams.put(SQLFunctionShortestPath.PARAM_MAX_DEPTH, 11); - final List result = function - .execute(null, null, null, new Object[] { vertices.get(1), vertices.get(20), null, null, additionalParams }, new BasicCommandContext()); + final List result = function.execute(null, null, null, + new Object[] { vertices.get(1), vertices.get(20), null, null, additionalParams }, new BasicCommandContext()); assertThat(result).hasSize(11); }); @@ -140,8 +144,8 @@ public void testMaxDepth2() throws Exception { final Map additionalParams = new HashMap(); additionalParams.put(SQLFunctionShortestPath.PARAM_MAX_DEPTH, 12); - final List result = function - .execute(null, null, null, new Object[] { vertices.get(1), vertices.get(20), null, null, additionalParams }, new BasicCommandContext()); + final List result = function.execute(null, null, null, + new Object[] { vertices.get(1), vertices.get(20), null, null, additionalParams }, new BasicCommandContext()); assertThat(result).hasSize(11); }); @@ -155,8 +159,8 @@ public void testMaxDepth3() throws Exception { final Map additionalParams = new HashMap(); additionalParams.put(SQLFunctionShortestPath.PARAM_MAX_DEPTH, 10); - final List result = function - .execute(null, null, null, new Object[] { vertices.get(1), vertices.get(20), null, null, additionalParams }, new BasicCommandContext()); + final List result = function.execute(null, null, null, + new Object[] { vertices.get(1), vertices.get(20), null, null, additionalParams }, new BasicCommandContext()); assertThat(result).isEmpty(); }); @@ -170,8 +174,8 @@ public void testMaxDepth4() throws Exception { final Map additionalParams = new HashMap(); additionalParams.put(SQLFunctionShortestPath.PARAM_MAX_DEPTH, 3); - final List result = function - .execute(null, null, null, new Object[] { vertices.get(1), vertices.get(20), null, null, additionalParams }, new BasicCommandContext()); + final List result = function.execute(null, null, null, + new Object[] { vertices.get(1), vertices.get(20), null, null, additionalParams }, new BasicCommandContext()); assertThat(result).isEmpty(); }); diff --git a/engine/src/test/java/com/arcadedb/query/sql/function/math/SQLFunctionAbsoluteValueTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/math/SQLFunctionAbsoluteValueTest.java new file mode 100644 index 000000000..c7b1541d5 --- /dev/null +++ b/engine/src/test/java/com/arcadedb/query/sql/function/math/SQLFunctionAbsoluteValueTest.java @@ -0,0 +1,189 @@ +/* + * Copyright © 2021-present Arcade Data Ltd (info@arcadedata.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) + * SPDX-License-Identifier: Apache-2.0 + */ +package com.arcadedb.query.sql.function.math; + +import com.arcadedb.TestHelper; +import com.arcadedb.query.sql.executor.ResultSet; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.math.BigInteger; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; + +/** + * Tests the absolute value function. The key is that the mathematical abs function is correctly + * applied and that values retain their types. + * + * @author Michael MacFadden + */ +public class SQLFunctionAbsoluteValueTest { + + private SQLFunctionAbsoluteValue function; + + @BeforeEach + public void setup() { + function = new SQLFunctionAbsoluteValue(); + } + + @Test + public void testEmpty() { + final Object result = function.getResult(); + assertThat(result).isNull(); + } + + @Test + public void testNull() { + function.execute(null, null, null, new Object[] { null }, null); + final Object result = function.getResult(); + assertThat(result).isNull(); + } + + @Test + public void testPositiveInteger() { + function.execute(null, null, null, new Object[] { 10 }, null); + final Object result = function.getResult(); + assertThat(result instanceof Integer).isTrue(); + assertThat(result).isEqualTo(10); + } + + @Test + public void testNegativeInteger() { + function.execute(null, null, null, new Object[] { -10 }, null); + final Object result = function.getResult(); + assertThat(result instanceof Integer).isTrue(); + assertThat(result).isEqualTo(10); + } + + @Test + public void testPositiveLong() { + function.execute(null, null, null, new Object[] { 10L }, null); + final Object result = function.getResult(); + assertThat(result instanceof Long).isTrue(); + assertThat(result).isEqualTo(10L); + } + + @Test + public void testNegativeLong() { + function.execute(null, null, null, new Object[] { -10L }, null); + final Object result = function.getResult(); + assertThat(result instanceof Long).isTrue(); + assertThat(result).isEqualTo(10L); + } + + @Test + public void testPositiveShort() { + function.execute(null, null, null, new Object[] { (short) 10 }, null); + final Object result = function.getResult(); + assertThat(result instanceof Short).isTrue(); + assertThat((short) 10).isEqualTo(result); + } + + @Test + public void testNegativeShort() { + function.execute(null, null, null, new Object[] { (short) -10 }, null); + final Object result = function.getResult(); + assertThat(result instanceof Short).isTrue(); + assertThat((short) 10).isEqualTo(result); + } + + @Test + public void testPositiveDouble() { + function.execute(null, null, null, new Object[] { 10.5D }, null); + final Object result = function.getResult(); + assertThat(result instanceof Double).isTrue(); + assertThat(result).isEqualTo(10.5D); + } + + @Test + public void testNegativeDouble() { + function.execute(null, null, null, new Object[] { -10.5D }, null); + final Object result = function.getResult(); + assertThat(result instanceof Double).isTrue(); + assertThat(result).isEqualTo(10.5D); + } + + @Test + public void testPositiveFloat() { + function.execute(null, null, null, new Object[] { 10.5F }, null); + final Object result = function.getResult(); + assertThat(result instanceof Float).isTrue(); + assertThat(result).isEqualTo(10.5F); + } + + @Test + public void testNegativeFloat() { + function.execute(null, null, null, new Object[] { -10.5F }, null); + final Object result = function.getResult(); + assertThat(result instanceof Float).isTrue(); + assertThat(result).isEqualTo(10.5F); + } + + @Test + public void testPositiveBigDecimal() { + function.execute(null, null, null, new Object[] { new BigDecimal("10.5") }, null); + final Object result = function.getResult(); + assertThat(result instanceof BigDecimal).isTrue(); + assertThat(new BigDecimal("10.5")).isEqualTo(result); + } + + @Test + public void testNegativeBigDecimal() { + function.execute(null, null, null, new Object[] { BigDecimal.valueOf(-10.5D) }, null); + final Object result = function.getResult(); + assertThat(result instanceof BigDecimal).isTrue(); + assertThat(new BigDecimal("10.5")).isEqualTo(result); + } + + @Test + public void testPositiveBigInteger() { + function.execute(null, null, null, new Object[] { new BigInteger("10") }, null); + final Object result = function.getResult(); + assertThat(result instanceof BigInteger).isTrue(); + assertThat(new BigInteger("10")).isEqualTo(result); + } + + @Test + public void testNegativeBigInteger() { + function.execute(null, null, null, new Object[] { new BigInteger("-10") }, null); + final Object result = function.getResult(); + assertThat(result instanceof BigInteger).isTrue(); + assertThat(new BigInteger("10")).isEqualTo(result); + } + + @Test + public void testNonNumber() { + try { + function.execute(null, null, null, new Object[] { "abc" }, null); + fail("Expected IllegalArgumentException"); + } catch (final IllegalArgumentException e) { + // OK + } + } + + @Test + public void testFromQuery() throws Exception { + TestHelper.executeInNewDatabase("./target/databases/testAbsFunction", (db) -> { + final ResultSet result = db.query("sql", "select abs(-45.4) as abs"); + assertThat(((Number) result.next().getProperty("abs")).floatValue()).isEqualTo(45.4F); + }); + } +} diff --git a/engine/src/test/java/com/arcadedb/query/sql/function/math/SQLFunctionModeTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/math/SQLFunctionModeTest.java new file mode 100644 index 000000000..92aacd137 --- /dev/null +++ b/engine/src/test/java/com/arcadedb/query/sql/function/math/SQLFunctionModeTest.java @@ -0,0 +1,84 @@ +/* + * Copyright © 2021-present Arcade Data Ltd (info@arcadedata.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) + * SPDX-License-Identifier: Apache-2.0 + */ +package com.arcadedb.query.sql.function.math; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class SQLFunctionModeTest { + + private SQLFunctionMode mode; + + @BeforeEach + public void setup() { + mode = new SQLFunctionMode(); + } + + @Test + public void testEmpty() { + final Object result = mode.getResult(); + assertThat(result).isNull(); + } + + @Test + public void testSingleMode() { + final int[] scores = { 1, 2, 3, 3, 3, 2 }; + + for (final int s : scores) { + mode.execute(null, null, null, new Object[] { s }, null); + } + + final Object result = mode.getResult(); + assertThat((int) ((List) result).get(0)).isEqualTo(3); + } + + @Test + public void testMultiMode() { + final int[] scores = { 1, 2, 3, 3, 3, 2, 2 }; + + for (final int s : scores) { + mode.execute(null, null, null, new Object[] { s }, null); + } + + final Object result = mode.getResult(); + final List modes = (List) result; + assertThat(modes.size()).isEqualTo(2); + assertThat(modes.contains(2)).isTrue(); + assertThat(modes.contains(3)).isTrue(); + } + + @Test + public void testMultiValue() { + final List[] scores = new List[2]; + scores[0] = Arrays.asList(1, 2, null, 3, 4); + scores[1] = Arrays.asList(1, 1, 1, 2, null); + + for (final List s : scores) { + mode.execute(null, null, null, new Object[] { s }, null); + } + + final Object result = mode.getResult(); + assertThat((int) ((List) result).get(0)).isEqualTo(1); + } +} diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/math/SQLFunctionPercentileTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/math/SQLFunctionPercentileTest.java similarity index 71% rename from engine/src/test/java/com/arcadedb/query/sql/functions/math/SQLFunctionPercentileTest.java rename to engine/src/test/java/com/arcadedb/query/sql/function/math/SQLFunctionPercentileTest.java index d883a02db..873b197fd 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/math/SQLFunctionPercentileTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/function/math/SQLFunctionPercentileTest.java @@ -16,25 +16,22 @@ * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) * SPDX-License-Identifier: Apache-2.0 */ -package com.arcadedb.query.sql.functions.math; +package com.arcadedb.query.sql.function.math; -import com.arcadedb.query.sql.function.math.SQLFunctionPercentile; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import java.util.*; +import java.util.List; import static org.assertj.core.api.Assertions.assertThat; - public class SQLFunctionPercentileTest { private SQLFunctionPercentile percentile; @BeforeEach public void beforeMethod() { - percentile = - new SQLFunctionPercentile(); + percentile = new SQLFunctionPercentile(); } @Test @@ -45,22 +42,22 @@ public void testEmpty() { @Test public void testSingleValueLower() { - percentile.execute(null, null, null, new Object[] {10, .25}, null); + percentile.execute(null, null, null, new Object[] { 10, .25 }, null); assertThat(percentile.getResult()).isEqualTo(10); } @Test public void testSingleValueUpper() { - percentile.execute(null, null, null, new Object[] {10, .75}, null); + percentile.execute(null, null, null, new Object[] { 10, .75 }, null); assertThat(percentile.getResult()).isEqualTo(10); } @Test public void test50thPercentileOdd() { - final int[] scores = {1, 2, 3, 4, 5}; + final int[] scores = { 1, 2, 3, 4, 5 }; for (final int s : scores) { - percentile.execute(null, null, null, new Object[] {s, .5}, null); + percentile.execute(null, null, null, new Object[] { s, .5 }, null); } final Object result = percentile.getResult(); @@ -69,10 +66,10 @@ public void test50thPercentileOdd() { @Test public void test50thPercentileOddWithNulls() { - final Integer[] scores = {null, 1, 2, null, 3, 4, null, 5}; + final Integer[] scores = { null, 1, 2, null, 3, 4, null, 5 }; for (final Integer s : scores) { - percentile.execute(null, null, null, new Object[] {s, .5}, null); + percentile.execute(null, null, null, new Object[] { s, .5 }, null); } final Object result = percentile.getResult(); @@ -81,10 +78,10 @@ public void test50thPercentileOddWithNulls() { @Test public void test50thPercentileEven() { - final int[] scores = {1, 2, 4, 5}; + final int[] scores = { 1, 2, 4, 5 }; for (final int s : scores) { - percentile.execute(null, null, null, new Object[] {s, .5}, null); + percentile.execute(null, null, null, new Object[] { s, .5 }, null); } final Object result = percentile.getResult(); @@ -93,10 +90,10 @@ public void test50thPercentileEven() { @Test public void testFirstQuartile() { - final int[] scores = {1, 2, 3, 4, 5}; + final int[] scores = { 1, 2, 3, 4, 5 }; for (final int s : scores) { - percentile.execute(null, null, null, new Object[] {s, .25}, null); + percentile.execute(null, null, null, new Object[] { s, .25 }, null); } final Object result = percentile.getResult(); @@ -105,10 +102,10 @@ public void testFirstQuartile() { @Test public void testThirdQuartile() { - final int[] scores = {1, 2, 3, 4, 5}; + final int[] scores = { 1, 2, 3, 4, 5 }; for (final int s : scores) { - percentile.execute(null, null, null, new Object[] {s, .75}, null); + percentile.execute(null, null, null, new Object[] { s, .75 }, null); } final Object result = percentile.getResult(); @@ -117,10 +114,10 @@ public void testThirdQuartile() { @Test public void testMultiQuartile() { - final int[] scores = {1, 2, 3, 4, 5}; + final int[] scores = { 1, 2, 3, 4, 5 }; for (final int s : scores) { - percentile.execute(null, null, null, new Object[] {s, .25, .75}, null); + percentile.execute(null, null, null, new Object[] { s, .25, .75 }, null); } final List result = (List) percentile.getResult(); diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/math/SQLFunctionRandomIntTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/math/SQLFunctionRandomIntTest.java similarity index 91% rename from engine/src/test/java/com/arcadedb/query/sql/functions/math/SQLFunctionRandomIntTest.java rename to engine/src/test/java/com/arcadedb/query/sql/function/math/SQLFunctionRandomIntTest.java index 10f734f0a..c2052de66 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/math/SQLFunctionRandomIntTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/function/math/SQLFunctionRandomIntTest.java @@ -16,19 +16,17 @@ * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) * SPDX-License-Identifier: Apache-2.0 */ -package com.arcadedb.query.sql.functions.math; +package com.arcadedb.query.sql.function.math; import com.arcadedb.TestHelper; import com.arcadedb.query.sql.executor.Result; import com.arcadedb.query.sql.executor.ResultSet; -import com.arcadedb.query.sql.function.math.SQLFunctionRandomInt; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import java.util.*; +import java.util.Iterator; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertNotNull; /** * @author Luca Garulli (l.garulli@arcadedata.com) diff --git a/engine/src/test/java/com/arcadedb/query/sql/function/math/SQLFunctionSquareRootTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/math/SQLFunctionSquareRootTest.java new file mode 100644 index 000000000..24baee721 --- /dev/null +++ b/engine/src/test/java/com/arcadedb/query/sql/function/math/SQLFunctionSquareRootTest.java @@ -0,0 +1,176 @@ +/* + * Copyright © 2021-present Arcade Data Ltd (info@arcadedata.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) + * SPDX-License-Identifier: Apache-2.0 + */ +package com.arcadedb.query.sql.function.math; + +import com.arcadedb.TestHelper; +import com.arcadedb.query.sql.executor.ResultSet; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.math.BigInteger; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; + +public class SQLFunctionSquareRootTest { + + private SQLFunctionSquareRoot function; + + @BeforeEach + public void setup() { + function = new SQLFunctionSquareRoot(); + } + + @Test + public void testEmpty() { + final Object result = function.getResult(); + assertThat(result).isNull(); + } + + @Test + public void testNull() { + function.execute(null, null, null, new Object[] { null }, null); + final Object result = function.getResult(); + assertThat(result).isNull(); + } + + @Test + public void testPositiveInteger() { + function.execute(null, null, null, new Object[] { 4 }, null); + final Object result = function.getResult(); + assertThat(result instanceof Integer).isTrue(); + assertThat(result).isEqualTo(2); + } + + @Test + public void testNegativeInteger() { + function.execute(null, null, null, new Object[] { -4 }, null); + final Object result = function.getResult(); + assertThat(result).isNull(); + } + + @Test + public void testPositiveLong() { + function.execute(null, null, null, new Object[] { 4L }, null); + final Object result = function.getResult(); + assertThat(result instanceof Long).isTrue(); + assertThat(result).isEqualTo(2L); + } + + @Test + public void testNegativeLong() { + function.execute(null, null, null, new Object[] { -4L }, null); + final Object result = function.getResult(); + assertThat(result).isNull(); + } + + @Test + public void testPositiveShort() { + function.execute(null, null, null, new Object[] { (short) 4 }, null); + final Object result = function.getResult(); + assertThat(result instanceof Short).isTrue(); + assertThat((short) 2).isEqualTo(result); + } + + @Test + public void testNegativeShort() { + function.execute(null, null, null, new Object[] { (short) -4 }, null); + final Object result = function.getResult(); + assertThat(result).isNull(); + } + + @Test + public void testPositiveDouble() { + function.execute(null, null, null, new Object[] { 4.0D }, null); + final Object result = function.getResult(); + assertThat(result instanceof Double).isTrue(); + assertThat(result).isEqualTo(2.0D); + } + + @Test + public void testNegativeDouble() { + function.execute(null, null, null, new Object[] { -4.0D }, null); + final Object result = function.getResult(); + assertThat(result).isNull(); + } + + @Test + public void testPositiveFloat() { + function.execute(null, null, null, new Object[] { 4.0F }, null); + final Object result = function.getResult(); + assertThat(result instanceof Float).isTrue(); + assertThat(result).isEqualTo(2.0F); + } + + @Test + public void testNegativeFloat() { + function.execute(null, null, null, new Object[] { -4.0F }, null); + final Object result = function.getResult(); + assertThat(result).isNull(); + } + + @Test + public void testPositiveBigDecimal() { + function.execute(null, null, null, new Object[] { new BigDecimal("4.0") }, null); + final Object result = function.getResult(); + assertThat(result instanceof BigDecimal).isTrue(); + assertThat(new BigDecimal("2")).isEqualTo(result); + } + + @Test + public void testNegativeBigDecimal() { + function.execute(null, null, null, new Object[] { BigDecimal.valueOf(-4.0D) }, null); + final Object result = function.getResult(); + assertThat(result).isNull(); + } + + @Test + public void testPositiveBigInteger() { + function.execute(null, null, null, new Object[] { new BigInteger("4") }, null); + final Object result = function.getResult(); + assertThat(result instanceof BigInteger).isTrue(); + assertThat(new BigInteger("2")).isEqualTo(result); + } + + @Test + public void testNegativeBigInteger() { + function.execute(null, null, null, new Object[] { new BigInteger("-4") }, null); + final Object result = function.getResult(); + assertThat(result).isNull(); + } + + @Test + public void testNonNumber() { + try { + function.execute(null, null, null, new Object[] { "abc" }, null); + fail("Expected IllegalArgumentException"); + } catch (final IllegalArgumentException e) { + // OK + } + } + + @Test + public void testFromQuery() throws Exception { + TestHelper.executeInNewDatabase("./target/databases/testSqrtFunction", (db) -> { + final ResultSet result = db.query("sql", "select sqrt(4.0) as sqrt"); + assertThat(((Number) result.next().getProperty("sqrt")).floatValue()).isEqualTo(2.0F); + }); + } +} diff --git a/engine/src/test/java/com/arcadedb/query/sql/function/math/SQLFunctionVarianceTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/math/SQLFunctionVarianceTest.java new file mode 100644 index 000000000..34a40499b --- /dev/null +++ b/engine/src/test/java/com/arcadedb/query/sql/function/math/SQLFunctionVarianceTest.java @@ -0,0 +1,76 @@ +/* + * Copyright © 2021-present Arcade Data Ltd (info@arcadedata.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) + * SPDX-License-Identifier: Apache-2.0 + */ +package com.arcadedb.query.sql.function.math; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class SQLFunctionVarianceTest { + + private SQLFunctionVariance variance; + + @BeforeEach + public void setup() { + variance = new SQLFunctionVariance(); + } + + @Test + public void testEmpty() { + final Object result = variance.getResult(); + assertThat(result).isNull(); + } + + @Test + public void testVariance() { + final Integer[] scores = { 4, 7, 15, 3 }; + + for (final Integer s : scores) { + variance.execute(null, null, null, new Object[] { s }, null); + } + + final Object result = variance.getResult(); + assertThat(result).isEqualTo(22.1875); + } + + @Test + public void testVariance1() { + final Integer[] scores = { 4, 7 }; + + for (final Integer s : scores) { + variance.execute(null, null, null, new Object[] { s }, null); + } + + final Object result = variance.getResult(); + assertThat(result).isEqualTo(2.25); + } + + @Test + public void testVariance2() { + final Integer[] scores = { 15, 3 }; + + for (final Integer s : scores) { + variance.execute(null, null, null, new Object[] { s }, null); + } + + final Object result = variance.getResult(); + assertThat(result).isEqualTo(36.0); + } +} diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/misc/FunctionTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/misc/FunctionTest.java similarity index 96% rename from engine/src/test/java/com/arcadedb/query/sql/functions/misc/FunctionTest.java rename to engine/src/test/java/com/arcadedb/query/sql/function/misc/FunctionTest.java index 433df8c9f..1cdc61700 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/misc/FunctionTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/function/misc/FunctionTest.java @@ -16,21 +16,19 @@ * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) * SPDX-License-Identifier: Apache-2.0 */ -package com.arcadedb.query.sql.functions.misc; +package com.arcadedb.query.sql.function.misc; import com.arcadedb.TestHelper; import com.arcadedb.database.MutableDocument; import com.arcadedb.query.sql.SQLQueryEngine; import com.arcadedb.query.sql.executor.Result; import com.arcadedb.query.sql.executor.ResultSet; - -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import java.util.*; -import java.util.concurrent.atomic.*; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; -import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.assertThat; public class FunctionTest extends TestHelper { diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/misc/SQLFunctionBoolAndTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/misc/SQLFunctionBoolAndTest.java similarity index 96% rename from engine/src/test/java/com/arcadedb/query/sql/functions/misc/SQLFunctionBoolAndTest.java rename to engine/src/test/java/com/arcadedb/query/sql/function/misc/SQLFunctionBoolAndTest.java index 93b9db944..97b834892 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/misc/SQLFunctionBoolAndTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/function/misc/SQLFunctionBoolAndTest.java @@ -16,12 +16,10 @@ * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) * SPDX-License-Identifier: Apache-2.0 */ -package com.arcadedb.query.sql.functions.misc; +package com.arcadedb.query.sql.function.misc; import com.arcadedb.TestHelper; import com.arcadedb.query.sql.executor.ResultSet; - -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -160,7 +158,7 @@ public void testBoolAndNull() { result = database.query("sql", "SELECT (false AND null) as result"); assertThat(result.hasNext()).isTrue(); - assertThat((Boolean)result.next().getProperty("result")).isFalse(); + assertThat((Boolean) result.next().getProperty("result")).isFalse(); result = database.query("sql", "SELECT (null AND null) as result"); assertThat(result.hasNext()).isTrue(); @@ -168,7 +166,7 @@ public void testBoolAndNull() { result = database.query("sql", "SELECT (true OR null) as result"); assertThat(result.hasNext()).isTrue(); - assertThat((Boolean)result.next().getProperty("result")).isTrue(); + assertThat((Boolean) result.next().getProperty("result")).isTrue(); result = database.query("sql", "SELECT (false OR null) as result"); assertThat(result.hasNext()).isTrue(); diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/misc/SQLFunctionBoolOrTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/misc/SQLFunctionBoolOrTest.java similarity index 82% rename from engine/src/test/java/com/arcadedb/query/sql/functions/misc/SQLFunctionBoolOrTest.java rename to engine/src/test/java/com/arcadedb/query/sql/function/misc/SQLFunctionBoolOrTest.java index c3b39160e..51e82a4a6 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/misc/SQLFunctionBoolOrTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/function/misc/SQLFunctionBoolOrTest.java @@ -16,15 +16,13 @@ * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) * SPDX-License-Identifier: Apache-2.0 */ -package com.arcadedb.query.sql.functions.misc; +package com.arcadedb.query.sql.function.misc; import com.arcadedb.TestHelper; import com.arcadedb.query.sql.executor.ResultSet; - -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; /** * @author Luca Garulli (l.garulli@arcadedata.com) @@ -37,7 +35,7 @@ public void testBoolOr_SingleNull() { database.command("sql", "create document type doc0;"); database.command("sql", "create property doc0.bool boolean;"); database.command("sql", "insert into doc0 set bool = null;"); - ResultSet result = database.query("sql","select bool_or(bool) as bool_or from doc0;"); + ResultSet result = database.query("sql", "select bool_or(bool) as bool_or from doc0;"); assertThat(result.hasNext()).isTrue(); assertThat((Boolean) result.next().getProperty("bool_or")).isFalse(); }); @@ -49,7 +47,7 @@ public void testBoolOr_SingleTrue() { database.command("sql", "create document type doc1;"); database.command("sql", "create property doc1.bool boolean;"); database.command("sql", "insert into doc1 set bool = true;"); - ResultSet result = database.query("sql","select bool_or(bool) as bool_or from doc1;"); + ResultSet result = database.query("sql", "select bool_or(bool) as bool_or from doc1;"); assertThat(result.hasNext()).isTrue(); assertThat((Boolean) result.next().getProperty("bool_or")).isTrue(); }); @@ -61,7 +59,7 @@ public void testBoolOr_SingleFalse() { database.command("sql", "create document type doc2;"); database.command("sql", "create property doc2.bool boolean;"); database.command("sql", "insert into doc2 set bool = false;"); - ResultSet result = database.query("sql","select bool_or(bool) as bool_or from doc2;"); + ResultSet result = database.query("sql", "select bool_or(bool) as bool_or from doc2;"); assertThat(result.hasNext()).isTrue(); assertThat((Boolean) result.next().getProperty("bool_or")).isFalse(); }); @@ -73,7 +71,7 @@ public void testBoolOr_MultiNull() { database.command("sql", "create document type doc3;"); database.command("sql", "create property doc3.bool boolean;"); database.command("sql", "insert into doc3 (bool) values (null), (null), (null);"); - ResultSet result = database.query("sql","select bool_or(bool) as bool_or from doc3;"); + ResultSet result = database.query("sql", "select bool_or(bool) as bool_or from doc3;"); assertThat(result.hasNext()).isTrue(); assertThat((Boolean) result.next().getProperty("bool_or")).isFalse(); }); @@ -85,7 +83,7 @@ public void testBoolOr_MultiTrue() { database.command("sql", "create document type doc4;"); database.command("sql", "create property doc4.bool boolean;"); database.command("sql", "insert into doc4 (bool) values (false), (false), (true);"); - ResultSet result = database.query("sql","select bool_or(bool) as bool_or from doc4;"); + ResultSet result = database.query("sql", "select bool_or(bool) as bool_or from doc4;"); assertThat(result.hasNext()).isTrue(); assertThat((Boolean) result.next().getProperty("bool_or")).isTrue(); }); @@ -97,7 +95,7 @@ public void testBoolOr_MultiFalse() { database.command("sql", "create document type doc5;"); database.command("sql", "create property doc5.bool boolean;"); database.command("sql", "insert into doc5 (bool) values (false), (false), (false);"); - ResultSet result = database.query("sql","select bool_or(bool) as bool_or from doc5;"); + ResultSet result = database.query("sql", "select bool_or(bool) as bool_or from doc5;"); assertThat(result.hasNext()).isTrue(); assertThat((Boolean) result.next().getProperty("bool_or")).isFalse(); }); @@ -109,7 +107,7 @@ public void testBoolOr_MultiTrueHasNull() { database.command("sql", "create document type doc6;"); database.command("sql", "create property doc6.bool boolean;"); database.command("sql", "insert into doc6 (bool) values (false), (null), (true);"); - ResultSet result = database.query("sql","select bool_or(bool) as bool_or from doc6;"); + ResultSet result = database.query("sql", "select bool_or(bool) as bool_or from doc6;"); assertThat(result.hasNext()).isTrue(); assertThat((Boolean) result.next().getProperty("bool_or")).isTrue(); }); @@ -121,7 +119,7 @@ public void testBoolOr_MultiFalseHasNull() { database.command("sql", "create document type doc7;"); database.command("sql", "create property doc7.bool boolean;"); database.command("sql", "insert into doc7 (bool) values (false), (null), (false);"); - ResultSet result = database.query("sql","select bool_or(bool) as bool_or from doc7;"); + ResultSet result = database.query("sql", "select bool_or(bool) as bool_or from doc7;"); assertThat(result.hasNext()).isTrue(); assertThat((Boolean) result.next().getProperty("bool_or")).isFalse(); }); @@ -133,7 +131,7 @@ public void testBoolOr_MultiNullIsNull() { database.command("sql", "create document type doc8;"); database.command("sql", "create property doc8.bool boolean;"); database.command("sql", "insert into doc8 (bool) values (null), (null), (null);"); - ResultSet result = database.query("sql","select bool_or((bool is not null)) as bool_or from doc8;"); + ResultSet result = database.query("sql", "select bool_or((bool is not null)) as bool_or from doc8;"); assertThat(result.hasNext()).isTrue(); assertThat((Boolean) result.next().getProperty("bool_or")).isFalse(); }); @@ -145,7 +143,7 @@ public void testBoolOr_MultiHasNull() { database.command("sql", "create document type doc9;"); database.command("sql", "create property doc9.bool boolean;"); database.command("sql", "insert into doc9 (bool) values (true), (null), (false);"); - ResultSet result = database.query("sql","select bool_or((bool is null)) as bool_or from doc9;"); + ResultSet result = database.query("sql", "select bool_or((bool is null)) as bool_or from doc9;"); assertThat(result.hasNext()).isTrue(); assertThat((Boolean) result.next().getProperty("bool_or")).isTrue(); }); diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/misc/SQLFunctionCoalesceTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/misc/SQLFunctionCoalesceTest.java similarity index 91% rename from engine/src/test/java/com/arcadedb/query/sql/functions/misc/SQLFunctionCoalesceTest.java rename to engine/src/test/java/com/arcadedb/query/sql/function/misc/SQLFunctionCoalesceTest.java index 8ca372069..5531a7ce7 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/misc/SQLFunctionCoalesceTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/function/misc/SQLFunctionCoalesceTest.java @@ -16,17 +16,15 @@ * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) * SPDX-License-Identifier: Apache-2.0 */ -package com.arcadedb.query.sql.functions.misc; +package com.arcadedb.query.sql.function.misc; import com.arcadedb.TestHelper; import com.arcadedb.query.sql.executor.ResultSet; - -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import java.util.*; +import java.util.List; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; /** * @author Luca Garulli (l.garulli@arcadedata.com) diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/misc/SQLFunctionConvertTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/misc/SQLFunctionConvertTest.java similarity index 96% rename from engine/src/test/java/com/arcadedb/query/sql/functions/misc/SQLFunctionConvertTest.java rename to engine/src/test/java/com/arcadedb/query/sql/function/misc/SQLFunctionConvertTest.java index 52b587806..e37ec51e1 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/misc/SQLFunctionConvertTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/function/misc/SQLFunctionConvertTest.java @@ -16,7 +16,7 @@ * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) * SPDX-License-Identifier: Apache-2.0 */ -package com.arcadedb.query.sql.functions.misc; +package com.arcadedb.query.sql.function.misc; import com.arcadedb.GlobalConfiguration; import com.arcadedb.TestHelper; @@ -25,13 +25,12 @@ import com.arcadedb.query.sql.executor.ResultSet; import org.junit.jupiter.api.Test; -import java.math.*; -import java.util.*; +import java.math.BigDecimal; +import java.util.Date; +import java.util.Iterator; +import java.util.List; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; /** * @author Luca Garulli (l.garulli--(at)--orientdb.com) diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/misc/SQLFunctionEncodeDecodeTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/misc/SQLFunctionEncodeDecodeTest.java similarity index 86% rename from engine/src/test/java/com/arcadedb/query/sql/functions/misc/SQLFunctionEncodeDecodeTest.java rename to engine/src/test/java/com/arcadedb/query/sql/function/misc/SQLFunctionEncodeDecodeTest.java index 23b4ab902..80d5c91b2 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/misc/SQLFunctionEncodeDecodeTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/function/misc/SQLFunctionEncodeDecodeTest.java @@ -16,21 +16,17 @@ * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) * SPDX-License-Identifier: Apache-2.0 */ -package com.arcadedb.query.sql.functions.misc; +package com.arcadedb.query.sql.function.misc; import com.arcadedb.TestHelper; import com.arcadedb.query.sql.executor.Result; import com.arcadedb.query.sql.executor.ResultSet; -import com.arcadedb.query.sql.function.misc.SQLFunctionDecode; -import com.arcadedb.query.sql.function.misc.SQLFunctionEncode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import java.util.*; +import java.util.Iterator; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; public class SQLFunctionEncodeDecodeTest { diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/misc/SQLFunctionUUIDTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/misc/SQLFunctionUUIDTest.java similarity index 90% rename from engine/src/test/java/com/arcadedb/query/sql/functions/misc/SQLFunctionUUIDTest.java rename to engine/src/test/java/com/arcadedb/query/sql/function/misc/SQLFunctionUUIDTest.java index 156fa40f7..d093c76d4 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/misc/SQLFunctionUUIDTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/function/misc/SQLFunctionUUIDTest.java @@ -16,19 +16,17 @@ * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) * SPDX-License-Identifier: Apache-2.0 */ -package com.arcadedb.query.sql.functions.misc; +package com.arcadedb.query.sql.function.misc; import com.arcadedb.TestHelper; import com.arcadedb.query.sql.executor.Result; import com.arcadedb.query.sql.executor.ResultSet; -import com.arcadedb.query.sql.function.misc.SQLFunctionUUID; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import java.util.*; +import java.util.Iterator; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertNotNull; public class SQLFunctionUUIDTest { diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/sql/CustomSQLFunctionsTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/sql/CustomSQLFunctionsTest.java similarity index 93% rename from engine/src/test/java/com/arcadedb/query/sql/functions/sql/CustomSQLFunctionsTest.java rename to engine/src/test/java/com/arcadedb/query/sql/function/sql/CustomSQLFunctionsTest.java index b009ab97e..1668bc1f7 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/sql/CustomSQLFunctionsTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/function/sql/CustomSQLFunctionsTest.java @@ -16,19 +16,16 @@ * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) * SPDX-License-Identifier: Apache-2.0 */ -package com.arcadedb.query.sql.functions.sql; +package com.arcadedb.query.sql.function.sql; import com.arcadedb.TestHelper; import com.arcadedb.exception.CommandParsingException; import com.arcadedb.query.sql.executor.ResultSet; -import org.assertj.core.data.Offset; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatExceptionOfType; import static org.assertj.core.api.AssertionsForClassTypes.within; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; public class CustomSQLFunctionsTest { @Test diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/sql/SQLFunctionsTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/sql/SQLFunctionsTest.java similarity index 94% rename from engine/src/test/java/com/arcadedb/query/sql/functions/sql/SQLFunctionsTest.java rename to engine/src/test/java/com/arcadedb/query/sql/function/sql/SQLFunctionsTest.java index e7223ce0f..f86db08c0 100755 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/sql/SQLFunctionsTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/function/sql/SQLFunctionsTest.java @@ -16,7 +16,7 @@ * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) * SPDX-License-Identifier: Apache-2.0 */ -package com.arcadedb.query.sql.functions.sql; +package com.arcadedb.query.sql.function.sql; import com.arcadedb.database.Database; import com.arcadedb.database.DatabaseFactory; @@ -36,20 +36,24 @@ import com.arcadedb.schema.Type; import com.arcadedb.utility.CollectionUtils; import com.arcadedb.utility.FileUtils; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterEach; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import java.io.*; -import java.security.*; -import java.text.*; -import java.util.*; +import java.io.File; +import java.io.UnsupportedEncodingException; +import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; import static com.arcadedb.TestHelper.checkActiveDatabases; -import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; @@ -139,7 +143,7 @@ public void queryCountWithConditions() { for (final ResultSet it = result; it.hasNext(); ) { final Result d = it.next(); assertThat(d.getProperty("total")).isNotNull(); - assertThat(((Number) d.getProperty("total")).longValue()).isGreaterThan( 0); + assertThat(((Number) d.getProperty("total")).longValue()).isGreaterThan(0); } }); } @@ -276,7 +280,8 @@ public void queryUnionAllAsInline() { @Test public void queryComposedAggregates() { - final ResultSet result = database.command("sql", "select MIN(id) as min, max(id) as max, AVG(id) as average, sum(id) as total from Account"); + final ResultSet result = database.command("sql", + "select MIN(id) as min, max(id) as max, AVG(id) as average, sum(id) as total from Account"); assertThat(result.hasNext()).isTrue(); for (final ResultSet it = result; it.hasNext(); ) { @@ -288,13 +293,15 @@ public void queryComposedAggregates() { assertThat(((Number) d.getProperty("max")).longValue() > ((Number) d.getProperty("average")).longValue()).isTrue(); assertThat(((Number) d.getProperty("average")).longValue() >= ((Number) d.getProperty("min")).longValue()).isTrue(); - assertThat(((Number) d.getProperty("total")).longValue() >= ((Number) d.getProperty("max")).longValue()).as("Total " + d.getProperty("total") + " max " + d.getProperty("max")).isTrue(); + assertThat(((Number) d.getProperty("total")).longValue() >= ((Number) d.getProperty("max")).longValue()).as( + "Total " + d.getProperty("total") + " max " + d.getProperty("max")).isTrue(); } } @Test public void queryFormat() { - final ResultSet result = database.command("sql", "select format('%d - %s (%s)', nr, street, type, dummy ) as output from Account"); + final ResultSet result = database.command("sql", + "select format('%d - %s (%s)', nr, street, type, dummy ) as output from Account"); assertThat(result.hasNext()).isTrue(); for (final ResultSet it = result; it.hasNext(); ) { final Result d = it.next(); @@ -390,7 +397,8 @@ public void queryDate() { final String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; final SimpleDateFormat dateFormat = new SimpleDateFormat(pattern); - result = database.command("sql", "select from Account where created <= date('" + dateFormat.format(new Date()) + "', \"" + pattern + "\")"); + result = database.command("sql", + "select from Account where created <= date('" + dateFormat.format(new Date()) + "', \"" + pattern + "\")"); int count = 0; for (final ResultSet it = result; it.hasNext(); ) { @@ -420,8 +428,8 @@ public String getSyntax() { } @Override - public Object execute(final Object iThis, final Identifiable iCurrentRecord, final Object iCurrentResult, final Object[] iParams, - final CommandContext iContext) { + public Object execute(final Object iThis, final Identifiable iCurrentRecord, final Object iCurrentResult, + final Object[] iParams, final CommandContext iContext) { if (iParams[0] == null || iParams[1] == null) // CHECK BOTH EXPECTED PARAMETERS return null; @@ -452,7 +460,8 @@ public Object execute(final Object iThis, final Identifiable iCurrentRecord, fin @Test public void queryAsLong() { final long moreThanInteger = 1 + (long) Integer.MAX_VALUE; - final String sql = "select numberString.asLong() as value from ( select '" + moreThanInteger + "' as numberString from Account ) limit 1"; + final String sql = + "select numberString.asLong() as value from ( select '" + moreThanInteger + "' as numberString from Account ) limit 1"; final ResultSet result = database.command("sql", sql); assertThat(result.hasNext()).isTrue(); @@ -516,7 +525,7 @@ public void testFirstAndLastFunctionsWithMultipleValues() { assertThat(array).hasSize(4); for (final Result r : array) { assertThat(r.hasProperty("first")).isTrue(); - assertThat( r.getProperty("first")).isNotNull(); + assertThat(r.getProperty("first")).isNotNull(); assertThat(r.hasProperty("last")).isTrue(); assertThat(r.getProperty("last")).isNotNull(); diff --git a/engine/src/test/java/com/arcadedb/query/sql/function/text/SQLFunctionConcatTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/text/SQLFunctionConcatTest.java new file mode 100644 index 000000000..89edb14d7 --- /dev/null +++ b/engine/src/test/java/com/arcadedb/query/sql/function/text/SQLFunctionConcatTest.java @@ -0,0 +1,64 @@ +package com.arcadedb.query.sql.function.text; + +import com.arcadedb.TestHelper; +import com.arcadedb.database.Database; +import com.arcadedb.query.sql.executor.ResultSet; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class SQLFunctionConcatTest { + private SQLFunctionConcat function; + + @BeforeEach + public void setup() { + function = new SQLFunctionConcat(); + } + + @Test + public void testConcatSingleField() { + function.execute(null, null, null, new Object[] { "Hello" }, null); + function.execute(null, null, null, new Object[] { "World" }, null); + Object result = function.getResult(); + assertThat(result).isEqualTo("HelloWorld"); + } + + @Test + public void testConcatWithDelimiter() { + function.execute(null, null, null, new Object[] { "Hello", " " }, null); + function.execute(null, null, null, new Object[] { "World", " " }, null); + Object result = function.getResult(); + assertThat(result).isEqualTo("Hello World"); + } + + @Test + public void testConcatEmpty() { + Object result = function.getResult(); + assertThat(result).isNull(); + } + + @Test + public void testConcatWithNullValues() { + function.execute(null, null, null, new Object[] { null, " " }, null); + function.execute(null, null, null, new Object[] { "World", " " }, null); + Object result = function.getResult(); + assertThat(result).isEqualTo("null World"); + } + + @Test + public void testQuery() throws Exception { + TestHelper.executeInNewDatabase("SQLFunctionConcat", (db) -> { + setUpDatabase(db); + ResultSet result = db.query("sql", "select concat(name, ' ') as concat from Person"); + assertThat(result.hasNext()).isTrue(); + assertThat(result.next().getProperty("concat")).isEqualTo("Alan Brian"); + }); + } + + private void setUpDatabase(Database db) { + db.command("sql", "create document type Person"); + db.command("sql", "insert into Person set name = 'Alan'"); + db.command("sql", "insert into Person set name = 'Brian'"); + } +} diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/text/SQLFunctionStrcmpciTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/text/SQLFunctionStrcmpciTest.java similarity index 90% rename from engine/src/test/java/com/arcadedb/query/sql/functions/text/SQLFunctionStrcmpciTest.java rename to engine/src/test/java/com/arcadedb/query/sql/function/text/SQLFunctionStrcmpciTest.java index 094bddc94..5a1bc30ee 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/text/SQLFunctionStrcmpciTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/function/text/SQLFunctionStrcmpciTest.java @@ -16,17 +16,13 @@ * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) * SPDX-License-Identifier: Apache-2.0 */ -package com.arcadedb.query.sql.functions.text; +package com.arcadedb.query.sql.function.text; import com.arcadedb.TestHelper; import com.arcadedb.query.sql.executor.ResultSet; -import com.arcadedb.query.sql.function.text.SQLFunctionStrcmpci; - -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.assertThat; /** @@ -49,7 +45,7 @@ public void testEmpty() { @Test public void testResult() { - assertThat(function.execute(null, null, null, new String[]{"ThisIsATest", "THISISATEST"}, null)).isEqualTo(0); + assertThat(function.execute(null, null, null, new String[] { "ThisIsATest", "THISISATEST" }, null)).isEqualTo(0); } @Test diff --git a/engine/src/test/java/com/arcadedb/query/sql/function/time/SQLFunctionDurationTest.java b/engine/src/test/java/com/arcadedb/query/sql/function/time/SQLFunctionDurationTest.java new file mode 100644 index 000000000..abfe561a3 --- /dev/null +++ b/engine/src/test/java/com/arcadedb/query/sql/function/time/SQLFunctionDurationTest.java @@ -0,0 +1,60 @@ +package com.arcadedb.query.sql.function.time; + +import com.arcadedb.TestHelper; +import com.arcadedb.exception.SerializationException; +import com.arcadedb.query.sql.executor.BasicCommandContext; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.time.Duration; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class SQLFunctionDurationTest { + + private SQLFunctionDuration function; + + @BeforeEach + public void setup() { + function = new SQLFunctionDuration(); + } + + @Test + public void testDurationWithValidParameters() throws Exception { + TestHelper.executeInNewDatabase((db) -> { + db.command("sql", "alter database `arcadedb.dateTimeImplementation` `java.time.LocalDateTime`"); + db.command("sql", "alter database `arcadedb.dateImplementation` `java.time.LocalDate`"); + + final BasicCommandContext context = new BasicCommandContext(); + context.setDatabase(db); + + Object result = function.execute(null, null, null, new Object[] { 5, "second" }, context); + assertThat(result).isEqualTo(Duration.ofSeconds(5)); + + result = function.execute(null, null, null, new Object[] { 2, "minute" }, null); + assertThat(result).isEqualTo(Duration.ofMinutes(2)); + }); + + } + + @Test + public void testDurationWithInvalidAmount() { + + assertThatThrownBy(() -> function.execute(null, null, null, new Object[] { "invalid", "SECONDS" }, null)).isInstanceOf( + IllegalArgumentException.class).hasMessageContaining("invalid"); + + } + + @Test + public void testDurationWithInvalidTimeUnit() { + assertThatThrownBy(() -> function.execute(null, null, null, new Object[] { 5, "INVALID_UNIT" }, null)).isInstanceOf( + SerializationException.class).hasMessageContaining("Unsupported datetime precision 'INVALID_UNIT'"); + } + + @Test + public void testDurationWithIncorrectNumberOfParameters() { + assertThatThrownBy(() -> function.execute(null, null, null, new Object[] { 5 }, null)).isInstanceOf( + IllegalArgumentException.class).hasMessageContaining("duration() function expected 2 parameters: amount and time-unit"); + } +} diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/coll/SQLFunctionDifferenceTest.java b/engine/src/test/java/com/arcadedb/query/sql/functions/coll/SQLFunctionDifferenceTest.java deleted file mode 100644 index d4625a4ee..000000000 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/coll/SQLFunctionDifferenceTest.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright © 2021-present Arcade Data Ltd (info@arcadedata.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) - * SPDX-License-Identifier: Apache-2.0 - */ -package com.arcadedb.query.sql.functions.coll; - -import com.arcadedb.query.sql.executor.BasicCommandContext; -import com.arcadedb.query.sql.function.coll.SQLFunctionDifference; -import org.junit.jupiter.api.Test; - -import java.util.*; - -import static org.assertj.core.api.Assertions.assertThat; - - -/** - * @author edegtyarenko - * @since 11.10.12 14:40 - */ -public class SQLFunctionDifferenceTest { - - @Test - public void testExecute() { - final SQLFunctionDifference function = new SQLFunctionDifference(); - - List> incomes = Arrays.asList( - Arrays.asList(1, 2, 3, 4, 5, 1), - Arrays.asList(3, 5, 6, 7, 0, 1, 3, 3, 6), - Arrays.asList(2, 2, 8, 9)); - - Set expectedResult = new HashSet(Arrays.asList(4)); - - Set actualResult = (Set) - function.execute(null, null, null, incomes.toArray(), new BasicCommandContext()); - - assertThat(actualResult).isEqualTo(expectedResult); - - incomes = Arrays.asList( - Arrays.asList(1, 2, 3, 4, 5, 1), - Arrays.asList(3, 5, 6, 7, 0, 1, 3, 3, 6)); - - expectedResult = new HashSet<>(Arrays.asList(2, 4)); - - actualResult = - (Set) - function.execute(null, null, null, incomes.toArray(), new BasicCommandContext()); - - assertThat(actualResult).isEqualTo(expectedResult); - } - -} diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/math/SQLFunctionAbsoluteValueTest.java b/engine/src/test/java/com/arcadedb/query/sql/functions/math/SQLFunctionAbsoluteValueTest.java deleted file mode 100644 index c57d6ddd4..000000000 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/math/SQLFunctionAbsoluteValueTest.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright © 2021-present Arcade Data Ltd (info@arcadedata.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) - * SPDX-License-Identifier: Apache-2.0 - */ -package com.arcadedb.query.sql.functions.math; - -import com.arcadedb.TestHelper; -import com.arcadedb.query.sql.executor.ResultSet; -import com.arcadedb.query.sql.function.math.SQLFunctionAbsoluteValue; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.math.BigDecimal; -import java.math.BigInteger; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** - * Tests the absolute value function. The key is that the mathematical abs function is correctly - * applied and that values retain their types. - * - * @author Michael MacFadden - */ -public class SQLFunctionAbsoluteValueTest { - - private SQLFunctionAbsoluteValue function; - - @BeforeEach - public void setup() { - function = new SQLFunctionAbsoluteValue(); - } - - @Test - public void testEmpty() { - final Object result = function.getResult(); - assertThat(result).isNull(); - } - - @Test - public void testNull() { - function.execute(null, null, null, new Object[]{null}, null); - final Object result = function.getResult(); - assertThat(result).isNull(); - } - - @Test - public void testPositiveInteger() { - function.execute(null, null, null, new Object[]{10}, null); - final Object result = function.getResult(); - assertThat(result instanceof Integer).isTrue(); - assertThat(result).isEqualTo(10); - } - - @Test - public void testNegativeInteger() { - function.execute(null, null, null, new Object[]{-10}, null); - final Object result = function.getResult(); - assertThat(result instanceof Integer).isTrue(); - assertThat(result).isEqualTo(10); - } - - @Test - public void testPositiveLong() { - function.execute(null, null, null, new Object[]{10L}, null); - final Object result = function.getResult(); - assertThat(result instanceof Long).isTrue(); - assertThat(result).isEqualTo(10L); - } - - @Test - public void testNegativeLong() { - function.execute(null, null, null, new Object[]{-10L}, null); - final Object result = function.getResult(); - assertThat(result instanceof Long).isTrue(); - assertThat(result).isEqualTo(10L); - } - - @Test - public void testPositiveShort() { - function.execute(null, null, null, new Object[]{(short) 10}, null); - final Object result = function.getResult(); - assertThat(result instanceof Short).isTrue(); - assertThat((short) 10).isEqualTo(result); - } - - @Test - public void testNegativeShort() { - function.execute(null, null, null, new Object[]{(short) -10}, null); - final Object result = function.getResult(); - assertThat(result instanceof Short).isTrue(); - assertThat((short) 10).isEqualTo(result); - } - - @Test - public void testPositiveDouble() { - function.execute(null, null, null, new Object[]{10.5D}, null); - final Object result = function.getResult(); - assertThat(result instanceof Double).isTrue(); - assertThat(result).isEqualTo(10.5D); - } - - @Test - public void testNegativeDouble() { - function.execute(null, null, null, new Object[]{-10.5D}, null); - final Object result = function.getResult(); - assertThat(result instanceof Double).isTrue(); - assertThat(result).isEqualTo(10.5D); - } - - @Test - public void testPositiveFloat() { - function.execute(null, null, null, new Object[]{10.5F}, null); - final Object result = function.getResult(); - assertThat(result instanceof Float).isTrue(); - assertThat(result).isEqualTo(10.5F); - } - - @Test - public void testNegativeFloat() { - function.execute(null, null, null, new Object[]{-10.5F}, null); - final Object result = function.getResult(); - assertThat(result instanceof Float).isTrue(); - assertThat(result).isEqualTo(10.5F); - } - - @Test - public void testPositiveBigDecimal() { - function.execute(null, null, null, new Object[]{new BigDecimal("10.5")}, null); - final Object result = function.getResult(); - assertThat(result instanceof BigDecimal).isTrue(); - assertThat(new BigDecimal("10.5")).isEqualTo(result); - } - - @Test - public void testNegativeBigDecimal() { - function.execute(null, null, null, new Object[]{BigDecimal.valueOf(-10.5D)}, null); - final Object result = function.getResult(); - assertThat(result instanceof BigDecimal).isTrue(); - assertThat(new BigDecimal("10.5")).isEqualTo(result); - } - - @Test - public void testPositiveBigInteger() { - function.execute(null, null, null, new Object[]{new BigInteger("10")}, null); - final Object result = function.getResult(); - assertThat(result instanceof BigInteger).isTrue(); - assertThat(new BigInteger("10")).isEqualTo(result); - } - - @Test - public void testNegativeBigInteger() { - function.execute(null, null, null, new Object[]{new BigInteger("-10")}, null); - final Object result = function.getResult(); - assertThat(result instanceof BigInteger).isTrue(); - assertThat(new BigInteger("10")).isEqualTo(result); - } - - @Test - public void testNonNumber() { - try { - function.execute(null, null, null, new Object[]{"abc"}, null); - fail("Expected IllegalArgumentException"); - } catch (final IllegalArgumentException e) { - // OK - } - } - - @Test - public void testFromQuery() throws Exception { - TestHelper.executeInNewDatabase("./target/databases/testAbsFunction", (db) -> { - final ResultSet result = db.query("sql", "select abs(-45.4) as abs"); - assertThat(((Number) result.next().getProperty("abs")).floatValue()).isEqualTo(45.4F); - }); - } -} diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/math/SQLFunctionModeTest.java b/engine/src/test/java/com/arcadedb/query/sql/functions/math/SQLFunctionModeTest.java deleted file mode 100644 index 7408c22f8..000000000 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/math/SQLFunctionModeTest.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright © 2021-present Arcade Data Ltd (info@arcadedata.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) - * SPDX-License-Identifier: Apache-2.0 - */ -package com.arcadedb.query.sql.functions.math; - -import com.arcadedb.query.sql.function.math.SQLFunctionMode; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.*; - -import static org.assertj.core.api.Assertions.assertThat; - -public class SQLFunctionModeTest { - - private SQLFunctionMode mode; - - @BeforeEach - public void setup() { - mode = new SQLFunctionMode(); - } - - @Test - public void testEmpty() { - final Object result = mode.getResult(); - assertThat(result).isNull(); - } - - @Test - public void testSingleMode() { - final int[] scores = {1, 2, 3, 3, 3, 2}; - - for (final int s : scores) { - mode.execute(null, null, null, new Object[]{s}, null); - } - - final Object result = mode.getResult(); - assertThat((int) ((List) result).get(0)).isEqualTo(3); - } - - @Test - public void testMultiMode() { - final int[] scores = {1, 2, 3, 3, 3, 2, 2}; - - for (final int s : scores) { - mode.execute(null, null, null, new Object[]{s}, null); - } - - final Object result = mode.getResult(); - final List modes = (List) result; - assertThat(modes.size()).isEqualTo(2); - assertThat(modes.contains(2)).isTrue(); - assertThat(modes.contains(3)).isTrue(); - } - - @Test - public void testMultiValue() { - final List[] scores = new List[2]; - scores[0] = Arrays.asList(1, 2, null, 3, 4); - scores[1] = Arrays.asList(1, 1, 1, 2, null); - - for (final List s : scores) { - mode.execute(null, null, null, new Object[]{s}, null); - } - - final Object result = mode.getResult(); - assertThat((int) ((List) result).get(0)).isEqualTo(1); - } -} diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/math/SQLFunctionSquareRootTest.java b/engine/src/test/java/com/arcadedb/query/sql/functions/math/SQLFunctionSquareRootTest.java deleted file mode 100644 index 223c34b75..000000000 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/math/SQLFunctionSquareRootTest.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright © 2021-present Arcade Data Ltd (info@arcadedata.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) - * SPDX-License-Identifier: Apache-2.0 - */ -package com.arcadedb.query.sql.functions.math; - -import com.arcadedb.TestHelper; -import com.arcadedb.query.sql.executor.ResultSet; -import com.arcadedb.query.sql.function.math.SQLFunctionSquareRoot; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.math.BigDecimal; -import java.math.BigInteger; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class SQLFunctionSquareRootTest { - - private SQLFunctionSquareRoot function; - - @BeforeEach - public void setup() { - function = new SQLFunctionSquareRoot(); - } - - @Test - public void testEmpty() { - final Object result = function.getResult(); - assertThat(result).isNull(); - } - - @Test - public void testNull() { - function.execute(null, null, null, new Object[]{null}, null); - final Object result = function.getResult(); - assertThat(result).isNull(); - } - - @Test - public void testPositiveInteger() { - function.execute(null, null, null, new Object[]{4}, null); - final Object result = function.getResult(); - assertThat(result instanceof Integer).isTrue(); - assertThat(result).isEqualTo(2); - } - - @Test - public void testNegativeInteger() { - function.execute(null, null, null, new Object[]{-4}, null); - final Object result = function.getResult(); - assertThat(result).isNull(); - } - - @Test - public void testPositiveLong() { - function.execute(null, null, null, new Object[]{4L}, null); - final Object result = function.getResult(); - assertThat(result instanceof Long).isTrue(); - assertThat(result).isEqualTo(2L); - } - - @Test - public void testNegativeLong() { - function.execute(null, null, null, new Object[]{-4L}, null); - final Object result = function.getResult(); - assertThat(result).isNull(); - } - - @Test - public void testPositiveShort() { - function.execute(null, null, null, new Object[]{(short) 4}, null); - final Object result = function.getResult(); - assertThat(result instanceof Short).isTrue(); - assertThat((short) 2).isEqualTo(result); - } - - @Test - public void testNegativeShort() { - function.execute(null, null, null, new Object[]{(short) -4}, null); - final Object result = function.getResult(); - assertThat(result).isNull(); - } - - @Test - public void testPositiveDouble() { - function.execute(null, null, null, new Object[]{4.0D}, null); - final Object result = function.getResult(); - assertThat(result instanceof Double).isTrue(); - assertThat(result).isEqualTo(2.0D); - } - - @Test - public void testNegativeDouble() { - function.execute(null, null, null, new Object[]{-4.0D}, null); - final Object result = function.getResult(); - assertThat(result).isNull(); - } - - @Test - public void testPositiveFloat() { - function.execute(null, null, null, new Object[]{4.0F}, null); - final Object result = function.getResult(); - assertThat(result instanceof Float).isTrue(); - assertThat(result).isEqualTo(2.0F); - } - - @Test - public void testNegativeFloat() { - function.execute(null, null, null, new Object[]{-4.0F}, null); - final Object result = function.getResult(); - assertThat(result).isNull(); - } - - @Test - public void testPositiveBigDecimal() { - function.execute(null, null, null, new Object[]{new BigDecimal("4.0")}, null); - final Object result = function.getResult(); - assertThat(result instanceof BigDecimal).isTrue(); - assertThat(new BigDecimal("2")).isEqualTo(result); - } - - @Test - public void testNegativeBigDecimal() { - function.execute(null, null, null, new Object[]{BigDecimal.valueOf(-4.0D)}, null); - final Object result = function.getResult(); - assertThat(result).isNull(); - } - - @Test - public void testPositiveBigInteger() { - function.execute(null, null, null, new Object[]{new BigInteger("4")}, null); - final Object result = function.getResult(); - assertThat(result instanceof BigInteger).isTrue(); - assertThat(new BigInteger("2")).isEqualTo(result); - } - - @Test - public void testNegativeBigInteger() { - function.execute(null, null, null, new Object[]{new BigInteger("-4")}, null); - final Object result = function.getResult(); - assertThat(result).isNull(); - } - - @Test - public void testNonNumber() { - try { - function.execute(null, null, null, new Object[]{"abc"}, null); - fail("Expected IllegalArgumentException"); - } catch (final IllegalArgumentException e) { - // OK - } - } - - @Test - public void testFromQuery() throws Exception { - TestHelper.executeInNewDatabase("./target/databases/testSqrtFunction", (db) -> { - final ResultSet result = db.query("sql", "select sqrt(4.0) as sqrt"); - assertThat(((Number) result.next().getProperty("sqrt")).floatValue()).isEqualTo(2.0F); - }); - } -} diff --git a/engine/src/test/java/com/arcadedb/query/sql/functions/math/SQLFunctionVarianceTest.java b/engine/src/test/java/com/arcadedb/query/sql/functions/math/SQLFunctionVarianceTest.java deleted file mode 100644 index f3f268dcf..000000000 --- a/engine/src/test/java/com/arcadedb/query/sql/functions/math/SQLFunctionVarianceTest.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright © 2021-present Arcade Data Ltd (info@arcadedata.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd (info@arcadedata.com) - * SPDX-License-Identifier: Apache-2.0 - */ -package com.arcadedb.query.sql.functions.math; - -import com.arcadedb.query.sql.function.math.SQLFunctionVariance; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class SQLFunctionVarianceTest { - - private SQLFunctionVariance variance; - - @BeforeEach - public void setup() { - variance = new SQLFunctionVariance(); - } - - @Test - public void testEmpty() { - final Object result = variance.getResult(); - assertThat(result).isNull(); - } - - @Test - public void testVariance() { - final Integer[] scores = {4, 7, 15, 3}; - - for (final Integer s : scores) { - variance.execute(null, null, null, new Object[]{s}, null); - } - - final Object result = variance.getResult(); - assertThat(result).isEqualTo(22.1875); - } - - @Test - public void testVariance1() { - final Integer[] scores = {4, 7}; - - for (final Integer s : scores) { - variance.execute(null, null, null, new Object[]{s}, null); - } - - final Object result = variance.getResult(); - assertThat(result).isEqualTo(2.25); - } - - @Test - public void testVariance2() { - final Integer[] scores = {15, 3}; - - for (final Integer s : scores) { - variance.execute(null, null, null, new Object[]{s}, null); - } - - final Object result = variance.getResult(); - assertThat(result).isEqualTo(36.0); - } -} diff --git a/engine/src/test/java/com/arcadedb/query/sql/method/collection/SQLMethodKeysTest.java b/engine/src/test/java/com/arcadedb/query/sql/method/collection/SQLMethodKeysTest.java index c9cfc54b4..b1f593e74 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/method/collection/SQLMethodKeysTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/method/collection/SQLMethodKeysTest.java @@ -23,7 +23,9 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import java.util.*; +import java.util.List; +import java.util.Map; +import java.util.Set; import static org.assertj.core.api.Assertions.assertThat; @@ -43,6 +45,20 @@ public void testWithResult() { resultInternal.setProperty("surname", "Bar"); final Object result = function.execute(resultInternal, null, null, null); - assertThat(result).isEqualTo(new LinkedHashSet(Arrays.asList("name", "surname"))); + assertThat(result).isEqualTo(Set.of("name", "surname")); + } + + @Test + public void testWithCollection() { + List> collection = List.of(Map.of("key1", "value1"), Map.of("key2", "value2")); + + Object result = function.execute(collection, null, null, null); + assertThat(result).isEqualTo(List.of("key1", "key2")); + } + + @Test + public void testWithNull() { + Object result = function.execute(null, null, null, null); + assertThat(result).isNull(); } } diff --git a/engine/src/test/java/com/arcadedb/query/sql/method/misc/SQLMethodPrecisionTest.java b/engine/src/test/java/com/arcadedb/query/sql/method/misc/SQLMethodPrecisionTest.java index 7a519aa1f..5cfb13025 100644 --- a/engine/src/test/java/com/arcadedb/query/sql/method/misc/SQLMethodPrecisionTest.java +++ b/engine/src/test/java/com/arcadedb/query/sql/method/misc/SQLMethodPrecisionTest.java @@ -53,21 +53,26 @@ void testRequiredArgs() { @Test void testLocalDateTime() throws Exception { - testPrecision("microsecond", () -> LocalDateTime.now()); - testPrecision("millisecond", () -> LocalDateTime.now()); + testPrecision("microsecond", LocalDateTime::now); + testPrecision("microseconds", LocalDateTime::now); + testPrecision("millisecond", LocalDateTime::now); + testPrecision("milliseconds", LocalDateTime::now); } @Test void testZonedDateTime() throws Exception { - testPrecision("microsecond", () -> ZonedDateTime.now()); - testPrecision("millisecond", () -> ZonedDateTime.now()); + testPrecision("microsecond", ZonedDateTime::now); + testPrecision("millisecond", ZonedDateTime::now); } @Test void testInstant() throws Exception { testPrecision("microsecond", () -> new NanoClock().instant()); + testPrecision("microseconds", () -> new NanoClock().instant()); testPrecision("millisecond", () -> new NanoClock().instant()); + testPrecision("milliseconds", () -> new NanoClock().instant()); testPrecision("nanosecond", () -> new NanoClock().instant()); + testPrecision("nanoseconds", () -> new NanoClock().instant()); } @Test diff --git a/integration/src/main/java/com/arcadedb/integration/exporter/ExporterSettings.java b/integration/src/main/java/com/arcadedb/integration/exporter/ExporterSettings.java index 7cc39094f..7ce57b3ca 100644 --- a/integration/src/main/java/com/arcadedb/integration/exporter/ExporterSettings.java +++ b/integration/src/main/java/com/arcadedb/integration/exporter/ExporterSettings.java @@ -20,8 +20,12 @@ import com.arcadedb.utility.FileUtils; -import java.text.*; -import java.util.*; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.Set; public class ExporterSettings { public String format; @@ -33,9 +37,6 @@ public class ExporterSettings { public Set excludeTypes; public final Map options = new HashMap<>(); - public ExporterSettings() { - } - protected void parseParameters(final String[] args) { if (args != null) for (int i = 0; i < args.length - 1; ) diff --git a/postgresw/src/main/java/com/arcadedb/postgres/PostgresNetworkExecutor.java b/postgresw/src/main/java/com/arcadedb/postgres/PostgresNetworkExecutor.java index ede2dab7b..c9368c4dd 100755 --- a/postgresw/src/main/java/com/arcadedb/postgres/PostgresNetworkExecutor.java +++ b/postgresw/src/main/java/com/arcadedb/postgres/PostgresNetworkExecutor.java @@ -44,13 +44,26 @@ import com.arcadedb.utility.FileUtils; import com.arcadedb.utility.Pair; -import java.io.*; -import java.net.*; -import java.nio.*; -import java.nio.charset.*; -import java.util.*; -import java.util.concurrent.*; -import java.util.logging.*; +import java.io.EOFException; +import java.io.IOException; +import java.net.Socket; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Random; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.logging.Level; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * Postgres Reference for Protocol Messages: https://www.postgresql.org/docs/9.6/protocol-message-formats.html @@ -150,45 +163,20 @@ public void run() { consecutiveErrors = 0; switch (type) { - case 'P': - parseCommand(); - break; - - case 'B': - bindCommand(); - break; - - case 'E': - executeCommand(); - break; - - case 'Q': - queryCommand(); - break; - - case 'S': - syncCommand(); - break; - - case 'D': - describeCommand(); - break; - - case 'C': - closeCommand(); - break; - - case 'H': - flushCommand(); - break; - - case 'X': + case 'P' -> parseCommand(); + case 'B' -> bindCommand(); + case 'E' -> executeCommand(); + case 'Q' -> queryCommand(); + case 'S' -> syncCommand(); + case 'D' -> describeCommand(); + case 'C' -> closeCommand(); + case 'H' -> flushCommand(); + case 'X' -> { // TERMINATE shutdown = true; return; - - default: - throw new PostgresProtocolException("Message '" + type + "' not managed"); + } + default -> throw new PostgresProtocolException("Message '" + type + "' not managed"); } }, 'P', 'B', 'E', 'Q', 'S', 'D', 'C', 'H', 'X'); @@ -363,9 +351,7 @@ private void queryCommand() { if (DEBUG) LogManager.instance().log(this, Level.INFO, "PSQL: query -> %s (thread=%s)", queryText, Thread.currentThread().getId()); - final String[] query = getLanguageAndQuery(queryText); - final String language = query[0]; - queryText = query[1]; + final Query query = getLanguageAndQuery(queryText); final ResultSet resultSet; if (queryText.startsWith("SET ")) { @@ -382,7 +368,7 @@ else if (queryText.equalsIgnoreCase("BEGIN") || queryText.equalsIgnoreCase("BEGI } else if (ignoreQueries.contains(queryText)) resultSet = new IteratorResultSet(Collections.emptyIterator()); else - resultSet = database.command(language, queryText); + resultSet = database.command(query.language, query.query); final List cachedResultset = browseAndCacheResultSet(resultSet, 0); @@ -813,14 +799,12 @@ private void parseCommand() { portal.columns.put("TABLE_SCHEM", PostgresType.VARCHAR); portal.columns.put("TABLE_CATALOG", PostgresType.VARCHAR); } else { - final String[] query = getLanguageAndQuery(portal.query); - final String language = query[0]; - final String queryText = query[1]; + final Query query = getLanguageAndQuery(portal.query); - switch (language) { + switch (query.language) { case "sql": final SQLQueryEngine sqlEngine = (SQLQueryEngine) database.getQueryEngine("sql"); - portal.sqlStatement = sqlEngine.parse(queryText, (DatabaseInternal) database); + portal.sqlStatement = sqlEngine.parse(query.query, (DatabaseInternal) database); if (portal.query.equalsIgnoreCase("BEGIN") || portal.query.equalsIgnoreCase("BEGIN TRANSACTION")) { explicitTransactionStarted = true; @@ -833,7 +817,7 @@ private void parseCommand() { default: portal.executed = true; - final ResultSet resultSet = database.command(language, queryText); + final ResultSet resultSet = database.command(query.language, query.query); portal.cachedResultset = browseAndCacheResultSet(resultSet, 0); portal.columns = getColumns(portal.cachedResultset); } @@ -1182,23 +1166,20 @@ private List createResultSet(final Object... elements) { return resultSet; } - private String[] getLanguageAndQuery(final String query) { + private Query getLanguageAndQuery(final String query) { String language = "sql"; String queryText = query; - if (queryText.startsWith("{cypher}")) { - language = "cypher"; - queryText = queryText.substring("{cypher}".length()); - } else if (queryText.startsWith("{gremlin}")) { - language = "gremlin"; - queryText = queryText.substring("{gremlin}".length()); - } else if (queryText.startsWith("{mongo}")) { - language = "mongo"; - queryText = queryText.substring("{mongo}".length()); - } else if (queryText.startsWith("{graphql}")) { - language = "graphql"; - queryText = queryText.substring("{graphql}".length()); + + // Regular expression to match language prefixes + Pattern pattern = Pattern.compile("\\{(\\w+)\\}"); + Matcher matcher = pattern.matcher(query); + + if (matcher.find()) { + language = matcher.group(1); + queryText = query.substring(matcher.end()); } - return new String[] { language, queryText }; + + return new Query(language, queryText); } private void emptyQueryResponse() { @@ -1213,4 +1194,8 @@ private void setErrorInTx() { if (explicitTransactionStarted) errorInTransaction = true; } + + private record Query(String language, String query) { + } + } diff --git a/server/src/main/java/com/arcadedb/server/ha/message/ServerShutdownRequest.java b/server/src/main/java/com/arcadedb/server/ha/message/ServerShutdownRequest.java index 62edc91a9..49e236305 100755 --- a/server/src/main/java/com/arcadedb/server/ha/message/ServerShutdownRequest.java +++ b/server/src/main/java/com/arcadedb/server/ha/message/ServerShutdownRequest.java @@ -21,16 +21,15 @@ import com.arcadedb.log.LogManager; import com.arcadedb.server.ha.HAServer; -import java.util.logging.*; +import java.util.logging.Level; public class ServerShutdownRequest extends HAAbstractCommand { - public ServerShutdownRequest() { - } @Override public HACommand execute(final HAServer server, final String remoteServerName, final long messageNumber) { - LogManager.instance().log(this, Level.SEVERE, "Server '%s' requested the shutdown of the server '%s'. Shutdown in progress...", null, remoteServerName, - server.getServerName()); + LogManager.instance() + .log(this, Level.SEVERE, "Server '%s' requested the shutdown of the server '%s'. Shutdown in progress...", null, + remoteServerName, server.getServerName()); server.getServer().stop(); return null; }