[ 
https://issues.apache.org/jira/browse/HIVE-716?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Edward Capriolo updated HIVE-716:
---------------------------------

    Status: Patch Available  (was: Open)

There were two main features I wanted to support in HWI.

1) The Query Box should allow multiple queries separated by ; This would make 
the application more user friendly.

2) For queries with small result sets such as 'explain' or 'show tables' should 
be able possible without dumping to a file

Wait/notify semantics

Loop w/sleep are ok but a Java threads support wait/notify so that is cleaner, 
nicer to code.
{noformat}
-               while (searchItem.getStatus() != 
HWISessionItem.WebSessionItemStatus.QUERY_COMPLETE) {
-                       Thread.sleep(1);
+               synchronized (searchItem.runnable ) {
+                 while (searchItem.getStatus() != 
HWISessionItem.WebSessionItemStatus.READY) {
+                       searchItem.runnable.wait();
+                  }
{noformat}

HWISessionItem Constructor
{noformat}
protected HWISessionItem ()
{noformat}

{noformat}
public HWISessionItem(HWIAuth auth, String sessionName) 
{noformat}

Having a public constrcutor is a plus the class could theoretically be used 
standalone.
The no argument constructor did not make sense, HWISessionItem was programmed 
originally like a Java
Bean no arg, constructore, lots of setters/getters. Really to be instantaited 
this information is 
write once. It only makes sense to handle it in the constructor. (this also 
makes the lazy initialization easier)

state machine
{noformat}
-       public enum WebSessionItemStatus {
-               NEW, QUERY_SET, QUERY_RUNNING, QUERY_COMPLETE, DESTROY, 
KILL_QUERY
-       };
+  /**  Represents the state a session item can be in. */
+  public enum WebSessionItemStatus {
+    NEW, READY, QUERY_SET, QUERY_RUNNING, DESTROY, KILL_QUERY
+  };
{noformat}

THe state mechanics worked but the states were funky. QUERY_COMPLETE in 
particular bothered me. 

NEW-Constructed but not initialized
READY-Initialized waiting for query set
QUERY-SET-User has signaled that the query should be ran
Query-running- the query is now running (dont change anything)  
back to ready READY
DESTROY-Fall out of run loop

Right now  KILL_QUERY is not terribly effective. With HiveHistory session can 
be killed from the job tracker.

Removed private members w setters/getters
{noformat}
-       private SetProcessor sp;
-       private Driver qp;
{noformat}
These are not members they are only local to the runQuery() method

The framework now takes a list of queries and returns a list of results
{noformat}
+  private List<String>  queries;
+  queryRet = new ArrayList<Integer>();
{noformat}

Constructor blocks for lazy initiailization
There was a subtle bug in that the initialization of some variables happned in 
the thread after the constructor returned. However a redirect on
the web site could send a user onto a page causing an exception. Now the 
constructor uses wait/notify to properly wait for initialization
{noformat}
 l4j.debug("Wait for NEW->READY transition");
+    synchronized (this.runnable){
+      if (this.status != WebSessionItemStatus.READY) {
+       try {
+         this.runnable.wait();
+        } catch (Exception ex) {}
+      }
+    }
+    l4j.debug("NEW->READY transition complete");
{noformat}


run() uses state NEW not conf=null to detect when initialization is needed. 
Same effect more self documenting
{noformat}


 while (this.status != HWISessionItem.WebSessionItemStatus.DESTROY) {

             if (conf == null) {
-          this.itemInit();
-                               }

 while (this.status != HWISessionItem.WebSessionItemStatus.DESTROY) {
+        if (this.status == WebSessionItemStatus.NEW) {
+         this.itemInit();
        }
{noformat}

Feature Reuslt Bucket
a query like explain or show is not the type of thing you want to dump to a 
file just to look at the file.
The resultBucket is a sized buffer that saves some query results to make them 
avaialable from the web interface.
{noformat}
+            while (qp.getResults(res)) {
+             resultBucket.add(res);
+              if (resultBucket.size() > resultBucketMaxSize) 
+               resultBucket.remove(0);
+              for (String row : res) {
+               if (ss != null) { 
+                 if (ss.out != null) 
+                   ss.out.println(row);
{noformat}

Many changes went down here :) We could break this up into a few JIRA or bundle 
together. The last round of changes were a good at cleanup up the 
SessionManager this round will have the SessionItem nicely polished.

* Add ResultBucket buffer to web interface
* HWI to run multiple queries in a single run
* Changes to  HWI State Mechanics
* Web Interface format and license. 1 Propertly format and add apache licence 
to all HWI Source Files 

Please review and lets talk about the best way to procede.

Thanks,

> Web Interface wait/notify, interface changes
> --------------------------------------------
>
>                 Key: HIVE-716
>                 URL: https://issues.apache.org/jira/browse/HIVE-716
>             Project: Hadoop Hive
>          Issue Type: Improvement
>          Components: Web UI
>         Environment: All
>            Reporter: Edward Capriolo
>            Assignee: Edward Capriolo
>         Attachments: hive-716-2.diff, hive-716-3.diff, hive-716.diff, 
> hwi_query_box.png
>
>
> In TestHWISessionItem 
> Asserts are backwards
> {noformat}
> assertEquals(  searchItem.getQueryRet(), 0);
> {noformat}
> Should be
> {noformat}
> assertEquals( zero , searchItem.getQueryRet());
> {noformat}
> Wait/notify semantics can be added. This is helpful for end user, and cleaner 
> in the test case.
> {noformat}
> while (user1_item2.getStatus() != 
> HWISessionItem.WebSessionItemStatus.QUERY_COMPLETE) {
>   Thread.sleep(1);
> }
> {noformat}
> {noformat}
> synchronized (user1_item2.runnable) {
>   while (user1_item2.getStatus() != 
> HWISessionItem.WebSessionItemStatus.QUERY_COMPLETE) {
>      user1_item2.runnable.wait();
>   }
> }
> {noformat}
> The text box in the web interface should accept multiple queries separated by 
> ';' like the cli does. This will add more usability. No need for separate set 
> processor pages. 
> setQuery(String) is replaced by setQueries(List<String>)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to