Skip to content

Commit

Permalink
#45: Rewrote parts of the JDBC adapter to use the new commons code.
Browse files Browse the repository at this point in the history
  • Loading branch information
redcatbear committed Mar 25, 2019
1 parent d315b79 commit d13ba72
Show file tree
Hide file tree
Showing 11 changed files with 338 additions and 463 deletions.
2 changes: 1 addition & 1 deletion jdbc-adapter/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<module>virtualschema-jdbc-adapter-dist</module>
</modules>
<properties>
<product.version>1.7.1</product.version>
<product.version>1.8.0</product.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
Expand Down
2 changes: 1 addition & 1 deletion jdbc-adapter/virtualschema-jdbc-adapter/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@
<dependency>
<groupId>com.exasol</groupId>
<artifactId>virtual-schema-common-java</artifactId>
<version>2.1.0</version>
<version>3.0.0</version>
</dependency>
<!-- We need this only for the integration test profile, however without adding it here you would have to enable the profile in the IDE to have the dependency -->
<dependency>
Expand Down

Large diffs are not rendered by default.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,72 +1,63 @@
package com.exasol.adapter.dialects;

import static org.junit.Assert.assertEquals;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.mockito.Mockito;

import com.exasol.adapter.AdapterException;
import com.exasol.adapter.dialects.impl.ExasolSqlDialect;
import com.exasol.adapter.jdbc.SchemaAdapterNotes;
import com.exasol.adapter.metadata.ColumnMetadata;
import com.exasol.adapter.metadata.DataType;
import com.exasol.adapter.metadata.MetadataException;
import com.exasol.adapter.metadata.TableMetadata;
import com.exasol.adapter.metadata.*;
import com.exasol.adapter.sql.*;
import com.google.common.collect.ImmutableList;
import org.junit.Test;
import org.mockito.Mockito;
import utils.SqlTestUtil;

import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.assertEquals;
import utils.SqlTestUtil;

public class CustomSqlGenerationVisitorTest {

/**
* This tests uses a SQL with nested expressions (NOT), to make sure that
* the custom sql generation visitor is used for all levels of recursion.
* This tests uses a SQL with nested expressions (NOT), to make sure that the custom sql generation visitor is used
* for all levels of recursion.
*/
@Test
public void testSqlGenerator() throws AdapterException {
SqlNode node = getTestSqlNode();
String schemaName = "SCHEMA";
String expectedSql = "SELECT NOT_CUSTOM (NOT_CUSTOM (\"C1\")) FROM \"" + schemaName
+ "\".\"TEST\"";
SqlGenerationContext context = new SqlGenerationContext("", schemaName,
false, false);
SqlDialectContext dialectContext = new SqlDialectContext(Mockito.mock(SchemaAdapterNotes.class));
SqlGenerationVisitor generator = new TestSqlGenerationVisitor(
new ExasolSqlDialect(dialectContext), context);
String actualSql = node.accept(generator);
assertEquals(SqlTestUtil.normalizeSql(expectedSql),
SqlTestUtil.normalizeSql(actualSql));
final SqlNode node = getTestSqlNode();
final String schemaName = "SCHEMA";
final String expectedSql = "SELECT NOT_CUSTOM (NOT_CUSTOM (\"C1\")) FROM \"" + schemaName + "\".\"TEST\"";
final SqlGenerationContext context = new SqlGenerationContext("", schemaName, false, false);
final SqlDialectContext dialectContext = new SqlDialectContext(Mockito.mock(SchemaAdapterNotes.class));
final SqlGenerationVisitor generator = new TestSqlGenerationVisitor(new ExasolSqlDialect(dialectContext),
context);
final String actualSql = node.accept(generator);
assertEquals(SqlTestUtil.normalizeSql(expectedSql), SqlTestUtil.normalizeSql(actualSql));
}

private SqlNode getTestSqlNode() throws MetadataException {
TableMetadata clicksMeta = getTestTableMetadata();
SqlTable fromClause = new SqlTable("TEST", clicksMeta);
SqlSelectList selectList = SqlSelectList.createRegularSelectList(
ImmutableList.<SqlNode>of(new SqlPredicateNot(
new SqlPredicateNot(new SqlColumn(1, clicksMeta
.getColumns().get(0))))));
return new SqlStatementSelect(fromClause, selectList, null, null, null,
null, null);
private SqlNode getTestSqlNode() {
final TableMetadata clicksMeta = getTestTableMetadata();
final SqlTable fromClause = new SqlTable("TEST", clicksMeta);
final SqlSelectList selectList = SqlSelectList.createRegularSelectList(ImmutableList.<SqlNode>of(
new SqlPredicateNot(new SqlPredicateNot(new SqlColumn(1, clicksMeta.getColumns().get(0))))));
return new SqlStatementSelect(fromClause, selectList, null, null, null, null, null);
}

private TableMetadata getTestTableMetadata() throws MetadataException {
List<ColumnMetadata> columns = new ArrayList<>();
columns.add(new ColumnMetadata("C1", "", DataType.createBool(), true,
false, "", ""));
private TableMetadata getTestTableMetadata() {
final List<ColumnMetadata> columns = new ArrayList<>();
columns.add(new ColumnMetadata("C1", "", DataType.createBool(), true, false, "", ""));
return new TableMetadata("TEST", "", columns, "");
}

public static class TestSqlGenerationVisitor extends SqlGenerationVisitor {

public TestSqlGenerationVisitor(SqlDialect dialect,
SqlGenerationContext context) {
public TestSqlGenerationVisitor(final SqlDialect dialect, final SqlGenerationContext context) {
super(dialect, context);
}

@Override
public String visit(SqlPredicateNot predicate) throws AdapterException {
public String visit(final SqlPredicateNot predicate) throws AdapterException {
return "NOT_CUSTOM (" + predicate.getExpression().accept(this) + ")";
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import com.exasol.adapter.json.RequestJsonParser;
import com.exasol.adapter.jdbc.SchemaAdapterNotes;
import com.exasol.adapter.request.AdapterRequest;
import com.exasol.adapter.request.PushdownRequest;
import com.exasol.adapter.request.PushDownRequest;
import com.exasol.utils.JsonHelper;
import com.google.common.base.Charsets;
import com.google.common.io.Files;
Expand Down Expand Up @@ -47,8 +47,8 @@
* <ul><li> testQuery:
* A single string containing the test query. This test does not use
* the test query, since the testcase parses the pushdown request directly.
* <li> expectedPushdownRequest:
* A list of pushdownRequests as they are generated by the database.
* <li> expectedPushDownRequest:
* A list of PushDownRequests as they are generated by the database.
* This is a list because a single query can generate multiple pushdowns
* (e.g. join).
* <li> expectedPushdownResponse:
Expand All @@ -60,7 +60,7 @@
public class FileBasedIntegrationTest {
private static final String INTEGRATION_TESTFILES_DIR = "target/test-classes/integration";
private static final String TEST_FILE_KEY_TESTCASES = "testCases";
private static final String TEST_FILE_KEY_EXP_PD_REQUEST = "expectedPushdownRequest";
private static final String TEST_FILE_KEY_EXP_PD_REQUEST = "expectedPushDownRequest";
private static final String TEST_FILE_KEY_EXP_PD_RESPONSE = "expectedPushdownResponse";
private static final String JSON_API_KEY_INVOLVED_TABLES = "involvedTables";

Expand All @@ -81,11 +81,11 @@ public void testPushdownFromTestFile() throws Exception {
final String jsonTest = Files.toString(testFile, Charsets.UTF_8);
final int numberOftests = getNumberOfTestsFrom(jsonTest);
for (int testNr = 0; testNr < numberOftests; testNr++) {
final List<PushdownRequest> pushdownRequests = getPushdownRequestsFrom(jsonTest, testNr);
final List<PushDownRequest> PushDownRequests = getPushDownRequestsFrom(jsonTest, testNr);
final Map<String, List<String>> expectedPushdownQueries = getExpectedPushdownQueriesFrom(jsonTest, testNr);
for (final String dialect : expectedPushdownQueries.keySet()) {
for (final PushdownRequest pushdownRequest : pushdownRequests) {
final String pushdownQuery = generatePushdownQuery(dialect, pushdownRequest, hasMultipleTables(jsonTest, testNr), testFile.getName(), testNr);
for (final PushDownRequest PushDownRequest : PushDownRequests) {
final String pushdownQuery = generatePushdownQuery(dialect, PushDownRequest, hasMultipleTables(jsonTest, testNr), testFile.getName(), testNr);
assertExpectedPushdowns(expectedPushdownQueries.get(dialect), pushdownQuery, testFile.getName(), testNr, dialect);
}
}
Expand Down Expand Up @@ -117,18 +117,18 @@ private int getNumberOfTestsFrom(final String jsonTest) throws Exception {
return root.getJsonArray(TEST_FILE_KEY_TESTCASES).size();
}

private List<PushdownRequest> getPushdownRequestsFrom(final String jsonTest, final int testNr) throws Exception {
private List<PushDownRequest> getPushDownRequestsFrom(final String jsonTest, final int testNr) throws Exception {
final JsonObject root = JsonHelper.getJsonObject(jsonTest);
final JsonObject test = root.getJsonArray(TEST_FILE_KEY_TESTCASES).getValuesAs(JsonObject.class).get(testNr);
final int numberOfPushdownRequests = test.getJsonArray(TEST_FILE_KEY_EXP_PD_REQUEST).size();
final List<PushdownRequest> pushdownRequests = new ArrayList<PushdownRequest>(numberOfPushdownRequests);
for(int requestNr = 0; requestNr < numberOfPushdownRequests; requestNr++) {
final int numberOfPushDownRequests = test.getJsonArray(TEST_FILE_KEY_EXP_PD_REQUEST).size();
final List<PushDownRequest> PushDownRequests = new ArrayList<PushDownRequest>(numberOfPushDownRequests);
for(int requestNr = 0; requestNr < numberOfPushDownRequests; requestNr++) {
final String req = test.getJsonArray(TEST_FILE_KEY_EXP_PD_REQUEST).get(requestNr).toString();
final RequestJsonParser parser = new RequestJsonParser();
final AdapterRequest request = parser.parseRequest(req);
pushdownRequests.add((PushdownRequest) request);
PushDownRequests.add((PushDownRequest) request);
}
return pushdownRequests;
return PushDownRequests;
}

private Boolean hasMultipleTables(final String jsonTest, final int testNr) throws Exception {
Expand All @@ -139,7 +139,7 @@ private Boolean hasMultipleTables(final String jsonTest, final int testNr) throw
return size > 1;
}

private String generatePushdownQuery(final String dialect, final PushdownRequest pushdownRequest, final Boolean multipleTables, final String testFile, final int testNr) throws AdapterException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
private String generatePushdownQuery(final String dialect, final PushDownRequest PushDownRequest, final Boolean multipleTables, final String testFile, final int testNr) throws AdapterException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
final String schemaName = "LS";
final SqlGenerationContext context = new SqlGenerationContext("", schemaName, false, multipleTables);
final SchemaAdapterNotes notes = Mockito.mock(SchemaAdapterNotes.class);
Expand All @@ -152,7 +152,7 @@ private String generatePushdownQuery(final String dialect, final PushdownRequest
final SqlDialect sqlDialect = (SqlDialect)dialectClass.getConstructor(SqlDialectContext.class).newInstance(dialectContext);
final SqlGenerationVisitor sqlGeneratorVisitor = sqlDialect.getSqlGenerationVisitor(context);
try {
return pushdownRequest.getSelect().accept(sqlGeneratorVisitor);
return PushDownRequest.getSelect().accept(sqlGeneratorVisitor);
} catch (final Exception e)
{
System.err.println("Exception in: " + testFile + " Test#: " + testNr + " dialect: " + dialect);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,38 +4,24 @@

import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import java.util.*;

import com.exasol.adapter.capabilities.*;
import org.junit.Test;

import com.exasol.adapter.AdapterException;
import com.exasol.adapter.capabilities.*;
import com.exasol.adapter.jdbc.SchemaAdapterNotes;
import com.exasol.adapter.metadata.ColumnMetadata;
import com.exasol.adapter.metadata.DataType;
import com.exasol.adapter.metadata.MetadataException;
import com.exasol.adapter.metadata.TableMetadata;
import com.exasol.adapter.sql.AggregateFunction;
import com.exasol.adapter.sql.ScalarFunction;
import com.exasol.adapter.sql.SqlColumn;
import com.exasol.adapter.sql.SqlFunctionAggregate;
import com.exasol.adapter.sql.SqlFunctionScalar;
import com.exasol.adapter.sql.SqlLiteralExactnumeric;
import com.exasol.adapter.sql.SqlNode;
import com.exasol.adapter.sql.SqlSelectList;
import com.exasol.adapter.sql.SqlStatementSelect;
import com.exasol.adapter.sql.SqlTable;
import com.exasol.adapter.metadata.*;
import com.exasol.adapter.sql.*;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;

import utils.SqlTestUtil;

public class SqlDialectTest {

@Test
public void testAggregateFunctionAliases() throws AdapterException, MetadataException {
public void testAggregateFunctionAliases() throws AdapterException {
final TableMetadata clicksMeta = getTestTableMetadata();
final SqlTable fromClause = new SqlTable("TEST", clicksMeta);
final SqlColumn col1 = new SqlColumn(1, clicksMeta.getColumns().get(0));
Expand Down Expand Up @@ -68,7 +54,7 @@ public void testAggregateFunctionAliases() throws AdapterException, MetadataExce
}

@Test
public void testScalarFunctionAliases() throws AdapterException, MetadataException {
public void testScalarFunctionAliases() throws AdapterException {
final TableMetadata clicksMeta = getTestTableMetadata();
final SqlTable fromClause = new SqlTable("TEST", clicksMeta);
final SqlColumn col1 = new SqlColumn(1, clicksMeta.getColumns().get(0));
Expand Down Expand Up @@ -142,7 +128,7 @@ public void testInvalidAliases() throws Exception {
}
}

private TableMetadata getTestTableMetadata() throws MetadataException {
private TableMetadata getTestTableMetadata() {
final List<ColumnMetadata> columns = new ArrayList<>();
columns.add(new ColumnMetadata("C1", "", DataType.createBool(), true, false, "", ""));
return new TableMetadata("TEST", "", columns, "");
Expand Down
Loading

0 comments on commit d13ba72

Please sign in to comment.