From 738ccab749f8145f027fe16677a7e1ae8cc60793 Mon Sep 17 00:00:00 2001 From: Dongjoon Hyun Date: Fri, 27 Mar 2015 13:24:37 +0900 Subject: [PATCH] TAJO-1452: Improve function listing order --- .../tajo/function/FunctionSignature.java | 10 ++++- .../apache/tajo/function/FunctionUtil.java | 39 +++++++++++++++++++ .../tsql/commands/DescFunctionCommand.java | 18 ++------- .../java/org/apache/tajo/util/JSPUtil.java | 14 ------- .../resources/webapps/admin/functions.jsp | 3 +- 5 files changed, 52 insertions(+), 32 deletions(-) diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/function/FunctionSignature.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/function/FunctionSignature.java index fc3a0560dc..89ee01713a 100644 --- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/function/FunctionSignature.java +++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/function/FunctionSignature.java @@ -122,14 +122,20 @@ public int compareTo(FunctionSignature o) { return cmpVal; } - cmpVal = returnType.getType().compareTo(o.returnType.getType()); + cmpVal = functionType.name().compareTo(o.functionType.name()); + + if (cmpVal != 0) { + return cmpVal; + } + + cmpVal = returnType.getType().name().compareTo(o.returnType.getType().name()); if (cmpVal != 0) { return cmpVal; } for (int i = 0; i < Math.min(paramTypes.length, o.paramTypes.length); i++) { - cmpVal = paramTypes[i].getType().compareTo(o.paramTypes[i].getType()); + cmpVal = paramTypes[i].getType().name().compareTo(o.paramTypes[i].getType().name()); if (cmpVal != 0) { return cmpVal; diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/function/FunctionUtil.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/function/FunctionUtil.java index ef70428af8..713961f829 100644 --- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/function/FunctionUtil.java +++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/function/FunctionUtil.java @@ -19,13 +19,52 @@ package org.apache.tajo.function; import org.apache.tajo.catalog.FunctionDesc; +import org.apache.tajo.catalog.proto.CatalogProtos; import java.util.Collection; +import java.util.Comparator; import static org.apache.tajo.common.TajoDataTypes.DataType; public class FunctionUtil { + public static class FunctionDescProtoComparator implements Comparator + { + @Override + public int compare(CatalogProtos.FunctionDescProto f1, CatalogProtos.FunctionDescProto f2) { + CatalogProtos.FunctionSignatureProto s1 = f1.getSignature(); + CatalogProtos.FunctionSignatureProto s2 = f2.getSignature(); + + int cmpVal = s1.getName().compareTo(s2.getName()); + + if (cmpVal != 0) { + return cmpVal; + } + + cmpVal = s1.getType().name().compareTo(s2.getType().name()); + + if (cmpVal != 0) { + return cmpVal; + } + + cmpVal = s1.getReturnType().getType().name().compareTo(s2.getReturnType().getType().name()); + + if (cmpVal != 0) { + return cmpVal; + } + + for (int i = 0; i < Math.min(s1.getParameterTypesCount(), s2.getParameterTypesCount()); i++) { + cmpVal = s1.getParameterTypes(i).getType().name().compareTo(s2.getParameterTypes(i).getType().name()); + + if (cmpVal != 0) { + return cmpVal; + } + } + + return s2.getParameterTypesCount() - s1.getParameterTypesCount(); + } + } + public static String buildFQFunctionSignature(String funcName, DataType returnType, DataType... paramTypes) { return returnType.getType().name().toLowerCase() + " " + buildSimpleFunctionSignature(funcName, paramTypes); } diff --git a/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/commands/DescFunctionCommand.java b/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/commands/DescFunctionCommand.java index 295d326d13..abdbb9c6a4 100644 --- a/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/commands/DescFunctionCommand.java +++ b/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/commands/DescFunctionCommand.java @@ -52,17 +52,7 @@ public void invoke(String[] cmd) throws Exception { List functions = new ArrayList(client.getFunctions(functionName)); - Collections.sort(functions, new Comparator() { - @Override - public int compare(CatalogProtos.FunctionDescProto f1, CatalogProtos.FunctionDescProto f2) { - int nameCompared = f1.getSignature().getName().compareTo(f2.getSignature().getName()); - if (nameCompared != 0) { - return nameCompared; - } else { - return f1.getSignature().getReturnType().getType().compareTo(f2.getSignature().getReturnType().getType()); - } - } - }); + Collections.sort(functions, new FunctionUtil.FunctionDescProtoComparator()); String[] headers = new String[]{"Name", "Result type", "Argument types", "Description", "Type"}; float[] columnWidthRates = new float[]{0.15f, 0.15f, 0.2f, 0.4f, 0.1f}; @@ -70,12 +60,12 @@ public int compare(CatalogProtos.FunctionDescProto f1, CatalogProtos.FunctionDes for(CatalogProtos.FunctionDescProto eachFunction: functions) { String name = eachFunction.getSignature().getName(); - String resultDataType = eachFunction.getSignature().getReturnType().getType().toString(); + String resultDataType = eachFunction.getSignature().getReturnType().getType().toString().toLowerCase(); String arguments = FunctionUtil.buildParamTypeString( eachFunction.getSignature().getParameterTypesList().toArray( new DataType[eachFunction.getSignature().getParameterTypesCount()])); - String functionType = eachFunction.getSignature().getType().toString(); - String description = eachFunction.getSupplement().getShortDescription(); + String functionType = eachFunction.getSignature().getType().toString().toLowerCase(); + String description = eachFunction.getSupplement().getShortDescription().trim(); int index = 0; printLeft(" " + name, columnWidths[index++]); diff --git a/tajo-core/src/main/java/org/apache/tajo/util/JSPUtil.java b/tajo-core/src/main/java/org/apache/tajo/util/JSPUtil.java index 875d12bab7..aee2ced973 100644 --- a/tajo-core/src/main/java/org/apache/tajo/util/JSPUtil.java +++ b/tajo-core/src/main/java/org/apache/tajo/util/JSPUtil.java @@ -311,20 +311,6 @@ static int compareLong(long a, long b) { } } - public static void sortFunctionDesc(List functions) { - Collections.sort(functions, new java.util.Comparator() { - @Override - public int compare(FunctionDesc f1, FunctionDesc f2) { - int nameCompared = f1.getFunctionName().compareTo(f2.getFunctionName()); - if(nameCompared != 0) { - return nameCompared; - } else { - return f1.getReturnType().getType().compareTo(f2.getReturnType().getType()); - } - } - }); - } - static final DecimalFormat PERCENT_FORMAT = new DecimalFormat("###.#"); public static String percentFormat(float value) { return PERCENT_FORMAT.format(value * 100.0f); diff --git a/tajo-core/src/main/resources/webapps/admin/functions.jsp b/tajo-core/src/main/resources/webapps/admin/functions.jsp index c805aaa1b4..cf3ddc5a9f 100644 --- a/tajo-core/src/main/resources/webapps/admin/functions.jsp +++ b/tajo-core/src/main/resources/webapps/admin/functions.jsp @@ -24,13 +24,12 @@ <%@ page import="org.apache.tajo.master.*" %> <%@ page import="org.apache.tajo.catalog.*" %> <%@ page import="org.apache.hadoop.http.HtmlQuoting" %> -<%@ page import="org.apache.tajo.util.JSPUtil" %> <% TajoMaster master = (TajoMaster) StaticHttpServer.getInstance().getAttribute("tajo.info.server.object"); CatalogService catalog = master.getCatalog(); List functions = new ArrayList(catalog.getFunctions()); - JSPUtil.sortFunctionDesc(functions); + Collections.sort(functions); %>