/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.tajo.util;
import org.apache.hadoop.conf.Configuration;
import org.apache.tajo.catalog.FunctionDesc;
import org.apache.tajo.conf.TajoConf;
import org.apache.tajo.master.querymaster.QueryInProgress;
import org.apache.tajo.master.querymaster.QueryMasterTask;
import org.apache.tajo.master.querymaster.QueryUnit;
import org.apache.tajo.master.querymaster.SubQuery;
import org.apache.tajo.worker.TaskRunner;
import java.text.DecimalFormat;
import java.util.*;
import static org.apache.tajo.conf.TajoConf.ConfVars;
public class JSPUtil {
static DecimalFormat decimalF = new DecimalFormat("###.0");
public static void sortQueryUnit(QueryUnit[] queryUnits, String sortField, String sortOrder) {
if(sortField == null || sortField.isEmpty()) {
sortField = "id";
}
Arrays.sort(queryUnits, new QueryUnitComparator(sortField, "asc".equals(sortOrder)));
}
public static void sortTaskRunner(List<TaskRunner> taskRunners) {
Collections.sort(taskRunners, new Comparator<TaskRunner>() {
@Override
public int compare(TaskRunner taskRunner, TaskRunner taskRunner2) {
return taskRunner.getId().compareTo(taskRunner2.getId());
}
});
}
public static String getElapsedTime(long startTime, long finishTime) {
if(startTime == 0) {
return "-";
}
return finishTime == 0 ? decimalF.format((System.currentTimeMillis() - startTime) / 1000) + " sec"
: decimalF.format((finishTime - startTime) / 1000) + " sec";
}
public static String getTajoMasterHttpAddr(Configuration config) {
try {
TajoConf conf = (TajoConf) config;
String [] masterAddr = conf.getVar(ConfVars.TAJO_MASTER_UMBILICAL_RPC_ADDRESS).split(":");
return masterAddr[0] + ":" + conf.getVar(ConfVars.TAJO_MASTER_INFO_ADDRESS).split(":")[1];
} catch (Exception e) {
e.printStackTrace();
return e.getMessage();
}
}
public static List<QueryMasterTask> sortQueryMasterTask(Collection<QueryMasterTask> queryMasterTasks,
final boolean desc) {
List<QueryMasterTask> queryMasterTaskList = new ArrayList<QueryMasterTask>(queryMasterTasks);
Collections.sort(queryMasterTaskList, new Comparator<QueryMasterTask>() {
@Override
public int compare(QueryMasterTask task1, QueryMasterTask task2) {
if(desc) {
return task2.getQueryId().toString().compareTo(task1.getQueryId().toString());
} else {
return task1.getQueryId().toString().compareTo(task2.getQueryId().toString());
}
}
});
return queryMasterTaskList;
}
public static List<QueryInProgress> sortQueryInProgress(Collection<QueryInProgress> queryInProgresses,
final boolean desc) {
List<QueryInProgress> queryProgressList = new ArrayList<QueryInProgress>(queryInProgresses);
Collections.sort(queryProgressList, new Comparator<QueryInProgress>() {
@Override
public int compare(QueryInProgress query1, QueryInProgress query2) {
if(desc) {
return query2.getQueryId().toString().compareTo(query1.getQueryId().toString());
} else {
return query1.getQueryId().toString().compareTo(query2.getQueryId().toString());
}
}
});
return queryProgressList;
}
public static List<SubQuery> sortSubQuery(Collection<SubQuery> subQueries) {
List<SubQuery> subQueryList = new ArrayList<SubQuery>(subQueries);
Collections.sort(subQueryList, new Comparator<SubQuery>() {
@Override
public int compare(SubQuery subQuery1, SubQuery subQuery2) {
long q1StartTime = subQuery1.getStartTime();
long q2StartTime = subQuery2.getStartTime();
q1StartTime = (q1StartTime == 0 ? Long.MAX_VALUE : q1StartTime);
q2StartTime = (q2StartTime == 0 ? Long.MAX_VALUE : q2StartTime);
int result = compareLong(q1StartTime, q2StartTime);
if (result == 0) {
return subQuery1.getId().toString().compareTo(subQuery2.getId().toString());
} else {
return result;
}
}
});
return subQueryList;
}
static class QueryUnitComparator implements Comparator<QueryUnit> {
private String sortField;
private boolean asc;
public QueryUnitComparator(String sortField, boolean asc) {
this.sortField = sortField;
this.asc = asc;
}
@Override
public int compare(QueryUnit queryUnit, QueryUnit queryUnit2) {
if(asc) {
if("id".equals(sortField)) {
return queryUnit.getId().compareTo(queryUnit2.getId());
} else if("host".equals(sortField)) {
String host1 = queryUnit.getSucceededHost() == null ? "-" : queryUnit.getSucceededHost();
String host2 = queryUnit2.getSucceededHost() == null ? "-" : queryUnit2.getSucceededHost();
return host1.compareTo(host2);
} else if("runTime".equals(sortField)) {
return compareLong(queryUnit.getRunningTime(), queryUnit2.getRunningTime());
} else if("startTime".equals(sortField)) {
return compareLong(queryUnit.getLaunchTime(), queryUnit2.getLaunchTime());
} else {
return queryUnit.getId().compareTo(queryUnit2.getId());
}
} else {
if("id".equals(sortField)) {
return queryUnit2.getId().compareTo(queryUnit.getId());
} else if("host".equals(sortField)) {
String host1 = queryUnit.getSucceededHost() == null ? "-" : queryUnit.getSucceededHost();
String host2 = queryUnit2.getSucceededHost() == null ? "-" : queryUnit2.getSucceededHost();
return host2.compareTo(host1);
} else if("runTime".equals(sortField)) {
if(queryUnit2.getLaunchTime() == 0) {
return -1;
} else if(queryUnit.getLaunchTime() == 0) {
return 1;
}
return compareLong(queryUnit2.getRunningTime(), queryUnit.getRunningTime());
} else if("startTime".equals(sortField)) {
return compareLong(queryUnit2.getLaunchTime(), queryUnit.getLaunchTime());
} else {
return queryUnit2.getId().compareTo(queryUnit.getId());
}
}
}
}
static int compareLong(long a, long b) {
if(a > b) {
return 1;
} else if(a < b) {
return -1;
} else {
return 0;
}
}
public static void sortFunctionDesc(List<FunctionDesc> functions) {
Collections.sort(functions, new java.util.Comparator<FunctionDesc>() {
@Override
public int compare(FunctionDesc f1, FunctionDesc f2) {
int nameCompared = f1.getSignature().compareTo(f2.getSignature());
if(nameCompared != 0) {
return nameCompared;
} else {
return f1.getReturnType().getType().compareTo(f2.getReturnType().getType());
}
}
});
}
static final DecimalFormat PERCENT_FORMAT = new DecimalFormat("###.0");
public static String percentFormat(float value) {
return PERCENT_FORMAT.format(value * 100.0f);
}
}