You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ab...@apache.org on 2017/02/16 13:46:53 UTC

[03/50] lucene-solr:jira/solr-9858: Make SQLHandlerStream extend JDBCStream

Make SQLHandlerStream extend JDBCStream


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

Branch: refs/heads/jira/solr-9858
Commit: 0188345e84671b24286f000ec044a435b1a5e086
Parents: 5f3b423
Author: Kevin Risden <kr...@apache.org>
Authored: Thu Nov 3 10:22:20 2016 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Thu Nov 3 10:22:20 2016 -0500

----------------------------------------------------------------------
 .../org/apache/solr/handler/SQLHandler.java     | 127 ++++---------------
 .../solr/client/solrj/io/stream/JDBCStream.java |   2 +-
 2 files changed, 24 insertions(+), 105 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/0188345e/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 7b72a4c..549efac 100644
--- a/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
@@ -18,14 +18,9 @@ package org.apache.solr.handler;
 
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
-import java.sql.Statement;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -37,11 +32,7 @@ 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;
-import org.apache.solr.client.solrj.io.stream.expr.StreamExplanation;
-import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.core.CoreContainer;
@@ -55,7 +46,7 @@ import org.apache.solr.util.plugin.SolrCoreAware;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class SQLHandler extends RequestHandlerBase implements SolrCoreAware , PermissionNameProvider {
+public class SQLHandler extends RequestHandlerBase implements SolrCoreAware, PermissionNameProvider {
 
   private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
@@ -118,15 +109,8 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware , Pe
       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);
-      }
+      boolean includeMetadata = params.getBool("includeMetadata", false);
+      tupleStream = new SqlHandlerStream(url, sql, null, properties, driverClass, includeMetadata);
 
       tupleStream = new StreamHandler.TimerStream(new ExceptionStream(tupleStream));
 
@@ -152,68 +136,32 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware , Pe
   /*
    * 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 Properties properties;
-    private final String driverClass;
+  private class SqlHandlerStream extends JDBCStream {
+    private final boolean includeMetadata;
     private boolean firstTuple = true;
-    private Connection connection;
-    private Statement statement;
-    private ResultSet resultSet;
-    private ResultSetMetaData resultSetMetaData;
-    private int numColumns;
-
-    SqlHandlerStream(String url, String sql, Properties properties, String driverClass) {
-      this.url = url;
-      this.sql = sql;
-      this.properties = properties;
-      this.driverClass = driverClass;
-    }
 
-    public List<TupleStream> children() {
-      return Collections.emptyList();
-    }
-
-    public void open() throws IOException {
-      try {
-        Class.forName(driverClass);
-      } catch (ClassNotFoundException e) {
-        throw new IOException(e);
-      }
+    SqlHandlerStream(String connectionUrl, String sqlQuery, StreamComparator definedSort,
+                     Properties connectionProperties, String driverClassName, boolean includeMetadata)
+        throws IOException {
+      super(connectionUrl, sqlQuery, definedSort, connectionProperties, driverClassName);
 
-      try {
-        connection = DriverManager.getConnection(url, properties);
-        statement = connection.createStatement();
-        resultSet = statement.executeQuery(sql);
-        resultSetMetaData = this.resultSet.getMetaData();
-        numColumns = resultSetMetaData.getColumnCount();
-      } catch (SQLException e) {
-        this.close();
-        throw new IOException(e);
-      }
+      this.includeMetadata = includeMetadata;
     }
 
     @Override
-    public Explanation toExplanation(StreamFactory factory) throws IOException {
-
-      return new StreamExplanation(getStreamNodeId().toString())
-          .withFunctionName("SQL Handler")
-          .withExpression("--non-expressible--")
-          .withImplementingClass(this.getClass().getName())
-          .withExpressionType(Explanation.ExpressionType.STREAM_DECORATOR);
-    }
-
-    // Return a metadata tuple as the first tuple and then pass through to the underlying stream.
     public Tuple read() throws IOException {
-      try {
-        Map<String, Object> fields = new HashMap<>();
-        if(firstTuple) {
+      // Return a metadata tuple as the first tuple and then pass through to the JDBCStream.
+      if(includeMetadata && firstTuple) {
+        try {
+          Map<String, Object> fields = new HashMap<>();
+
           firstTuple = false;
 
+          ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+
           List<String> metadataFields = new ArrayList<>();
           Map<String, String> metadataAliases = new HashMap<>();
-          for(int i = 1; i <= numColumns; i++) {
+          for(int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
             String columnName = resultSetMetaData.getColumnName(i);
             String columnLabel = resultSetMetaData.getColumnLabel(i);
             metadataFields.add(columnName);
@@ -223,42 +171,13 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware , Pe
           fields.put("isMetadata", true);
           fields.put("fields", metadataFields);
           fields.put("aliases", metadataAliases);
-        } else {
-          if(this.resultSet.next()){
-            for(int i = 1; i <= numColumns; i++) {
-              fields.put(resultSetMetaData.getColumnLabel(i), this.resultSet.getObject(i));
-            }
-          } else {
-            fields.put("EOF", true);
-          }
-
-        }
-        return new Tuple(fields);
-      } catch (SQLException e) {
-        throw new IOException(e);
-      }
-    }
-
-    public StreamComparator getStreamSort() {
-      return null;
-    }
-
-    private void closeQuietly(AutoCloseable closeable) {
-      if(closeable != null) {
-        try {
-          closeable.close();
-        } catch (Exception ignore) {
+          return new Tuple(fields);
+        } catch (SQLException e) {
+          throw new IOException(e);
         }
+      } else {
+        return super.read();
       }
     }
-
-    public void close() throws IOException {
-      this.closeQuietly(this.resultSet);
-      this.closeQuietly(this.statement);
-      this.closeQuietly(this.connection);
-    }
-
-    public void setStreamContext(StreamContext context) {
-    }
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/0188345e/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
index 9763809..4f71e17f 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
@@ -85,8 +85,8 @@ public class JDBCStream extends TupleStream implements Expressible {
   private Connection connection;
   private Properties connectionProperties;
   private Statement statement;
-  private ResultSet resultSet;
   private ResultSetValueSelector[] valueSelectors;
+  protected ResultSet resultSet;
   protected transient StreamContext streamContext;
 
   public JDBCStream(String connectionUrl, String sqlQuery, StreamComparator definedSort) throws IOException {