This is an automated email from the ASF dual-hosted git repository. mblow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit fa25aca9aa6a78b1230a5a27027447c77fdcfcf9 Author: Ali Alsuliman <[email protected]> AuthorDate: Tue Jun 21 02:42:17 2022 +0300 [NO ISSUE][OTH] Extend the optimizer test for CBO - user model changes: no - storage format changes: no - interface changes: no Details: Run the optimizer tests with a different configuration for CBO. Change-Id: Id87d777b9d16a5ac93048c50ab6e2f2d53639d91 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/16623 Contrib: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> Reviewed-by: Ali Alsuliman <[email protected]> Reviewed-by: Dmitry Lychagin <[email protected]> Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17326 Reviewed-by: Michael Blow <[email protected]> Tested-by: Michael Blow <[email protected]> --- .../asterix/test/jsonplan/JsonLogicalPlanTest.java | 18 ++----- .../jsonplan/JsonOptimizedLogicalPlanTest.java | 6 +-- .../test/optimizer/AbstractOptimizerTest.java | 30 ++++------- .../asterix/test/optimizer/CBOOptimizerTest.java | 63 ++++++++++++++++++++++ .../asterix/test/optimizer/OptimizerTest.java | 16 +++--- 5 files changed, 91 insertions(+), 42 deletions(-) diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonLogicalPlanTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonLogicalPlanTest.java index 65cbb9e2fd..d68586a7ba 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonLogicalPlanTest.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonLogicalPlanTest.java @@ -27,8 +27,6 @@ import java.io.PrintWriter; import java.io.StringReader; import java.nio.charset.StandardCharsets; import java.util.Collection; -import java.util.Collections; -import java.util.List; import java.util.Map; import org.apache.asterix.api.java.AsterixJavaClient; @@ -63,7 +61,7 @@ public class JsonLogicalPlanTest extends AbstractOptimizerTest { static { EXTENSION_RESULT = "plan.json"; - PATH_ACTUAL = "target" + File.separator + "jplantest" + SEPARATOR; + PATH_ACTUAL = "target" + SEPARATOR + "jplantest" + SEPARATOR; } @Parameters(name = "JsonLogicalPlanTest {index}: {0}") @@ -71,8 +69,8 @@ public class JsonLogicalPlanTest extends AbstractOptimizerTest { return AbstractOptimizerTest.tests(); } - public JsonLogicalPlanTest(final File queryFile, final File expectedFile, final File actualFile) { - super(queryFile, expectedFile, actualFile); + public JsonLogicalPlanTest(File queryFile, String expectedFilePath, File actualFile) { + super(queryFile, actualFile); } @Test @@ -82,7 +80,7 @@ public class JsonLogicalPlanTest extends AbstractOptimizerTest { @Override protected void runAndCompare(String query, ILangCompilationProvider provider, Map<String, IAObject> queryParams, - IHyracksClientConnection hcc, List<String> linesExpected) throws Exception { + IHyracksClientConnection hcc) throws Exception { FileUtils.writeStringToFile(actualFile, "", StandardCharsets.UTF_8); String planStr; try (PrintWriter plan = new PrintWriter(actualFile)) { @@ -99,7 +97,7 @@ public class JsonLogicalPlanTest extends AbstractOptimizerTest { } BufferedReader readerActual = - new BufferedReader(new InputStreamReader(new FileInputStream(actualFile), "UTF-8")); + new BufferedReader(new InputStreamReader(new FileInputStream(actualFile), StandardCharsets.UTF_8)); String lineActual, objectActual = ""; boolean firstPlan = false; while ((lineActual = readerActual.readLine()) != null) { @@ -123,10 +121,4 @@ public class JsonLogicalPlanTest extends AbstractOptimizerTest { readerActual.close(); } } - - @Override - protected List<String> getExpectedLines() { - // this test only checks the produced result is valid, so no expected results - return Collections.emptyList(); - } } diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonOptimizedLogicalPlanTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonOptimizedLogicalPlanTest.java index 7f787431d5..9bf03ec39e 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonOptimizedLogicalPlanTest.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonOptimizedLogicalPlanTest.java @@ -32,11 +32,11 @@ public class JsonOptimizedLogicalPlanTest extends JsonLogicalPlanTest { static { EXTENSION_RESULT = "plan.json"; optimized = true; - PATH_ACTUAL = "target" + File.separator + "joptplantest" + SEPARATOR; + PATH_ACTUAL = "target" + SEPARATOR + "joptplantest" + SEPARATOR; } - public JsonOptimizedLogicalPlanTest(File queryFile, File expectedFile, File actualFile) { - super(queryFile, expectedFile, actualFile); + public JsonOptimizedLogicalPlanTest(File queryFile, String expectedFilePath, File actualFile) { + super(queryFile, expectedFilePath, actualFile); } @Parameterized.Parameters(name = "JsonOptimizedLogicalPlanTest {index}: {0}") diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/AbstractOptimizerTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/AbstractOptimizerTest.java index 0fba54b127..8126d1e5d2 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/AbstractOptimizerTest.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/AbstractOptimizerTest.java @@ -19,12 +19,10 @@ package org.apache.asterix.test.optimizer; import java.io.File; -import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -68,12 +66,11 @@ public abstract class AbstractOptimizerTest { protected static final String PATH_BASE = "src" + SEPARATOR + "test" + SEPARATOR + "resources" + SEPARATOR + "optimizerts" + SEPARATOR; protected static final String PATH_QUERIES = PATH_BASE + "queries" + SEPARATOR; - protected static final String PATH_EXPECTED = PATH_BASE + "results" + SEPARATOR; protected static String PATH_ACTUAL; protected static final ArrayList<String> ignore = AsterixTestHelper.readTestListFile(FILENAME_IGNORE, PATH_BASE); protected static final ArrayList<String> only = AsterixTestHelper.readTestListFile(FILENAME_ONLY, PATH_BASE); - protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf"; + protected static String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf"; protected static final ILangCompilationProvider sqlppCompilationProvider = new SqlppCompilationProvider(); protected static ILangCompilationProvider extensionLangCompilationProvider = null; protected static IStatementExecutorFactory statementExecutorFactory = new DefaultStatementExecutorFactory(); @@ -123,9 +120,8 @@ public abstract class AbstractOptimizerTest { } if (file.isFile() && file.getName().endsWith(EXTENSION_SQLPP)) { String resultFileName = AsterixTestHelper.extToResExt(file.getName(), EXTENSION_RESULT); - File expectedFile = new File(PATH_EXPECTED + path + resultFileName); File actualFile = new File(PATH_ACTUAL + SEPARATOR + path + resultFileName); - testArgs.add(new Object[] { file, expectedFile, actualFile }); + testArgs.add(new Object[] { file, path + resultFileName, actualFile }); } } @@ -143,20 +139,15 @@ public abstract class AbstractOptimizerTest { } protected final File actualFile; - protected final File expectedFile; protected final File queryFile; - public AbstractOptimizerTest(final File queryFile, final File expectedFile, final File actualFile) { + public AbstractOptimizerTest(final File queryFile, final File actualFile) { this.queryFile = queryFile; - this.expectedFile = expectedFile; this.actualFile = actualFile; } protected abstract void runAndCompare(String query, ILangCompilationProvider provider, - Map<String, IAObject> queryParams, IHyracksClientConnection hcc, List<String> linesExpected) - throws Exception; - - protected abstract List<String> getExpectedLines() throws IOException; + Map<String, IAObject> queryParams, IHyracksClientConnection hcc) throws Exception; @Test public void test() throws Exception { @@ -202,11 +193,10 @@ public abstract class AbstractOptimizerTest { provider = extensionLangCompilationProvider; } IHyracksClientConnection hcc = integrationUtil.getHyracksClientConnection(); - List<String> linesExpected = getExpectedLines(); if (repeat) { - runAndRepeat(placeholder, substitutions, query, provider, queryParams, hcc, linesExpected); + runAndRepeat(placeholder, substitutions, query, provider, queryParams, hcc); } else { - runAndCompare(query, provider, queryParams, hcc, linesExpected); + runAndCompare(query, provider, queryParams, hcc); } LOGGER.info("Test \"" + queryFile.getPath() + "\" PASSED!"); @@ -222,16 +212,16 @@ public abstract class AbstractOptimizerTest { } private void runAndRepeat(String placeholder, JsonNode substitutions, String query, - ILangCompilationProvider provider, Map<String, IAObject> queryParams, IHyracksClientConnection hcc, - List<String> linesExpected) throws Exception { + ILangCompilationProvider provider, Map<String, IAObject> queryParams, IHyracksClientConnection hcc) + throws Exception { if (substitutions.isArray()) { for (int i = 0, size = substitutions.size(); i < size; i++) { String substitute = substitutions.get(i).asText(); String newQuery = query.replaceAll(placeholder, substitute); - runAndCompare(newQuery, provider, queryParams, hcc, linesExpected); + runAndCompare(newQuery, provider, queryParams, hcc); } } else { - runAndCompare(query, provider, queryParams, hcc, linesExpected); + runAndCompare(query, provider, queryParams, hcc); } } } diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/CBOOptimizerTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/CBOOptimizerTest.java new file mode 100644 index 0000000000..a5a99d910c --- /dev/null +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/CBOOptimizerTest.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.asterix.test.optimizer; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collection; +import java.util.List; + +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +/** + * Runs the optimization tests with CBO enabled. It compares a test's actual result against the expected result in + * {@link CBOOptimizerTest#CBO_PATH_EXPECTED} if one is provided. Otherwise, it compares against the expected result in + * {@link OptimizerTest#PATH_EXPECTED}. + */ +@RunWith(Parameterized.class) +public class CBOOptimizerTest extends OptimizerTest { + + private static final String CBO_PATH_EXPECTED = PATH_BASE + "results_cbo" + SEPARATOR; + static { + TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf"; + EXTENSION_RESULT = "plan"; + PATH_ACTUAL = "target" + SEPARATOR + "cbo_opttest" + SEPARATOR; + } + + @Parameters(name = "CBOOptimizerTest {index}: {0}") + public static Collection<Object[]> tests() { + return AbstractOptimizerTest.tests(); + } + + public CBOOptimizerTest(File queryFile, String expectedFilePath, File actualFile) { + super(queryFile, expectedFilePath, actualFile); + } + + @Override + protected List<String> getExpectedLines() throws IOException { + Path cboFilePath = Path.of(CBO_PATH_EXPECTED, expectedFilePath); + return Files.exists(cboFilePath) ? Files.readAllLines(cboFilePath, StandardCharsets.UTF_8) + : super.getExpectedLines(); + } +} diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/OptimizerTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/OptimizerTest.java index a89585d9fa..f02b4d6984 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/OptimizerTest.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/OptimizerTest.java @@ -24,6 +24,7 @@ import java.io.PrintWriter; import java.io.StringReader; import java.nio.charset.StandardCharsets; import java.nio.file.Files; +import java.nio.file.Path; import java.util.Collection; import java.util.Iterator; import java.util.List; @@ -51,12 +52,14 @@ import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) public class OptimizerTest extends AbstractOptimizerTest { + protected static final String PATH_EXPECTED = PATH_BASE + "results" + SEPARATOR; private static final String PATTERN_VAR_ID_PREFIX = "\\$\\$"; private static final Pattern PATTERN_VAR_ID = Pattern.compile(PATTERN_VAR_ID_PREFIX + "(\\d+)"); + protected String expectedFilePath; static { EXTENSION_RESULT = "plan"; - PATH_ACTUAL = "target" + File.separator + "opttest" + SEPARATOR; + PATH_ACTUAL = "target" + SEPARATOR + "opttest" + SEPARATOR; } @Parameters(name = "OptimizerTest {index}: {0}") @@ -64,8 +67,9 @@ public class OptimizerTest extends AbstractOptimizerTest { return AbstractOptimizerTest.tests(); } - public OptimizerTest(final File queryFile, final File expectedFile, final File actualFile) { - super(queryFile, expectedFile, actualFile); + public OptimizerTest(File queryFile, String expectedFilePath, File actualFile) { + super(queryFile, actualFile); + this.expectedFilePath = expectedFilePath; } @Test @@ -75,7 +79,7 @@ public class OptimizerTest extends AbstractOptimizerTest { @Override protected void runAndCompare(String query, ILangCompilationProvider provider, Map<String, IAObject> queryParams, - IHyracksClientConnection hcc, List<String> linesExpected) throws Exception { + IHyracksClientConnection hcc) throws Exception { FileUtils.writeStringToFile(actualFile, "", StandardCharsets.UTF_8); try (PrintWriter plan = new PrintWriter(actualFile)) { AsterixJavaClient asterix = new AsterixJavaClient( @@ -89,6 +93,7 @@ public class OptimizerTest extends AbstractOptimizerTest { List<String> linesActual = Files.readAllLines(actualFile.toPath(), StandardCharsets.UTF_8); + List<String> linesExpected = getExpectedLines(); int varBaseExpected = findBaseVarId(linesExpected); int varBaseActual = findBaseVarId(linesActual); @@ -116,9 +121,8 @@ public class OptimizerTest extends AbstractOptimizerTest { } } - @Override protected List<String> getExpectedLines() throws IOException { - return Files.readAllLines(expectedFile.toPath(), StandardCharsets.UTF_8); + return Files.readAllLines(Path.of(PATH_EXPECTED, expectedFilePath), StandardCharsets.UTF_8); } private boolean planLineEquals(String lineExpected, int varIdBaseExpected, String lineActual, int varIdBaseActual) {
