I know this has the wrong committer email for this commit. My git config got messed up with my github one. I fixed it now moving forward. Sorry for the confusion.
Kevin Risden On Wed, Mar 23, 2016 at 3:55 PM, <[email protected]> wrote: > Repository: lucene-solr > Updated Branches: > refs/heads/branch_6_0 a144f16f7 -> 658b2a4a9 > > > SOLR-8819: Implement DatabaseMetaDataImpl getTables() and fix > getSchemas(). (Trey Cahill, Joel Bernstein, Kevin Risden) > > > Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo > Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/658b2a4a > Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/658b2a4a > Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/658b2a4a > > Branch: refs/heads/branch_6_0 > Commit: 658b2a4a925ed694a2c11add8c1bb81de1525294 > Parents: a144f16 > Author: Kevin Risden <[email protected]> > Authored: Wed Mar 23 15:49:21 2016 -0500 > Committer: Kevin Risden <[email protected]> > Committed: Wed Mar 23 15:54:45 2016 -0500 > > ---------------------------------------------------------------------- > solr/CHANGES.txt | 3 + > .../org/apache/solr/handler/SQLHandler.java | 79 ++++++++++++++------ > .../org/apache/solr/handler/TestSQLHandler.java | 73 +++++++++++++++++- > .../client/solrj/io/sql/ConnectionImpl.java | 10 ++- > .../solrj/io/sql/DatabaseMetaDataImpl.java | 2 +- > .../solr/client/solrj/io/sql/StatementImpl.java | 4 +- > .../solr/client/solrj/io/sql/JdbcTest.java | 21 ++++-- > 7 files changed, 156 insertions(+), 36 deletions(-) > ---------------------------------------------------------------------- > > > > http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/658b2a4a/solr/CHANGES.txt > ---------------------------------------------------------------------- > diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt > index 4bc695d..de8d039 100644 > --- a/solr/CHANGES.txt > +++ b/solr/CHANGES.txt > @@ -432,6 +432,9 @@ Other Changes > * SOLR-8740: docValues are now enabled by default for most non-text > (string, date, and numeric) fields > in the schema templates. (yonik) > > +* SOLR-8819: Implement DatabaseMetaDataImpl getTables() and fix > getSchemas(). (Trey Cahill, > + Joel Bernstein, Kevin Risden) > + > ================== 5.5.1 ================== > > Bug Fixes > > > http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/658b2a4a/solr/core/src/java/org/apache/solr/handler/SQLHandler.java > ---------------------------------------------------------------------- > diff --git a/solr/core/src/java/org/apache/solr/handler/SQLHandler.java > b/solr/core/src/java/org/apache/solr/handler/SQLHandler.java > index fe83187..49c096c 100644 > --- a/solr/core/src/java/org/apache/solr/handler/SQLHandler.java > +++ b/solr/core/src/java/org/apache/solr/handler/SQLHandler.java > @@ -52,6 +52,7 @@ import > org.apache.solr.client.solrj.io.stream.UniqueStream; > import org.apache.solr.client.solrj.io.stream.expr.StreamFactory; > import org.apache.solr.client.solrj.io.stream.metrics.*; > import org.apache.solr.common.SolrException; > +import org.apache.solr.common.cloud.ZkStateReader; > import org.apache.solr.common.params.CommonParams; > import org.apache.solr.common.params.ModifiableSolrParams; > import org.apache.solr.common.params.SolrParams; > @@ -166,17 +167,11 @@ public class SQLHandler extends RequestHandlerBase > implements SolrCoreAware { > TupleStream sqlStream = null; > > if(sqlVistor.table.toUpperCase(Locale.ROOT).contains("_CATALOGS_")) > { > - if (!sqlVistor.fields.contains("TABLE_CAT")) { > - throw new IOException("When querying _CATALOGS_, fields must > contain column TABLE_CAT"); > - } > - > - sqlStream = new CatalogsStream(defaultZkhost); > + sqlStream = new SelectStream(new CatalogsStream(defaultZkhost), > sqlVistor.columnAliases); > } else > if(sqlVistor.table.toUpperCase(Locale.ROOT).contains("_SCHEMAS_")) { > - if (!sqlVistor.fields.contains("TABLE_SCHEM") || > !sqlVistor.fields.contains("TABLE_CATALOG")) { > - throw new IOException("When querying _SCHEMAS_, fields must > contain both TABLE_SCHEM and TABLE_CATALOG"); > - } > - > - sqlStream = new SchemasStream(defaultZkhost); > + sqlStream = new SelectStream(new SchemasStream(defaultZkhost), > sqlVistor.columnAliases); > + } else > if(sqlVistor.table.toUpperCase(Locale.ROOT).contains("_TABLES_")) { > + sqlStream = new SelectStream(new TableStream(defaultZkhost), > sqlVistor.columnAliases); > } else if(sqlVistor.groupByQuery) { > if(aggregationMode == AggregationMode.FACET) { > sqlStream = doGroupByWithAggregatesFacets(sqlVistor); > @@ -1371,7 +1366,7 @@ public class SQLHandler extends RequestHandlerBase > implements SolrCoreAware { > private int currentIndex = 0; > private List<String> catalogs; > > - public CatalogsStream(String zkHost) { > + CatalogsStream(String zkHost) { > this.zkHost = zkHost; > } > > @@ -1385,7 +1380,7 @@ public class SQLHandler extends RequestHandlerBase > implements SolrCoreAware { > } > > public Tuple read() throws IOException { > - Map fields = new HashMap<>(); > + Map<String, String> fields = new HashMap<>(); > if (this.currentIndex < this.catalogs.size()) { > fields.put("TABLE_CAT", this.catalogs.get(this.currentIndex)); > this.currentIndex += 1; > @@ -1411,10 +1406,45 @@ public class SQLHandler extends RequestHandlerBase > implements SolrCoreAware { > private static class SchemasStream extends TupleStream { > private final String zkHost; > private StreamContext context; > + > + SchemasStream(String zkHost) { > + this.zkHost = zkHost; > + } > + > + public List<TupleStream> children() { > + return new ArrayList<>(); > + } > + > + public void open() throws IOException { > + > + } > + > + public Tuple read() throws IOException { > + Map<String, String> fields = new HashMap<>(); > + fields.put("EOF", "true"); > + return new Tuple(fields); > + } > + > + public StreamComparator getStreamSort() { > + return null; > + } > + > + public void close() throws IOException { > + > + } > + > + public void setStreamContext(StreamContext context) { > + this.context = context; > + } > + } > + > + private static class TableStream extends TupleStream { > + private final String zkHost; > + private StreamContext context; > private int currentIndex = 0; > - private List<String> schemas; > + private List<String> tables; > > - public SchemasStream(String zkHost) { > + TableStream(String zkHost) { > this.zkHost = zkHost; > } > > @@ -1423,18 +1453,25 @@ public class SQLHandler extends RequestHandlerBase > implements SolrCoreAware { > } > > public void open() throws IOException { > - this.schemas = new ArrayList<>(); > + this.tables = new ArrayList<>(); > > CloudSolrClient cloudSolrClient = > this.context.getSolrClientCache().getCloudSolrClient(this.zkHost); > - > this.schemas.addAll(cloudSolrClient.getZkStateReader().getClusterState().getCollections()); > - Collections.sort(this.schemas); > + cloudSolrClient.connect(); > + ZkStateReader zkStateReader = cloudSolrClient.getZkStateReader(); > + if (zkStateReader.getClusterState().getCollections().size() != 0) { > + > this.tables.addAll(zkStateReader.getClusterState().getCollections()); > + } > + Collections.sort(this.tables); > } > > public Tuple read() throws IOException { > - Map fields = new HashMap<>(); > - if (this.currentIndex < this.schemas.size()) { > - fields.put("TABLE_SCHEM", this.schemas.get(this.currentIndex)); > - fields.put("TABLE_CATALOG", this.zkHost); > + Map<String, String> fields = new HashMap<>(); > + if (this.currentIndex < this.tables.size()) { > + fields.put("TABLE_CAT", this.zkHost); > + fields.put("TABLE_SCHEM", null); > + fields.put("TABLE_NAME", this.tables.get(this.currentIndex)); > + fields.put("TABLE_TYPE", "TABLE"); > + fields.put("REMARKS", null); > this.currentIndex += 1; > } else { > fields.put("EOF", "true"); > > > http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/658b2a4a/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java > ---------------------------------------------------------------------- > diff --git > a/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java > b/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java > index 0e5cbaf..9eca6db 100644 > --- a/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java > +++ b/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java > @@ -18,6 +18,7 @@ package org.apache.solr.handler; > > import java.io.IOException; > import java.util.ArrayList; > +import java.util.Collections; > import java.util.HashMap; > import java.util.List; > import java.util.Map; > @@ -33,7 +34,6 @@ import org.apache.solr.common.params.CommonParams; > import org.junit.After; > import org.junit.AfterClass; > import org.junit.Before; > -import org.junit.BeforeClass; > import org.junit.Test; > > public class TestSQLHandler extends AbstractFullDistribZkTestBase { > @@ -99,6 +99,9 @@ public class TestSQLHandler extends > AbstractFullDistribZkTestBase { > testParallelBasicGrouping(); > testParallelSelectDistinct(); > testParallelTimeSeriesGrouping(); > + testCatalogStream(); > + testSchemasStream(); > + testTablesStream(); > } > > private void testPredicate() throws Exception { > @@ -2418,6 +2421,74 @@ public class TestSQLHandler extends > AbstractFullDistribZkTestBase { > } > } > > + private void testCatalogStream() throws Exception { > + CloudJettyRunner jetty = this.cloudJettys.get(0); > + > + Map<String, Object> params = new HashMap<>(); > + params.put(CommonParams.QT, "/sql"); > + params.put("numWorkers", 2); > + params.put("stmt", "select TABLE_CAT from _CATALOGS_"); > + > + SolrStream solrStream = new SolrStream(jetty.url, params); > + List<Tuple> tuples = getTuples(solrStream); > + > + assertEquals(tuples.size(), 1); > + assertEquals(tuples.get(0).getString("TABLE_CAT"), > zkServer.getZkAddress()); > + } > + > + private void testSchemasStream() throws Exception { > + CloudJettyRunner jetty = this.cloudJettys.get(0); > + > + Map<String, Object> params = new HashMap<>(); > + params.put(CommonParams.QT, "/sql"); > + params.put("numWorkers", 2); > + params.put("stmt", "select TABLE_SCHEM, TABLE_CATALOG from > _SCHEMAS_"); > + > + SolrStream solrStream = new SolrStream(jetty.url, params); > + List<Tuple> tuples = getTuples(solrStream); > + > + assertEquals(tuples.size(), 0); > + } > + > + private void testTablesStream() throws Exception { > + CloudJettyRunner jetty = this.cloudJettys.get(0); > + > + Map<String, Object> params = new HashMap<>(); > + params.put(CommonParams.QT, "/sql"); > + params.put("numWorkers", 2); > + params.put("stmt", "select TABLE_CAT, TABLE_SCHEM, TABLE_NAME, > TABLE_TYPE, REMARKS from _TABLES_"); > + > + SolrStream solrStream = new SolrStream(jetty.url, params); > + List<Tuple> tuples = getTuples(solrStream); > + > + assertEquals(2, tuples.size()); > + > + List<String> collections = new ArrayList<>(); > + > collections.addAll(cloudClient.getZkStateReader().getClusterState().getCollections()); > + Collections.sort(collections); > + for (Tuple tuple : tuples) { > + assertEquals(zkServer.getZkAddress(), tuple.getString("TABLE_CAT")); > + assertNull(tuple.get("TABLE_SCHEM")); > + assertTrue(collections.contains(tuple.getString("TABLE_NAME"))); > + assertEquals("TABLE", tuple.getString("TABLE_TYPE")); > + assertNull(tuple.get("REMARKS")); > + } > + > + tuples = getTuples(solrStream); > + assertEquals(2, tuples.size()); > + > + collections = new ArrayList<>(); > + > collections.addAll(cloudClient.getZkStateReader().getClusterState().getCollections()); > + Collections.sort(collections); > + for (Tuple tuple : tuples) { > + assertEquals(zkServer.getZkAddress(), tuple.getString("TABLE_CAT")); > + assertNull(tuple.get("TABLE_SCHEM")); > + assertTrue(collections.contains(tuple.getString("TABLE_NAME"))); > + assertEquals("TABLE", tuple.getString("TABLE_TYPE")); > + assertNull(tuple.get("REMARKS")); > + } > + } > + > protected List<Tuple> getTuples(TupleStream tupleStream) throws > IOException { > tupleStream.open(); > List<Tuple> tuples = new ArrayList(); > > > http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/658b2a4a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/ConnectionImpl.java > ---------------------------------------------------------------------- > diff --git > a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/ConnectionImpl.java > b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/ConnectionImpl.java > index 95105c8..d1e79eb 100644 > --- > a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/ConnectionImpl.java > +++ > b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/ConnectionImpl.java > @@ -55,7 +55,7 @@ class ConnectionImpl implements Connection { > ConnectionImpl(String url, String zkHost, String collection, Properties > properties) throws SQLException { > this.url = url; > this.client = this.solrClientCache.getCloudSolrClient(zkHost); > - this.setSchema(collection); > + this.collection = collection; > this.properties = properties; > this.connectionStatement = createStatement(); > this.databaseMetaData = new DatabaseMetaDataImpl(this, > this.connectionStatement); > @@ -69,6 +69,10 @@ class ConnectionImpl implements Connection { > return client; > } > > + String getCollection() { > + return collection; > + } > + > Properties getProperties() { > return properties; > } > @@ -345,12 +349,12 @@ class ConnectionImpl implements Connection { > > @Override > public void setSchema(String schema) throws SQLException { > - this.collection = schema; > + > } > > @Override > public String getSchema() throws SQLException { > - return this.collection; > + return null; > } > > @Override > > > http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/658b2a4a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/DatabaseMetaDataImpl.java > ---------------------------------------------------------------------- > diff --git > a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/DatabaseMetaDataImpl.java > b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/DatabaseMetaDataImpl.java > index 62f2a18..d316c83 100644 > --- > a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/DatabaseMetaDataImpl.java > +++ > b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/DatabaseMetaDataImpl.java > @@ -705,7 +705,7 @@ class DatabaseMetaDataImpl implements DatabaseMetaData > { > > @Override > public ResultSet getTables(String catalog, String schemaPattern, String > tableNamePattern, String[] types) throws SQLException { > - return null; > + return this.connectionStatement.executeQuery("select TABLE_CAT, > TABLE_SCHEM, TABLE_NAME, TABLE_TYPE, REMARKS from _TABLES_"); > } > > @Override > > > http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/658b2a4a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java > ---------------------------------------------------------------------- > diff --git > a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java > b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java > index 1adcea8..7f1e2f9 100644 > --- > a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java > +++ > b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java > @@ -76,10 +76,10 @@ class StatementImpl implements Statement { > try { > ZkStateReader zkStateReader = > this.connection.getClient().getZkStateReader(); > ClusterState clusterState = zkStateReader.getClusterState(); > - Collection<Slice> slices = > clusterState.getActiveSlices(this.connection.getSchema()); > + Collection<Slice> slices = > clusterState.getActiveSlices(this.connection.getCollection()); > > if(slices == null) { > - throw new Exception("Collection not > found:"+this.connection.getSchema()); > + throw new Exception("Collection not > found:"+this.connection.getCollection()); > } > > List<Replica> shuffler = new ArrayList<>(); > > > http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/658b2a4a/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java > ---------------------------------------------------------------------- > diff --git > a/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java > b/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java > index 572491e..393d63a 100644 > --- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java > +++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java > @@ -28,7 +28,6 @@ import java.util.ArrayList; > import java.util.Collections; > import java.util.List; > import java.util.Properties; > -import java.util.Set; > > import org.apache.lucene.util.LuceneTestCase; > import org.apache.lucene.util.LuceneTestCase.Slow; > @@ -36,7 +35,6 @@ import > org.apache.solr.cloud.AbstractFullDistribZkTestBase; > import org.apache.solr.cloud.AbstractZkTestCase; > import org.junit.After; > import org.junit.AfterClass; > -import org.junit.Before; > import org.junit.BeforeClass; > import org.junit.Test; > > @@ -81,7 +79,6 @@ public class JdbcTest extends > AbstractFullDistribZkTestBase { > super.distribSetUp(); > } > > - > @Override > @After > public void tearDown() throws Exception { > @@ -444,9 +441,9 @@ public class JdbcTest extends > AbstractFullDistribZkTestBase { > con.setCatalog(zkServer.getZkAddress()); > assertEquals(zkServer.getZkAddress(), con.getCatalog()); > > - assertEquals(collection, con.getSchema()); > - con.setSchema(collection); > - assertEquals(collection, con.getSchema()); > + assertEquals(null, con.getSchema()); > + con.setSchema("myschema"); > + assertEquals(null, con.getSchema()); > > DatabaseMetaData databaseMetaData = con.getMetaData(); > assertNotNull(databaseMetaData); > @@ -478,11 +475,19 @@ public class JdbcTest extends > AbstractFullDistribZkTestBase { > List<String> collections = new ArrayList<>(); > > > collections.addAll(cloudClient.getZkStateReader().getClusterState().getCollections()); > Collections.sort(collections); > + > try(ResultSet rs = databaseMetaData.getSchemas()) { > + assertFalse(rs.next()); > + } > + > + try(ResultSet rs = > databaseMetaData.getTables(zkServer.getZkAddress(), null, "%", null)) { > for(String acollection : collections) { > assertTrue(rs.next()); > - assertEquals(acollection, rs.getString("TABLE_SCHEM")); > - assertEquals(zkServer.getZkAddress(), > rs.getString("TABLE_CATALOG")); > + assertEquals(zkServer.getZkAddress(), > rs.getString("TABLE_CAT")); > + assertNull(rs.getString("TABLE_SCHEM")); > + assertEquals(acollection, rs.getString("TABLE_NAME")); > + assertEquals("TABLE", rs.getString("TABLE_TYPE")); > + assertNull(rs.getString("REMARKS")); > } > assertFalse(rs.next()); > } > >
