Implement query status endpoint using the new hyracks result reader client API.
git-svn-id: https://asterixdb.googlecode.com/svn/branches/asterix_stabilization_result_distribution@1161 eaa15691-b419-025a-1212-ee371bd00084
diff --git a/asterix-app/src/main/java/edu/uci/ics/asterix/api/http/servlet/QueryResultAPIServlet.java b/asterix-app/src/main/java/edu/uci/ics/asterix/api/http/servlet/QueryResultAPIServlet.java
index a3c210a..f4b091a 100644
--- a/asterix-app/src/main/java/edu/uci/ics/asterix/api/http/servlet/QueryResultAPIServlet.java
+++ b/asterix-app/src/main/java/edu/uci/ics/asterix/api/http/servlet/QueryResultAPIServlet.java
@@ -26,8 +26,8 @@
import org.json.JSONArray;
import org.json.JSONObject;
-import edu.uci.ics.asterix.result.ResultUtils;
import edu.uci.ics.asterix.result.ResultReader;
+import edu.uci.ics.asterix.result.ResultUtils;
import edu.uci.ics.asterix.runtime.formats.FormatUtils;
import edu.uci.ics.hyracks.api.client.HyracksConnection;
import edu.uci.ics.hyracks.api.client.IHyracksClientConnection;
diff --git a/asterix-app/src/main/java/edu/uci/ics/asterix/api/http/servlet/QueryStatusAPIServlet.java b/asterix-app/src/main/java/edu/uci/ics/asterix/api/http/servlet/QueryStatusAPIServlet.java
index 818790b..964c4b0 100644
--- a/asterix-app/src/main/java/edu/uci/ics/asterix/api/http/servlet/QueryStatusAPIServlet.java
+++ b/asterix-app/src/main/java/edu/uci/ics/asterix/api/http/servlet/QueryStatusAPIServlet.java
@@ -16,24 +16,21 @@
import java.io.IOException;
import java.io.PrintWriter;
-import java.io.StringReader;
-import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import edu.uci.ics.asterix.api.common.APIFramework.DisplayFormat;
-import edu.uci.ics.asterix.api.common.SessionConfig;
-import edu.uci.ics.asterix.aql.base.Statement;
-import edu.uci.ics.asterix.aql.parser.AQLParser;
-import edu.uci.ics.asterix.aql.parser.ParseException;
-import edu.uci.ics.asterix.aql.translator.AqlTranslator;
-import edu.uci.ics.asterix.metadata.MetadataManager;
+import org.json.JSONArray;
+import org.json.JSONObject;
+
import edu.uci.ics.asterix.result.ResultReader;
+import edu.uci.ics.asterix.runtime.formats.FormatUtils;
import edu.uci.ics.hyracks.api.client.HyracksConnection;
import edu.uci.ics.hyracks.api.client.IHyracksClientConnection;
+import edu.uci.ics.hyracks.api.dataset.ResultSetId;
+import edu.uci.ics.hyracks.api.job.JobId;
public class QueryStatusAPIServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@@ -42,47 +39,53 @@
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
- String query = request.getParameter("query");
- String strIP = request.getParameter("hyracks-ip");
- String strPort = request.getParameter("hyracks-port");
- int port = Integer.parseInt(strPort);
+ String strHandle = request.getParameter("handle");
PrintWriter out = response.getWriter();
response.setContentType("text/html");
ServletContext context = getServletContext();
IHyracksClientConnection hcc;
- ResultReader resultReader;
try {
+ HyracksProperties hp = new HyracksProperties();
+ String strIP = hp.getHyracksIPAddress();
+ int port = hp.getHyracksPort();
+
synchronized (context) {
hcc = (IHyracksClientConnection) context.getAttribute(HYRACKS_CONNECTION_ATTR);
if (hcc == null) {
hcc = new HyracksConnection(strIP, port);
context.setAttribute(HYRACKS_CONNECTION_ATTR, hcc);
}
- resultReader = new ResultReader(hcc, out);
- new Thread(resultReader).start();
}
- AQLParser parser = new AQLParser(new StringReader(query));
- List<Statement> aqlStatements = parser.Statement();
- SessionConfig sessionConfig = new SessionConfig(port, true, false, false, false, false, false, false, false);
+ JSONObject handleObj = new JSONObject(strHandle);
+ JSONArray handle = handleObj.getJSONArray("handle");
+ JobId jobId = new JobId(handle.getLong(0));
+ ResultSetId rsId = new ResultSetId(handle.getLong(1));
- MetadataManager.INSTANCE.init();
+ /* TODO(madhusudancs): We need to find a way to JSON serialize default format obtained from
+ * metadataProvider in the AQLTranslator and store it as part of the result handle.
+ */
+ ResultReader resultReader = new ResultReader(hcc, FormatUtils.getDefaultFormat());
+ resultReader.open(jobId, rsId);
- AqlTranslator aqlTranslator = new AqlTranslator(aqlStatements, out, sessionConfig, DisplayFormat.HTML);
-
- aqlTranslator.compileAndExecute(hcc, resultReader);
-
- } catch (ParseException pe) {
- String message = pe.getMessage();
- message = message.replace("<", "<");
- message = message.replace(">", ">");
- out.println("SyntaxError:" + message);
- int pos = message.indexOf("line");
- if (pos > 0) {
- int columnPos = message.indexOf(",", pos + 1 + "line".length());
- int lineNo = Integer.parseInt(message.substring(pos + "line".length() + 1, columnPos));
- String line = query.split("\n")[lineNo - 1];
- out.println("==> " + line);
+ JSONObject jsonResponse = new JSONObject();
+ String status;
+ switch (resultReader.getStatus()) {
+ case RUNNING:
+ status = "RUNNING";
+ break;
+ case FAILED:
+ status = "ERROR";
+ break;
+ case SUCCESS:
+ status = "SUCCESS";
+ break;
+ default:
+ status = "ERROR";
+ break;
}
+ jsonResponse.put("status", status);
+ out.write(jsonResponse.toString());
+
} catch (Exception e) {
out.println(e.getMessage());
e.printStackTrace(out);
diff --git a/asterix-app/src/main/java/edu/uci/ics/asterix/result/ResultReader.java b/asterix-app/src/main/java/edu/uci/ics/asterix/result/ResultReader.java
index 3ae7615..8137e02 100644
--- a/asterix-app/src/main/java/edu/uci/ics/asterix/result/ResultReader.java
+++ b/asterix-app/src/main/java/edu/uci/ics/asterix/result/ResultReader.java
@@ -20,6 +20,7 @@
import edu.uci.ics.asterix.formats.base.IDataFormat;
import edu.uci.ics.hyracks.api.client.IHyracksClientConnection;
import edu.uci.ics.hyracks.api.dataflow.value.RecordDescriptor;
+import edu.uci.ics.hyracks.api.dataset.DatasetDirectoryRecord.Status;
import edu.uci.ics.hyracks.api.dataset.IHyracksDataset;
import edu.uci.ics.hyracks.api.dataset.ResultSetId;
import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
@@ -63,6 +64,10 @@
frameTupleAccessor = new FrameTupleAccessor(datasetClientCtx.getFrameSize(), recordDescriptor);
}
+ public Status getStatus() {
+ return hyracksDataset.getResultStatus();
+ }
+
public int read(ByteBuffer buffer) throws HyracksDataException {
return hyracksDataset.read(buffer);
}