Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adapt to new preparser API #726

Merged
merged 5 commits into from
Feb 6, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions common/src/main/java/apoc/util/LogsUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package apoc.util;

import org.neo4j.configuration.Config;
import org.neo4j.cypher.internal.CypherVersion;
import org.neo4j.cypher.internal.PreParser;
import org.neo4j.cypher.internal.ast.Statement;
import org.neo4j.cypher.internal.ast.prettifier.DefaultExpressionStringifier;
Expand All @@ -29,21 +30,20 @@
import org.neo4j.cypher.internal.parser.AstParserFactory$;
import org.neo4j.cypher.internal.rewriting.rewriters.sensitiveLiteralReplacement;
import org.neo4j.cypher.internal.util.OpenCypherExceptionFactory;
import org.neo4j.cypher.internal.util.RecordingNotificationLogger;
import scala.Option;

public class LogsUtil {
public static String sanitizeQuery(Config config, String query) {
public static String sanitizeQuery(Config config, String query, CypherVersion defaultCypherVersion) {
try {
final var exceptionFactory = new OpenCypherExceptionFactory(scala.Option.empty());
final var extension =
ExpressionStringifier.Extension$.MODULE$.simple((ExpressionStringifier$.MODULE$.failingExtender()));
final var stringifier = new DefaultExpressionStringifier(extension, false, false, false, false);
final var prettifier = new Prettifier(stringifier, Prettifier.EmptyExtension$.MODULE$, true);
var notifications = new RecordingNotificationLogger();
final var preParsed = new PreParser(CypherConfiguration.fromConfig(config)).preParse(query, notifications);
final var preParsed =
new PreParser(CypherConfiguration.fromConfig(config)).preParse(query, defaultCypherVersion);
final var statement = AstParserFactory$.MODULE$
.apply(preParsed.options().queryOptions().cypherVersion().actualVersion())
.apply(preParsed.resolvedLanguage())
.apply(preParsed.statement(), exceptionFactory, Option.apply(null))
.singleStatement();
var rewriter = sensitiveLiteralReplacement.apply(statement)._1;
Expand Down
5 changes: 2 additions & 3 deletions common/src/main/java/apoc/util/Util.java
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.neo4j.configuration.Config;
import org.neo4j.configuration.GraphDatabaseInternalSettings;
import org.neo4j.configuration.GraphDatabaseSettings;
import org.neo4j.configuration.connectors.BoltConnector;
import org.neo4j.dbms.api.DatabaseManagementService;
import org.neo4j.graphdb.Entity;
Expand Down Expand Up @@ -1374,9 +1374,8 @@ public static List<String> getCypherVersions() {
.toList();
}

public static String getCypherVersion(GraphDatabaseInternalSettings.CypherVersion version) {
public static String getCypherVersion(GraphDatabaseSettings.CypherVersion version) {
return switch (version) {
case Default -> "default";
case Cypher5 -> "5";
case Cypher25 -> "25";
};
Expand Down
13 changes: 11 additions & 2 deletions core/src/main/java/apoc/cypher/CypherInitializer.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
import org.apache.commons.lang3.StringUtils;
import org.neo4j.common.DependencyResolver;
import org.neo4j.configuration.Config;
import org.neo4j.configuration.GraphDatabaseSettings;
import org.neo4j.cypher.internal.CypherVersion;
import org.neo4j.dbms.api.DatabaseManagementService;
import org.neo4j.graphdb.Label;
import org.neo4j.graphdb.Node;
Expand Down Expand Up @@ -106,8 +108,15 @@ public void available() {
.resolveDependency(ApocConfig.class)
.getConfig();
for (final var query : collectInitializers(config)) {
final var sanitizedQuery =
LogsUtil.sanitizeQuery(dependencyResolver.resolveDependency(Config.class), query);
final var neo4jConfig = dependencyResolver.resolveDependency(Config.class);

// TODO Replace with actual db specific default when it's available.
final var defaultLanguage =
switch (neo4jConfig.get(GraphDatabaseSettings.default_language)) {
case Cypher5 -> CypherVersion.Cypher5;
case Cypher25 -> CypherVersion.Cypher25;
};
final var sanitizedQuery = LogsUtil.sanitizeQuery(neo4jConfig, query, defaultLanguage);
try {
// we need to apply a retry strategy here since in systemdb we potentially conflict
// with
Expand Down
5 changes: 1 addition & 4 deletions core/src/test/java/apoc/export/arrow/ArrowTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import org.neo4j.configuration.GraphDatabaseInternalSettings;
import org.neo4j.configuration.GraphDatabaseSettings;
import org.neo4j.graphdb.Result;
import org.neo4j.test.rule.DbmsRule;
Expand All @@ -65,9 +64,7 @@ public class ArrowTest {
.withSetting(
GraphDatabaseSettings.load_csv_file_url_root,
directory.toPath().toAbsolutePath())
.withSetting(
GraphDatabaseInternalSettings.default_cypher_version,
GraphDatabaseInternalSettings.CypherVersion.Cypher5);
.withSetting(GraphDatabaseSettings.default_language, GraphDatabaseSettings.CypherVersion.Cypher5);

public static final List<Map<String, Object>> EXPECTED = List.of(
new HashMap<>() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.neo4j.configuration.GraphDatabaseInternalSettings;
import org.neo4j.configuration.GraphDatabaseSettings;
import org.neo4j.graphdb.QueryExecutionException;
import org.neo4j.test.rule.DbmsRule;
Expand Down Expand Up @@ -89,9 +88,7 @@ public class ExportArrowSecurityTest {
.withSetting(
GraphDatabaseSettings.load_csv_file_url_root,
directory.toPath().toAbsolutePath())
.withSetting(
GraphDatabaseInternalSettings.default_cypher_version,
GraphDatabaseInternalSettings.CypherVersion.Cypher5);
.withSetting(GraphDatabaseSettings.default_language, GraphDatabaseSettings.CypherVersion.Cypher5);

@BeforeClass
public static void setUp() {
Expand Down
6 changes: 2 additions & 4 deletions core/src/test/java/apoc/trigger/TriggerDisabledTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import org.neo4j.configuration.GraphDatabaseInternalSettings;
import org.neo4j.configuration.GraphDatabaseSettings;
import org.neo4j.graphdb.Result;
import org.neo4j.test.rule.DbmsRule;
import org.neo4j.test.rule.ImpermanentDbmsRule;
Expand All @@ -48,9 +48,7 @@ public class TriggerDisabledTest {

@ClassRule
public static DbmsRule db = new ImpermanentDbmsRule()
.withSetting(
GraphDatabaseInternalSettings.default_cypher_version,
GraphDatabaseInternalSettings.CypherVersion.Cypher5);
.withSetting(GraphDatabaseSettings.default_language, GraphDatabaseSettings.CypherVersion.Cypher5);

@BeforeClass
public static void setUp() {
Expand Down
6 changes: 2 additions & 4 deletions core/src/test/java/apoc/trigger/TriggerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
import org.junit.Rule;
import org.junit.Test;
import org.junit.contrib.java.lang.system.ProvideSystemProperty;
import org.neo4j.configuration.GraphDatabaseInternalSettings;
import org.neo4j.configuration.GraphDatabaseSettings;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.QueryExecutionException;
import org.neo4j.graphdb.Relationship;
Expand All @@ -62,9 +62,7 @@ public class TriggerTest {
@Rule
public DbmsRule db = new ImpermanentDbmsRule()
.withSetting(procedure_unrestricted, List.of("apoc*"))
.withSetting(
GraphDatabaseInternalSettings.default_cypher_version,
GraphDatabaseInternalSettings.CypherVersion.Cypher5);
.withSetting(GraphDatabaseSettings.default_language, GraphDatabaseSettings.CypherVersion.Cypher5);

private long start;

Expand Down
10 changes: 7 additions & 3 deletions core/src/test/java/apoc/util/LogsUtilTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,23 @@

import org.junit.Test;
import org.neo4j.configuration.Config;
import org.neo4j.cypher.internal.CypherVersion;

public class LogsUtilTest {

@Test
public void shouldRedactPasswords() {
String sanitized = LogsUtil.sanitizeQuery(
Config.defaults(), "CREATE USER dummy IF NOT EXISTS SET PASSWORD 'pass12345' CHANGE NOT REQUIRED");
Config.defaults(),
"CREATE USER dummy IF NOT EXISTS SET PASSWORD 'pass12345' CHANGE NOT REQUIRED",
CypherVersion.Cypher5);
assertEquals(sanitized, "CREATE USER dummy IF NOT EXISTS SET PASSWORD '******' CHANGE NOT REQUIRED");
}

@Test
public void shouldReturnInputIfInvalidQuery() {
String invalidQuery = "MATCH USER dummy IF NOT EXISTS SET PASSWORD 'pass12345' CHANGE NOT REQUIRED";
String sanitized = LogsUtil.sanitizeQuery(Config.defaults(), invalidQuery);
String sanitized = LogsUtil.sanitizeQuery(Config.defaults(), invalidQuery, CypherVersion.Cypher5);

assertEquals(sanitized, invalidQuery);
}
Expand All @@ -44,7 +47,8 @@ public void shouldReturnInputIfInvalidQuery() {
public void whitespaceDeprecationSucceedsSanitization() {
String sanitized = LogsUtil.sanitizeQuery(
Config.defaults(),
"CREATE USER dum\u0085my IF NOT EXISTS SET PASSWORD 'pass12345' CHANGE NOT REQUIRED");
"CREATE USER dum\u0085my IF NOT EXISTS SET PASSWORD 'pass12345' CHANGE NOT REQUIRED",
CypherVersion.Cypher5);
assertEquals(sanitized, "CREATE USER `dum\u0085my` IF NOT EXISTS SET PASSWORD '******' CHANGE NOT REQUIRED");
}
}
5 changes: 1 addition & 4 deletions core/src/test/java/apoc/warmup/WarmupTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.neo4j.configuration.GraphDatabaseInternalSettings;
import org.neo4j.configuration.GraphDatabaseSettings;
import org.neo4j.test.rule.DbmsRule;
import org.neo4j.test.rule.ImpermanentDbmsRule;
Expand All @@ -41,9 +40,7 @@ public class WarmupTest {

@Rule
public DbmsRule db = new ImpermanentDbmsRule()
.withSetting(
GraphDatabaseInternalSettings.default_cypher_version,
GraphDatabaseInternalSettings.CypherVersion.Cypher5);
.withSetting(GraphDatabaseSettings.default_language, GraphDatabaseSettings.CypherVersion.Cypher5);

@Before
public void setUp() {
Expand Down
9 changes: 2 additions & 7 deletions it/src/test/java/apoc/it/core/WarmupEnterpriseTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
import java.util.Map;
import java.util.function.Consumer;
import org.junit.Test;
import org.neo4j.configuration.GraphDatabaseInternalSettings;
import org.neo4j.configuration.GraphDatabaseSettings;
import org.neo4j.driver.Driver;
import org.neo4j.driver.Session;
Expand All @@ -40,9 +39,7 @@ public class WarmupEnterpriseTest {

@Test
public void testWarmupIsntAllowedWithOtherStorageEngines() {
final var conf = Map.of(
GraphDatabaseInternalSettings.include_versions_under_development.name(), "true",
GraphDatabaseSettings.db_format.name(), "block");
final var conf = Map.of(GraphDatabaseSettings.db_format.name(), "block");
withSession(conf, session -> {
assertThatThrownBy(() -> testCall(session, "CYPHER 5 CALL apoc.warmup.run()", (r) -> {}))
.isExactlyInstanceOf(ClientException.class)
Expand All @@ -53,9 +50,7 @@ public void testWarmupIsntAllowedWithOtherStorageEngines() {

@Test
public void testWarmupOnEnterpriseStorageEngine() {
final var conf = Map.of(
GraphDatabaseInternalSettings.include_versions_under_development.name(), "true",
GraphDatabaseSettings.db_format.name(), "high_limit");
final var conf = Map.of(GraphDatabaseSettings.db_format.name(), "high_limit");
withSession(conf, session -> {
testCall(session, "CYPHER 5 CALL apoc.warmup.run(true,true,true)", r -> {
assertEquals(true, r.get("indexesLoaded"));
Expand Down
19 changes: 7 additions & 12 deletions test-utils/src/main/java/apoc/util/TestContainerUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
import org.gradle.tooling.BuildLauncher;
import org.gradle.tooling.GradleConnector;
import org.gradle.tooling.ProjectConnection;
import org.neo4j.configuration.GraphDatabaseInternalSettings;
import org.neo4j.configuration.GraphDatabaseSettings;
import org.neo4j.driver.Record;
import org.neo4j.driver.Session;
import org.testcontainers.containers.ContainerFetchException;
Expand Down Expand Up @@ -110,7 +110,7 @@ public static Neo4jContainerExtension createDB(
Neo4jVersion version,
List<ApocPackage> apocPackages,
boolean withLogging,
GraphDatabaseInternalSettings.CypherVersion cypherVersion) {
GraphDatabaseSettings.CypherVersion cypherVersion) {
return switch (version) {
case ENTERPRISE -> createEnterpriseDB(apocPackages, withLogging, cypherVersion);
case COMMUNITY -> createCommunityDB(apocPackages, withLogging, cypherVersion);
Expand All @@ -122,9 +122,7 @@ public static Neo4jContainerExtension createEnterpriseDB(List<ApocPackage> apocP
}

public static Neo4jContainerExtension createEnterpriseDB(
List<ApocPackage> apocPackages,
boolean withLogging,
GraphDatabaseInternalSettings.CypherVersion cypherVersion) {
List<ApocPackage> apocPackages, boolean withLogging, GraphDatabaseSettings.CypherVersion cypherVersion) {
return createNeo4jContainer(apocPackages, withLogging, Neo4jVersion.ENTERPRISE, cypherVersion);
}

Expand All @@ -133,17 +131,15 @@ public static Neo4jContainerExtension createCommunityDB(List<ApocPackage> apocPa
}

public static Neo4jContainerExtension createCommunityDB(
List<ApocPackage> apocPackages,
boolean withLogging,
GraphDatabaseInternalSettings.CypherVersion cypherVersion) {
List<ApocPackage> apocPackages, boolean withLogging, GraphDatabaseSettings.CypherVersion cypherVersion) {
return createNeo4jContainer(apocPackages, withLogging, Neo4jVersion.COMMUNITY, cypherVersion);
}

private static Neo4jContainerExtension createNeo4jContainer(
List<ApocPackage> apocPackages,
boolean withLogging,
Neo4jVersion version,
GraphDatabaseInternalSettings.CypherVersion cypherVersion) {
GraphDatabaseSettings.CypherVersion cypherVersion) {
String dockerImage;
if (version == Neo4jVersion.ENTERPRISE) {
dockerImage = neo4jEnterpriseDockerImageVersion;
Expand Down Expand Up @@ -203,8 +199,7 @@ private static Neo4jContainerExtension createNeo4jContainer(
String cypherVersionSetting = cypherVersion == null
? System.getenv()
.getOrDefault(
"CYPHER_VERSION",
Util.getCypherVersion(GraphDatabaseInternalSettings.CypherVersion.Cypher5))
"CYPHER_VERSION", Util.getCypherVersion(GraphDatabaseSettings.CypherVersion.Cypher5))
: Util.getCypherVersion(cypherVersion);

System.out.println("neo4jDockerImageVersion = " + dockerImage);
Expand All @@ -220,7 +215,7 @@ private static Neo4jContainerExtension createNeo4jContainer(
.withNeo4jConfig("dbms.logs.debug.level", "DEBUG")
.withNeo4jConfig("dbms.routing.driver.logging.level", "DEBUG")
.withNeo4jConfig("internal.dbms.cypher.enable_experimental_versions", "true")
.withNeo4jConfig("internal.dbms.cypher.version", cypherVersionSetting)
.withNeo4jConfig("db.query.default_language", "cypher_" + cypherVersionSetting)
// Additional kernel assertions
.withNeo4jConfig(
"server.jvm.additional",
Expand Down
13 changes: 7 additions & 6 deletions test-utils/src/main/java/org/neo4j/test/rule/DbmsRule.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import java.util.function.Consumer;
import org.neo4j.common.DependencyResolver;
import org.neo4j.configuration.GraphDatabaseInternalSettings;
import org.neo4j.configuration.GraphDatabaseSettings;
import org.neo4j.dbms.api.DatabaseManagementService;
import org.neo4j.dbms.api.Neo4jDatabaseManagementServiceBuilder;
import org.neo4j.dbms.systemgraph.TopologyGraphDbmsModel.HostedOnMode;
Expand Down Expand Up @@ -159,12 +160,12 @@ private void create() {
globalConfig.put(GraphDatabaseInternalSettings.enable_experimental_cypher_versions, true);

// A test may set this for the entire file itself, so we shouldn't override that
if (!globalConfig.containsKey(GraphDatabaseInternalSettings.default_cypher_version)) {
String cypherVersionEnv = System.getenv()
.getOrDefault("CYPHER_VERSION", GraphDatabaseInternalSettings.CypherVersion.Cypher5.name());
GraphDatabaseInternalSettings.CypherVersion cypherVersion =
GraphDatabaseInternalSettings.CypherVersion.valueOf(cypherVersionEnv);
globalConfig.put(GraphDatabaseInternalSettings.default_cypher_version, cypherVersion);
if (!globalConfig.containsKey(GraphDatabaseSettings.default_language)) {
String cypherVersionEnv =
System.getenv().getOrDefault("CYPHER_VERSION", GraphDatabaseSettings.CypherVersion.Cypher5.name());
GraphDatabaseSettings.CypherVersion cypherVersion =
GraphDatabaseSettings.CypherVersion.valueOf(cypherVersionEnv);
globalConfig.put(GraphDatabaseSettings.default_language, cypherVersion);
}

databaseBuilder.setConfig(globalConfig);
Expand Down