You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by kr...@apache.org on 2016/04/30 16:48:01 UTC

lucene-solr:jira/solr-8593: Cleanup SQLHandler to use JDBCStream if not requiring metadata

Repository: lucene-solr
Updated Branches:
  refs/heads/jira/solr-8593 1bd2e8247 -> 1520ff381


Cleanup SQLHandler to use JDBCStream if not requiring metadata


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/1520ff38
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/1520ff38
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/1520ff38

Branch: refs/heads/jira/solr-8593
Commit: 1520ff3810050f70ad7175dd8f19ca1748279485
Parents: 1bd2e82
Author: Kevin Risden <kr...@apache.org>
Authored: Sat Apr 30 09:31:40 2016 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Sat Apr 30 09:31:40 2016 -0500

----------------------------------------------------------------------
 .../org/apache/solr/handler/SQLHandler.java     | 72 ++++++++++++--------
 1 file changed, 44 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1520ff38/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 7cc347a..6b3192c 100644
--- a/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
@@ -36,6 +36,7 @@ import org.apache.calcite.config.Lex;
 import org.apache.solr.client.solrj.io.Tuple;
 import org.apache.solr.client.solrj.io.comp.StreamComparator;
 import org.apache.solr.client.solrj.io.stream.ExceptionStream;
+import org.apache.solr.client.solrj.io.stream.JDBCStream;
 import org.apache.solr.client.solrj.io.stream.StreamContext;
 import org.apache.solr.client.solrj.io.stream.TupleStream;
 import org.apache.solr.client.solrj.io.stream.expr.Explanation;
@@ -63,7 +64,6 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware , Pe
   private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   public void inform(SolrCore core) {
-
     CoreContainer coreContainer = core.getCoreDescriptor().getCoreContainer();
 
     if(coreContainer.isZooKeeperAware()) {
@@ -85,8 +85,7 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware , Pe
     params.set("workerCollection", params.get("workerCollection", defaultWorkerCollection));
     params.set("workerZkhost", params.get("workerZkhost", defaultZkhost));
     params.set("aggregationMode", params.get("aggregationMode", "map_reduce"));
-    // JDBC driver requires metadata from the SQLHandler. Default to false since this adds a new Metadata stream.
-    params.set("includeMetadata", params.getBool("includeMetadata", false));
+
 
     TupleStream tupleStream = null;
     try {
@@ -94,11 +93,35 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware , Pe
         throw new Exception("stmt parameter cannot be null");
       }
 
-      /*
-       * Would be great to replace this with the JDBCStream. Can't do that currently since need to have metadata
-       * added to the stream for the JDBC driver. This could be fixed by using the Calcite Avatica server and client.
-       */
-      tupleStream = new StreamHandler.TimerStream(new ExceptionStream(new SqlHandlerStream(sql, params)));
+      String url = "jdbc:calcitesolr:";
+
+      Properties properties = new Properties();
+      // Add all query parameters
+      Iterator<String> parameterNamesIterator = params.getParameterNamesIterator();
+      while(parameterNamesIterator.hasNext()) {
+        String param = parameterNamesIterator.next();
+        properties.setProperty(param, params.get(param));
+      }
+
+      // Set these last to ensure that they are set properly
+      properties.setProperty("lex", Lex.MYSQL.toString());
+      properties.setProperty("zk", defaultZkhost);
+
+      String driverClass = CalciteSolrDriver.class.getCanonicalName();
+
+      // JDBC driver requires metadata from the SQLHandler. Default to false since this adds a new Metadata stream.
+      if(params.getBool("includeMetadata", false)) {
+        /*
+         * Would be great to replace this with the JDBCStream. Can't do that currently since need to have metadata
+         * added to the stream for the JDBC driver. This could be fixed by using the Calcite Avatica server and client.
+         */
+        tupleStream = new SqlHandlerStream(url, sql, properties, driverClass);
+      } else {
+        tupleStream = new JDBCStream(url, sql, null, properties, driverClass);
+      }
+
+      tupleStream = new StreamHandler.TimerStream(new ExceptionStream(tupleStream));
+
 
       rsp.add("result-set", tupleStream);
     } catch(Exception e) {
@@ -119,9 +142,14 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware , Pe
     return null;
   }
 
+  /*
+   * Only necessary for SolrJ JDBC driver since metadata has to be passed back
+   */
   private class SqlHandlerStream extends TupleStream {
+    private final String url;
     private final String sql;
-    private final SolrParams params;
+    private final Properties properties;
+    private final String driverClass;
     private boolean firstTuple = true;
     private Connection connection;
     private Statement statement;
@@ -129,9 +157,11 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware , Pe
     private ResultSetMetaData resultSetMetaData;
     private int numColumns;
 
-    SqlHandlerStream(String sql, SolrParams params) {
+    SqlHandlerStream(String url, String sql, Properties properties, String driverClass) {
+      this.url = url;
       this.sql = sql;
-      this.params = params;
+      this.properties = properties;
+      this.driverClass = driverClass;
     }
 
     public List<TupleStream> children() {
@@ -139,26 +169,14 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware , Pe
     }
 
     public void open() throws IOException {
-      Properties properties = new Properties();
-      // Add all query parameters
-      Iterator<String> parameterNamesIterator = params.getParameterNamesIterator();
-      while(parameterNamesIterator.hasNext()) {
-        String param = parameterNamesIterator.next();
-        properties.setProperty(param, params.get(param));
-      }
-
-      // Set these last to ensure that they are set properly
-      properties.setProperty("lex", Lex.MYSQL.toString());
-      properties.setProperty("zk", defaultZkhost);
-
       try {
-        Class.forName(CalciteSolrDriver.class.getCanonicalName());
+        Class.forName(driverClass);
       } catch (ClassNotFoundException e) {
         throw new IOException(e);
       }
 
       try {
-        connection = DriverManager.getConnection("jdbc:calcitesolr:", properties);
+        connection = DriverManager.getConnection(url, properties);
         statement = connection.createStatement();
         resultSet = statement.executeQuery(sql);
         resultSetMetaData = this.resultSet.getMetaData();
@@ -183,7 +201,7 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware , Pe
     public Tuple read() throws IOException {
       try {
         Map<String, Object> fields = new HashMap<>();
-        if(firstTuple && params.getBool("includeMetadata")) {
+        if(firstTuple) {
           firstTuple = false;
 
           List<String> metadataFields = new ArrayList<>();
@@ -223,8 +241,6 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware , Pe
         try {
           closeable.close();
         } catch (Exception ignore) {
-        } finally {
-          closeable = null;
         }
       }
     }