Selaa lähdekoodia

HUE-238. beeswax: result from "limit" query unavailable

bc Wong 14 vuotta sitten
vanhempi
commit
77d2320385

+ 4 - 0
.gitignore

@@ -55,6 +55,10 @@ desktop/core/ext-py/lxml/src/lxml/lxml-version.h
 # Common utility alias
 /d
 
+# Intellij project files
+.idea/
+*.iml
+
 # Database of running server
 desktop/desktop.db
 app.reg

+ 8 - 2
apps/beeswax/java/src/main/java/com/cloudera/beeswax/BeeswaxServiceImpl.java

@@ -52,6 +52,7 @@ import org.apache.hadoop.hive.metastore.api.FieldSchema;
 import org.apache.hadoop.hive.metastore.api.Schema;
 import org.apache.hadoop.hive.ql.Driver;
 import org.apache.hadoop.hive.ql.exec.FetchTask;
+import org.apache.hadoop.hive.ql.exec.TaskFactory;
 import org.apache.hadoop.hive.ql.exec.Utilities;
 import org.apache.hadoop.hive.ql.metadata.Hive;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
@@ -333,9 +334,14 @@ public class BeeswaxServiceImpl implements BeeswaxService.Iface {
       }
 
       if (startOver) {
+        // We need to make a new FetchTask. Every time we fetch, the current
+        // FetchTask's internal states change. (E.g. it keeps a current fetch
+        // count to implement the LIMIT clause.)
         // This is totally inappropriately reaching into internals.
-        driver.getPlan().getFetchTask().initialize(hiveConf,
-            driver.getPlan(), null);
+        FetchWork work = driver.getPlan().getFetchTask().getWork();
+        FetchTask ft = (FetchTask) TaskFactory.get(work, hiveConf);
+        ft.initialize(hiveConf, driver.getPlan(), null);
+        driver.getPlan().setFetchTask(ft);
         startRow = 0;
       }
 

+ 12 - 0
apps/beeswax/src/beeswax/tests.py

@@ -382,6 +382,18 @@ for x in sys.stdin:
       answer = [ int(data.strip('"')) for data in csv.split()[1:] ]
       assert_equal( [ i + 1, i + 2 ], answer)
 
+  def test_data_export_limit_clause(self):
+    limit = 3
+    query_msg = BeeswaxService.Query()
+    query_msg.query = 'SELECT foo FROM test limit %d' % (limit,)
+    query_msg.configuration = []
+    query_msg.hadoop_user = "test"
+    handle = beeswax.db_utils.db_client().query(query_msg)
+    query_data = beeswax.models.QueryHistory(server_id=handle.id, log_context=handle.log_context)
+    # Get the result in csv. Should have 3 + 1 header row.
+    csv_resp = beeswax.data_export.download(query_data, 'csv')
+    assert_equal(len(csv_resp.content.strip().split('\n')), limit + 1)
+
   def test_data_export(self):
     query_msg = BeeswaxService.Query()
     query_msg.query = 'SELECT * FROM test'