diff --git a/engine/src/main/java/com/arcadedb/database/RID.java b/engine/src/main/java/com/arcadedb/database/RID.java index cb035743be..0d080499aa 100644 --- a/engine/src/main/java/com/arcadedb/database/RID.java +++ b/engine/src/main/java/com/arcadedb/database/RID.java @@ -69,7 +69,7 @@ public static boolean is(final Object value) { if (value instanceof String) { final String valueAsString = value.toString(); if (valueAsString.length() > 3 && valueAsString.charAt(0) == '#') { - final String[] parts = valueAsString.split(":"); + final String[] parts = valueAsString.substring(1).split(":"); if (parts.length == 2 && NumberUtils.isIntegerNumber(parts[0]) && NumberUtils.isIntegerNumber(parts[1])) { return true; } diff --git a/engine/src/main/java/com/arcadedb/query/sql/executor/SelectExecutionPlanner.java b/engine/src/main/java/com/arcadedb/query/sql/executor/SelectExecutionPlanner.java index 5c3afaf3f8..9dc60f221e 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/executor/SelectExecutionPlanner.java +++ b/engine/src/main/java/com/arcadedb/query/sql/executor/SelectExecutionPlanner.java @@ -24,11 +24,48 @@ import com.arcadedb.index.Index; import com.arcadedb.index.RangeIndex; import com.arcadedb.index.TypeIndex; -import com.arcadedb.query.sql.parser.*; +import com.arcadedb.query.sql.parser.AggregateProjectionSplit; +import com.arcadedb.query.sql.parser.AndBlock; +import com.arcadedb.query.sql.parser.BaseExpression; +import com.arcadedb.query.sql.parser.BinaryCompareOperator; +import com.arcadedb.query.sql.parser.BinaryCondition; +import com.arcadedb.query.sql.parser.BooleanExpression; +import com.arcadedb.query.sql.parser.Bucket; +import com.arcadedb.query.sql.parser.ContainsAnyCondition; +import com.arcadedb.query.sql.parser.EqualsCompareOperator; +import com.arcadedb.query.sql.parser.Expression; +import com.arcadedb.query.sql.parser.FromClause; +import com.arcadedb.query.sql.parser.FromItem; +import com.arcadedb.query.sql.parser.FunctionCall; +import com.arcadedb.query.sql.parser.GeOperator; +import com.arcadedb.query.sql.parser.GroupBy; +import com.arcadedb.query.sql.parser.GtOperator; +import com.arcadedb.query.sql.parser.Identifier; +import com.arcadedb.query.sql.parser.InCondition; +import com.arcadedb.query.sql.parser.IndexIdentifier; +import com.arcadedb.query.sql.parser.InputParameter; +import com.arcadedb.query.sql.parser.LeOperator; +import com.arcadedb.query.sql.parser.LetClause; +import com.arcadedb.query.sql.parser.LetItem; +import com.arcadedb.query.sql.parser.LtOperator; +import com.arcadedb.query.sql.parser.OrBlock; +import com.arcadedb.query.sql.parser.OrderBy; +import com.arcadedb.query.sql.parser.OrderByItem; +import com.arcadedb.query.sql.parser.PInteger; +import com.arcadedb.query.sql.parser.Projection; +import com.arcadedb.query.sql.parser.ProjectionItem; +import com.arcadedb.query.sql.parser.RecordAttribute; +import com.arcadedb.query.sql.parser.Rid; +import com.arcadedb.query.sql.parser.SchemaIdentifier; +import com.arcadedb.query.sql.parser.SelectStatement; +import com.arcadedb.query.sql.parser.Statement; +import com.arcadedb.query.sql.parser.SubQueryCollector; +import com.arcadedb.query.sql.parser.Timeout; +import com.arcadedb.query.sql.parser.WhereClause; import com.arcadedb.schema.DocumentType; import java.util.*; -import java.util.stream.Collectors; +import java.util.stream.*; /** * @author Luigi Dell'Aquila (luigi.dellaquila-(at)-gmail.com) @@ -1117,6 +1154,10 @@ private boolean isRangeOperator(BinaryCompareOperator operator) { private void handleInputParamAsTarget(SelectExecutionPlan result, Set filterClusters, QueryPlanningInfo info, InputParameter inputParam, CommandContext ctx, boolean profilingEnabled) { Object paramValue = inputParam.getValue(ctx.getInputParameters()); + + if (paramValue instanceof String && RID.is(paramValue)) + paramValue = new RID(ctx.getDatabase(), (String) paramValue); + if (paramValue == null) { result.chain(new EmptyStep(ctx, profilingEnabled));//nothing to return } else if (paramValue instanceof DocumentType) { diff --git a/server/src/test/java/com/arcadedb/server/HTTPGraphIT.java b/server/src/test/java/com/arcadedb/server/HTTPGraphIT.java index bde2ec0a8d..f2b4682586 100644 --- a/server/src/test/java/com/arcadedb/server/HTTPGraphIT.java +++ b/server/src/test/java/com/arcadedb/server/HTTPGraphIT.java @@ -35,14 +35,10 @@ public void checkAuthenticationError() throws Exception { connection.setRequestMethod("GET"); connection.setRequestProperty("Authorization", "Basic " + Base64.getEncoder().encodeToString("root:wrong".getBytes())); - try { connection.connect(); - readResponse(connection); - Assertions.fail("Authentication was bypassed!"); - } catch (IOException e) { Assertions.assertTrue(e.toString().contains("403")); } finally { @@ -58,14 +54,10 @@ public void checkNoAuthentication() throws Exception { "http://127.0.0.1:248" + serverIndex + "/api/v1/query/graph/sql/select%20from%20V1%20limit%201").openConnection(); connection.setRequestMethod("GET"); - try { connection.connect(); - readResponse(connection); - Assertions.fail("Authentication was bypassed!"); - } catch (IOException e) { Assertions.assertTrue(e.toString().contains("403")); } finally { @@ -132,15 +124,10 @@ public void checkQueryInPost() throws Exception { try { final String response = readResponse(connection); - LogManager.instance().log(this, Level.INFO, "Response: ", null, response); - Assertions.assertEquals(200, connection.getResponseCode()); - Assertions.assertEquals("OK", connection.getResponseMessage()); - Assertions.assertTrue(response.contains("V1")); - } finally { connection.disconnect(); } @@ -160,15 +147,33 @@ public void checkCommand() throws Exception { try { final String response = readResponse(connection); - LogManager.instance().log(this, Level.INFO, "Response: ", null, response); - Assertions.assertEquals(200, connection.getResponseCode()); - Assertions.assertEquals("OK", connection.getResponseMessage()); - Assertions.assertTrue(response.contains("V1")); + } finally { + connection.disconnect(); + } + }); + } + + @Test + public void checkCommandLoadByRIDWithParameters() throws Exception { + testEachServer((serverIndex) -> { + HttpURLConnection connection = (HttpURLConnection) new URL("http://127.0.0.1:248" + serverIndex + "/api/v1/command/graph").openConnection(); + + connection.setRequestMethod("POST"); + connection.setRequestProperty("Authorization", + "Basic " + Base64.getEncoder().encodeToString(("root:" + BaseGraphServerTest.DEFAULT_PASSWORD_FOR_TESTS).getBytes())); + formatPost(connection, "sql", "SELECT FROM :rid", Collections.singletonMap("rid", "#1:0")); + connection.connect(); + try { + final String response = readResponse(connection); + LogManager.instance().log(this, Level.INFO, "Response: ", null, response); + Assertions.assertEquals(200, connection.getResponseCode()); + Assertions.assertEquals("OK", connection.getResponseMessage()); + Assertions.assertTrue(response.contains("V1")); } finally { connection.disconnect(); } @@ -188,15 +193,10 @@ public void checkRecordLoading() throws Exception { try { final String response = readResponse(connection); - LogManager.instance().log(this, Level.INFO, "Response: ", null, response); - Assertions.assertEquals(200, connection.getResponseCode()); - Assertions.assertEquals("OK", connection.getResponseMessage()); - Assertions.assertTrue(response.contains("V1")); - } finally { connection.disconnect(); } @@ -229,12 +229,9 @@ public void checkRecordCreate() throws Exception { Assertions.assertEquals(200, connection.getResponseCode()); Assertions.assertEquals("OK", connection.getResponseMessage()); - LogManager.instance().log(this, Level.INFO, "Response: ", null, response); - final JSONObject responseAsJson = new JSONObject(response); Assertions.assertTrue(responseAsJson.has("result")); - rid = responseAsJson.getString("result"); Assertions.assertTrue(rid.contains("#")); } finally { @@ -251,21 +248,14 @@ public void checkRecordCreate() throws Exception { try { final String response = readResponse(connection2); - LogManager.instance().log(this, Level.INFO, "Response: ", null, response); - final JSONObject responseAsJson = new JSONObject(response); Assertions.assertTrue(responseAsJson.has("result")); - final JSONObject object = responseAsJson.getJSONObject("result"); - Assertions.assertEquals(200, connection2.getResponseCode()); - Assertions.assertEquals("OK", connection2.getResponseMessage()); - Assertions.assertEquals(rid, object.remove("@rid").toString()); Assertions.assertEquals("d", object.remove("@cat")); - Assertions.assertEquals(payload.toMap(), object.toMap()); } finally { @@ -286,15 +276,10 @@ public void checkDatabaseExists() throws Exception { try { final String response = readResponse(connection); - LogManager.instance().log(this, Level.INFO, "Response: ", null, response); - Assertions.assertEquals(200, connection.getResponseCode()); - Assertions.assertEquals("OK", connection.getResponseMessage()); - Assertions.assertTrue(new JSONObject(response).getBoolean("result")); - } finally { connection.disconnect(); } @@ -313,16 +298,11 @@ public void checkDatabaseList() throws Exception { try { final String response = readResponse(connection); - LogManager.instance().log(this, Level.INFO, "Response: ", null, response); - Assertions.assertEquals(200, connection.getResponseCode()); - Assertions.assertEquals("OK", connection.getResponseMessage()); - JSONArray databases = new JSONObject(response).getJSONArray("result"); Assertions.assertEquals(1, databases.length()); - } finally { connection.disconnect(); }