/*
* Copyright 2013 Eediom, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.araqne.logdb.impl;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import org.araqne.api.ScriptContext;
import org.araqne.logdb.MultiSubQueryCommand;
import org.araqne.logdb.Query;
import org.araqne.logdb.QueryCommand;
import org.araqne.logdb.QueryContext;
import org.araqne.logdb.RunMode;
import org.araqne.logdb.SubQueryCommand;
/**
* @since 0.14.0
* @author xeraph
*/
public class QueryPrintHelper {
public static void printQueries(ScriptContext context, Collection<Query> qs, String queryFilter) {
String header = "Queries";
if (queryFilter != null)
header += " (filter by \"" + queryFilter + "\")";
context.println(header);
int lineLen = header.length() + 2;
for (int i = 0; i < lineLen; i++)
context.print("-");
context.println("");
ArrayList<Query> queries = new ArrayList<Query>(qs);
Collections.sort(queries, new Comparator<Query>() {
@Override
public int compare(Query o1, Query o2) {
return o1.getId() - o2.getId();
}
});
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
for (Query q : queries) {
if (queryFilter != null && !q.getQueryString().contains(queryFilter))
continue;
String when = "";
if (q.isStarted())
when = " at " + df.format(new Date(q.getStartTime()));
String loginName = "no session";
if (q.getContext() != null && q.getContext().getSession() != null)
loginName = q.getContext().getSession().getLoginName();
Long count = null;
try {
count = q.getResultCount();
if (count == null)
count = 0L;
} catch (Throwable t) {
}
String queryString = q.getQueryString();
if (queryString.length() > 60)
queryString = queryString.substring(0, 60) + "...";
String runMode = q.getRunMode() == RunMode.BACKGROUND ? " (bg)" : "";
String lastStatus = q.getCommands().get(q.getCommands().size() - 1).getStatus().toString();
context.println(String.format("[%d:%s:%s%s%s] %s => %d", q.getId(), lastStatus, loginName, when, runMode, queryString,
count));
}
}
public static String getQueryStatus(Query query) {
String when = " / not started yet";
if (query.isStarted()) {
String s = "Running";
long elapsed = System.currentTimeMillis() - query.getStartTime();
if (query.isFinished()) {
s = "Finished";
elapsed = query.getFinishTime() - query.getStartTime();
}
when = String.format(" / %s (%d ms)", s, elapsed);
}
int mainQueryId = query.getId();
String loginName = query.getContext().getSession().getLoginName();
String status = String.format("[%d:%s] %s%s\n", mainQueryId, loginName, query.getQueryString(), when);
status += appendQueryStatus(getMainQuery(query.getContext(), mainQueryId), mainQueryId);
for (Query q : query.getContext().getQueries()) {
if (q.getId() != mainQueryId)
status += appendQueryStatus(q, mainQueryId);
}
return status;
}
private static String appendQueryStatus(Query query, int mainQueryId) {
String status = "";
if (query.getId() != mainQueryId)
status += "Sub Query #" + query.getId() + "\n";
status += getCommandStatuses(query.getCommands(), 2);
return status;
}
private static Query getMainQuery(QueryContext context, int queryId) {
for (Query q : context.getQueries())
if (q.getId() == queryId)
return q;
return null;
}
private static String getCommandStatuses(List<QueryCommand> commands, int indent) {
String status = "";
for (QueryCommand cmd : commands) {
if (cmd.getNestedCommands().size() > 0) {
status += tab(indent) + "Command [" + cmd.getName() + "]\n";
status += getCommandStatuses(cmd.getNestedCommands(), indent + 2);
} else {
String subQueryStatus = "";
if (cmd instanceof MultiSubQueryCommand) {
List<Query> subQueries = ((MultiSubQueryCommand) cmd).getSubQueries();
if (subQueries != null) {
for (Query subQuery : subQueries) {
subQueryStatus += "/ Sub Query #" + subQuery.getId() + " ";
}
}
} else if (cmd instanceof SubQueryCommand) {
// some command has optional sub query, and getSubQuery()
// can return null
Query subQuery = ((SubQueryCommand) cmd).getSubQuery();
if (subQuery != null)
subQueryStatus = "/ Sub Query #" + subQuery.getId() + " ";
}
String taskId = cmd.getMainTask() != null ? String.format("%d: ", cmd.getMainTask().getID()) : "";
status += String.format(tab(indent) + "[%s] %s%s %s/ passed %d tuples\n", cmd.getStatus(), taskId, cmd.toString(),
subQueryStatus, cmd.getOutputCount());
}
}
return status;
}
private static String tab(int n) {
StringBuilder sb = new StringBuilder(100);
for (int i = 0; i < n; i++)
sb.append(" ");
return sb.toString();
}
}