Skip to content

Commit

Permalink
support setting the default schema in the SQLRequest
Browse files Browse the repository at this point in the history
  • Loading branch information
mfussenegger committed Apr 2, 2015
1 parent 5659580 commit 93ebc13
Show file tree
Hide file tree
Showing 15 changed files with 232 additions and 33 deletions.
2 changes: 2 additions & 0 deletions CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ Changes for Crate
Unreleased
==========

- Added support for setting the default schema name in the SQLRequest class

- Fix: ip type conversion did not allow NULL values

- Fix: Grouping or sorting on a dynamically created column of a partitioned
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -428,12 +428,55 @@ public R visitUpdate(Update node, C context) {
return null;
}

@Override
public R visitDelete(Delete node, C context) {
process(node.getRelation(), context);
return null;
}

@Override
public R visitCopyFromStatement(CopyFromStatement node, C context) {
process(node.table(), context);
return null;
}

@Override
public R visitCopyTo(CopyTo node, C context) {
process(node.table(), context);
return null;
}

@Override
public R visitAlterTable(AlterTable node, C context) {
process(node.table(), context);
return null;
}

@Override
public R visitInsertFromSubquery(InsertFromSubquery node, C context) {
process(node.table(), context);
process(node.subQuery(), context);
return null;
}

@Override
public R visitDropTable(DropTable node, C context) {
process(node.table(), context);
return super.visitDropTable(node, context);
}

@Override
public R visitCreateTable(CreateTable node, C context) {
process(node.name(), context);
return null;
}

@Override
public R visitRefreshStatement(RefreshStatement node, C context) {
process(node.table(), context);
return null;
}

@Override
public R visitMatchPredicate(MatchPredicate node, C context)
{
Expand Down
12 changes: 8 additions & 4 deletions sql-parser/src/main/java/io/crate/sql/tree/Table.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

package io.crate.sql.tree;

import com.google.common.base.Objects;
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;

import javax.annotation.Nullable;
Expand All @@ -30,7 +30,7 @@
public class Table
extends QueryBody
{
private final QualifiedName name;
private QualifiedName name;
private final List<Assignment> partitionProperties;

public Table(QualifiedName name)
Expand All @@ -41,7 +41,7 @@ public Table(QualifiedName name)

public Table(QualifiedName name, @Nullable List<Assignment> partitionProperties) {
this.name = name;
this.partitionProperties = Objects.firstNonNull(partitionProperties, ImmutableList.<Assignment>of());
this.partitionProperties = MoreObjects.firstNonNull(partitionProperties, ImmutableList.<Assignment>of());
}

public QualifiedName getName()
Expand All @@ -62,7 +62,7 @@ public <R, C> R accept(AstVisitor<R, C> visitor, C context)
@Override
public String toString()
{
return Objects.toStringHelper(this)
return MoreObjects.toStringHelper(this)
.addValue(name)
.add("partitionProperties", partitionProperties)
.toString();
Expand All @@ -87,4 +87,8 @@ public int hashCode() {
result = 31 * result + partitionProperties.hashCode();
return result;
}

public void setName(QualifiedName qualifiedName) {
name = qualifiedName;
}
}
10 changes: 10 additions & 0 deletions sql/src/main/java/io/crate/action/sql/SQLBaseRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;

import javax.annotation.Nullable;
import java.io.IOException;

/**
Expand Down Expand Up @@ -100,6 +101,15 @@ public long creationTime() {
return creationTime;
}

public void setDefaultSchema(String schemaName) {
putHeader("_s", schemaName);
}

@Nullable
public String getDefaultSchema() {
return getHeader("_s");
}

@Override
public ActionRequestValidationException validate() {
if (stmt == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ protected TransportSQLAction(

@Override
public Analysis getAnalysis(Statement statement, SQLRequest request) {
return analyzer.analyze(statement, request.args(), SQLBulkRequest.EMPTY_BULK_ARGS);
return analyzer.analyze(statement, request.args(), SQLBulkRequest.EMPTY_BULK_ARGS, request.getDefaultSchema());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public TransportSQLBulkAction(ClusterService clusterService,

@Override
public Analysis getAnalysis(Statement statement, SQLBulkRequest request) {
return analyzer.analyze(statement, SQLRequest.EMPTY_ARGS, request.bulkArgs());
return analyzer.analyze(statement, SQLRequest.EMPTY_ARGS, request.bulkArgs(), request.getDefaultSchema());
}

@Override
Expand Down
30 changes: 22 additions & 8 deletions sql/src/main/java/io/crate/analyze/Analyzer.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,30 +23,44 @@
import io.crate.sql.tree.*;
import org.elasticsearch.common.inject.Inject;

import javax.annotation.Nullable;
import java.util.Arrays;
import java.util.List;

public class Analyzer {

private final AnalyzerDispatcher dispatcher;

private final static Object[] EMPTY_ARGS = new Object[0];
private final static Object[][] EMPTY_BULK_ARGS = new Object[0][];
private final static SchemaApplier SCHEMA_APPLIER = new SchemaApplier();

@Inject
public Analyzer(AnalyzerDispatcher dispatcher) {
this.dispatcher = dispatcher;
}

public Analysis analyze(Statement statement) {
return analyze(statement, EMPTY_ARGS, EMPTY_BULK_ARGS);
}

public Analysis analyze(Statement statement, Object[] parameters, Object[][] bulkParams) {
public Analysis analyze(Statement statement, Object[] parameters, Object[][] bulkParams, @Nullable String defaultSchema) {
if (defaultSchema != null) {
SCHEMA_APPLIER.process(statement, defaultSchema);
}
Analysis analysis = new Analysis(new ParameterContext(parameters, bulkParams));
AnalyzedStatement analyzedStatement = dispatcher.process(statement, analysis);
assert analyzedStatement != null : "analyzed statement must not be null";
analysis.analyzedStatement(analyzedStatement);
return analysis;
}

private static class SchemaApplier extends DefaultTraversalVisitor<Void, String> {

@Override
protected Void visitTable(Table node, String schemaName) {
QualifiedName name = node.getName();
List<String> parts = name.getParts();
if (parts.size() == 1) {
node.setName(new QualifiedName(Arrays.asList(schemaName, parts.get(0))));
}
return null;
}
}

public static class AnalyzerDispatcher extends AstVisitor<AnalyzedStatement, Analysis> {

private final DropTableStatementAnalyzer dropTableStatementAnalyzer;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,5 @@

public interface QueriedRelation extends AnalyzedRelation {

public QuerySpec querySpec();

QuerySpec querySpec();
}
9 changes: 5 additions & 4 deletions sql/src/test/java/io/crate/analyze/BaseAnalyzerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -305,16 +305,17 @@ public Symbol normalizeSymbol(Function symbol) {
}

protected AnalyzedStatement analyze(String statement) {
return analyzer.analyze(SqlParser.createStatement(statement)).analyzedStatement();
return analyze(statement, new Object[0]);
}

protected AnalyzedStatement analyze(String statement, Object[] params) {
AnalyzedStatement stmt = analyzer.analyze(SqlParser.createStatement(statement), params, new Object[0][]).analyzedStatement();
return stmt;
return analyzer.analyze(SqlParser.createStatement(statement),
params, new Object[0][], ReferenceInfos.DEFAULT_SCHEMA_NAME).analyzedStatement();
}

protected AnalyzedStatement analyze(String statement, Object[][] bulkArgs) {
return analyzer.analyze(SqlParser.createStatement(statement), new Object[0], bulkArgs).analyzedStatement();
return analyzer.analyze(SqlParser.createStatement(statement),
new Object[0], bulkArgs, ReferenceInfos.DEFAULT_SCHEMA_NAME).analyzedStatement();
}

protected List<Module> getModules() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import io.crate.metadata.table.ColumnPolicy;
import io.crate.metadata.table.SchemaInfo;
import io.crate.operation.operator.OperatorModule;
import io.crate.sql.parser.SqlParser;
import io.crate.testing.MockedClusterServiceModule;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.settings.ImmutableSettings;
Expand Down Expand Up @@ -277,7 +278,7 @@ public void testCreateTableWithArray() throws Exception {

assertThat((String)details.get("type"), is("array"));
Map<String, Object> inner = (Map<String, Object>)details.get("inner");
assertThat((String)inner.get("type"), is("string"));
assertThat((String) inner.get("type"), is("string"));
}

@Test
Expand Down Expand Up @@ -640,4 +641,23 @@ public void testCreateTableWithInvalidColumnName() throws Exception {
expectedException.expectMessage("column name \"'test\" is invalid");
analyze("create table my_table (\"'test\" string)");
}

@Test
public void testExplicitSchemaHasPrecedenceOverDefaultSchema() throws Exception {
CreateTableAnalyzedStatement statement = (CreateTableAnalyzedStatement) analyzer.analyze(
SqlParser.createStatement("create table foo.bar (x string)"),
new Object[0], new Object[0][], "hoschi").analyzedStatement();

// schema from statement must take precedence
assertThat(statement.tableIdent.schema(), is("foo"));
}

@Test
public void testDefaultSchemaIsAddedToTableIdentIfNoEplicitSchemaExistsInTheStatement() throws Exception {
CreateTableAnalyzedStatement statement = (CreateTableAnalyzedStatement) analyzer.analyze(
SqlParser.createStatement("create table bar (x string)"),
new Object[0], new Object[0][], "hoschi").analyzedStatement();

assertThat(statement.tableIdent.schema(), is("hoschi"));
}
}
13 changes: 8 additions & 5 deletions sql/src/test/java/io/crate/analyze/UpdateAnalyzerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -114,20 +114,23 @@ protected List<Module> getModules() {
}

protected UpdateAnalyzedStatement analyze(String statement) {
return ((UpdateAnalyzedStatement) analyzer.analyze(SqlParser.createStatement(statement)).analyzedStatement());
return analyze(statement, new Object[0]);
}

protected UpdateAnalyzedStatement analyze(String statement, Object[] params) {
return ((UpdateAnalyzedStatement) analyzer.analyze(
SqlParser.createStatement(statement),
return (UpdateAnalyzedStatement) analyzer.analyze(SqlParser.createStatement(statement),
params,
new Object[0][]).analyzedStatement());
new Object[0][],
ReferenceInfos.DEFAULT_SCHEMA_NAME
).analyzedStatement();
}

protected UpdateAnalyzedStatement analyze(String statement, Object[][] bulkArgs) {
return (UpdateAnalyzedStatement) analyzer.analyze(SqlParser.createStatement(statement),
new Object[0],
bulkArgs).analyzedStatement();
bulkArgs,
ReferenceInfos.DEFAULT_SCHEMA_NAME
).analyzedStatement();
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,8 @@ protected void bindSchemas() {
}

private DeleteAnalyzedStatement analyzeDelete(String stmt, Object[][] bulkArgs) {
return (DeleteAnalyzedStatement) analyzer.analyze(SqlParser.createStatement(stmt), new Object[0], bulkArgs).analyzedStatement();
return (DeleteAnalyzedStatement) analyzer.analyze(SqlParser.createStatement(stmt),
new Object[0], bulkArgs, ReferenceInfos.DEFAULT_SCHEMA_NAME).analyzedStatement();
}

private DeleteAnalyzedStatement analyzeDelete(String stmt) {
Expand All @@ -169,12 +170,12 @@ private DeleteAnalyzedStatement analyzeDelete(String stmt) {

private UpdateAnalyzedStatement analyzeUpdate(String stmt) {
return (UpdateAnalyzedStatement) analyzer.analyze(
SqlParser.createStatement(stmt), new Object[0], new Object[0][]).analyzedStatement();
SqlParser.createStatement(stmt), new Object[0], new Object[0][], ReferenceInfos.DEFAULT_SCHEMA_NAME).analyzedStatement();
}

private WhereClause analyzeSelect(String stmt, Object... args) {
SelectAnalyzedStatement statement = (SelectAnalyzedStatement) analyzer.analyze(
SqlParser.createStatement(stmt), args, new Object[0][]).analyzedStatement();
SqlParser.createStatement(stmt), args, new Object[0][], ReferenceInfos.DEFAULT_SCHEMA_NAME).analyzedStatement();
return statement.relation().querySpec().where();
}

Expand Down
Loading

0 comments on commit 93ebc13

Please sign in to comment.