http://git-wip-us.apache.org/repos/asf/tajo/blob/ad4fda7c/tajo-client/src/main/java/org/apache/tajo/cli/tools/TajoAdmin.java ---------------------------------------------------------------------- diff --git a/tajo-client/src/main/java/org/apache/tajo/cli/tools/TajoAdmin.java b/tajo-client/src/main/java/org/apache/tajo/cli/tools/TajoAdmin.java deleted file mode 100644 index 88b8e0f..0000000 --- a/tajo-client/src/main/java/org/apache/tajo/cli/tools/TajoAdmin.java +++ /dev/null @@ -1,457 +0,0 @@ -/** - * 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.cli.tools; - -import com.google.protobuf.ServiceException; -import org.apache.commons.cli.*; -import org.apache.commons.lang.StringUtils; -import org.apache.tajo.QueryId; -import org.apache.tajo.TajoProtos; -import org.apache.tajo.client.*; -import org.apache.tajo.conf.TajoConf; -import org.apache.tajo.ipc.ClientProtos.BriefQueryInfo; -import org.apache.tajo.ipc.ClientProtos.WorkerResourceInfo; -import org.apache.tajo.util.NetUtils; -import org.apache.tajo.ha.HAServiceUtil; -import org.apache.tajo.util.TajoIdUtils; - -import java.io.IOException; -import java.io.PrintWriter; -import java.io.Writer; -import java.net.InetSocketAddress; -import java.sql.SQLException; -import java.text.DecimalFormat; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.List; - -public class TajoAdmin { - private static final org.apache.commons.cli.Options options; - private static DecimalFormat decimalF = new DecimalFormat("###.0"); - private enum WorkerStatus { - RUNNING, - LOST, - DECOMMISSIONED - } - - final static String DASHLINE_LEN5 = "-----"; - final static String DASHLINE_LEN10 = "----------"; - final static String DASHLINE_LEN12 = "------------"; - final static String DASHLINE_LEN25 = "-------------------------"; - final static String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; - - static { - options = new Options(); - options.addOption("h", "host", true, "Tajo server host"); - options.addOption("p", "port", true, "Tajo server port"); - options.addOption("list", null, false, "Show Tajo query list"); - options.addOption("cluster", null, false, "Show Cluster Info"); - options.addOption("showmasters", null, false, "gets list of tajomasters in the cluster"); - options.addOption("desc", null, false, "Show Query Description"); - options.addOption("kill", null, true, "Kill a running query"); - } - - private TajoConf tajoConf; - private TajoClient tajoClient; - private Writer writer; - - public TajoAdmin(TajoConf tajoConf, Writer writer) { - this(tajoConf, writer, null); - } - - public TajoAdmin(TajoConf tajoConf, Writer writer, TajoClient tajoClient) { - this.tajoConf = tajoConf; - this.writer = writer; - this.tajoClient = tajoClient; - } - - private void printUsage() { - HelpFormatter formatter = new HelpFormatter(); - formatter.printHelp( "admin [options]", options ); - } - - public void runCommand(String[] args) throws Exception { - CommandLineParser parser = new PosixParser(); - CommandLine cmd = parser.parse(options, args); - - String param = ""; - int cmdType = 0; - - String hostName = null; - Integer port = null; - if (cmd.hasOption("h")) { - hostName = cmd.getOptionValue("h"); - } - if (cmd.hasOption("p")) { - port = Integer.parseInt(cmd.getOptionValue("p")); - } - - String queryId = null; - - if (cmd.hasOption("list")) { - cmdType = 1; - } else if (cmd.hasOption("desc")) { - cmdType = 2; - } else if (cmd.hasOption("cluster")) { - cmdType = 3; - } else if (cmd.hasOption("kill")) { - cmdType = 4; - queryId = cmd.getOptionValue("kill"); - } else if (cmd.hasOption("showmasters")) { - cmdType = 5; - } - - // if there is no "-h" option, - if(hostName == null) { - if (tajoConf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS) != null) { - // it checks if the client service address is given in configuration and distributed mode. - // if so, it sets entryAddr. - hostName = tajoConf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS).split(":")[0]; - } - } - if (port == null) { - if (tajoConf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS) != null) { - // it checks if the client service address is given in configuration and distributed mode. - // if so, it sets entryAddr. - port = Integer.parseInt(tajoConf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS).split(":")[1]); - } - } - - if (cmdType == 0) { - printUsage(); - return; - } - - - if ((hostName == null) ^ (port == null)) { - System.err.println("ERROR: cannot find valid Tajo server address"); - return; - } else if (hostName != null && port != null) { - tajoConf.setVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS, hostName + ":" + port); - tajoClient = new TajoClientImpl(tajoConf); - } else if (hostName == null && port == null) { - tajoClient = new TajoClientImpl(tajoConf); - } - - switch (cmdType) { - case 1: - processList(writer); - break; - case 2: - processDesc(writer); - break; - case 3: - processCluster(writer); - break; - case 4: - processKill(writer, queryId); - break; - case 5: - processMasters(writer); - break; - default: - printUsage(); - break; - } - - writer.flush(); - } - - private void processDesc(Writer writer) throws ParseException, IOException, - ServiceException, SQLException { - tajoClient = TajoHAClientUtil.getTajoClient(tajoConf, tajoClient); - List<BriefQueryInfo> queryList = tajoClient.getRunningQueryList(); - SimpleDateFormat df = new SimpleDateFormat(DATE_FORMAT); - int id = 1; - for (BriefQueryInfo queryInfo : queryList) { - String queryId = String.format("q_%s_%04d", - queryInfo.getQueryId().getId(), - queryInfo.getQueryId().getSeq()); - - writer.write("Id: " + id); - writer.write("\n"); - id++; - writer.write("Query Id: " + queryId); - writer.write("\n"); - writer.write("Started Time: " + df.format(queryInfo.getStartTime())); - writer.write("\n"); - - writer.write("Query State: " + queryInfo.getState().name()); - writer.write("\n"); - long end = queryInfo.getFinishTime(); - long start = queryInfo.getStartTime(); - String executionTime = decimalF.format((end-start) / 1000) + " sec"; - if (TajoClientUtil.isQueryComplete(queryInfo.getState())) { - writer.write("Finished Time: " + df.format(queryInfo.getFinishTime())); - writer.write("\n"); - } - writer.write("Execution Time: " + executionTime); - writer.write("\n"); - writer.write("Query Progress: " + queryInfo.getProgress()); - writer.write("\n"); - writer.write("Query Statement:"); - writer.write("\n"); - writer.write(queryInfo.getQuery()); - writer.write("\n"); - writer.write("\n"); - } - } - - private void processCluster(Writer writer) throws ParseException, IOException, - ServiceException, SQLException { - tajoClient = TajoHAClientUtil.getTajoClient(tajoConf, tajoClient); - List<WorkerResourceInfo> workerList = tajoClient.getClusterInfo(); - - int runningQueryMasterTasks = 0; - - List<WorkerResourceInfo> liveWorkers = new ArrayList<WorkerResourceInfo>(); - List<WorkerResourceInfo> deadWorkers = new ArrayList<WorkerResourceInfo>(); - List<WorkerResourceInfo> decommissionWorkers = new ArrayList<WorkerResourceInfo>(); - - List<WorkerResourceInfo> liveQueryMasters = new ArrayList<WorkerResourceInfo>(); - List<WorkerResourceInfo> deadQueryMasters = new ArrayList<WorkerResourceInfo>(); - - for (WorkerResourceInfo eachWorker : workerList) { - if(eachWorker.getQueryMasterMode() == true) { - if(eachWorker.getWorkerStatus().equals(WorkerStatus.RUNNING.toString())) { - liveQueryMasters.add(eachWorker); - runningQueryMasterTasks += eachWorker.getNumQueryMasterTasks(); - } - if(eachWorker.getWorkerStatus().equals(WorkerStatus.LOST.toString())) { - deadQueryMasters.add(eachWorker); - } - } - - if(eachWorker.getTaskRunnerMode() == true) { - if(eachWorker.getWorkerStatus().equals(WorkerStatus.RUNNING.toString())) { - liveWorkers.add(eachWorker); - } else if(eachWorker.getWorkerStatus().equals(WorkerStatus.LOST.toString())) { - deadWorkers.add(eachWorker); - } else if(eachWorker.getWorkerStatus().equals(WorkerStatus.DECOMMISSIONED.toString())) { - decommissionWorkers.add(eachWorker); - } - } - } - - String fmtInfo = "%1$-5s %2$-5s %3$-5s%n"; - String infoLine = String.format(fmtInfo, "Live", "Dead", "Tasks"); - - writer.write("Query Master\n"); - writer.write("============\n\n"); - writer.write(infoLine); - String line = String.format(fmtInfo, DASHLINE_LEN5, DASHLINE_LEN5, DASHLINE_LEN5); - writer.write(line); - - line = String.format(fmtInfo, liveQueryMasters.size(), - deadQueryMasters.size(), runningQueryMasterTasks); - writer.write(line); - writer.write("\n"); - - writer.write("Live QueryMasters\n"); - writer.write("=================\n\n"); - - if (liveQueryMasters.isEmpty()) { - writer.write("No Live QueryMasters\n"); - } else { - String fmtQueryMasterLine = "%1$-25s %2$-5s %3$-5s %4$-10s %5$-10s%n"; - line = String.format(fmtQueryMasterLine, "QueryMaster", "Port", "Query", - "Heap", "Status"); - writer.write(line); - line = String.format(fmtQueryMasterLine, DASHLINE_LEN25, DASHLINE_LEN5, - DASHLINE_LEN5, DASHLINE_LEN10, DASHLINE_LEN10); - writer.write(line); - for (WorkerResourceInfo queryMaster : liveQueryMasters) { - TajoProtos.WorkerConnectionInfoProto connInfo = queryMaster.getConnectionInfo(); - String queryMasterHost = String.format("%s:%d", connInfo.getHost(), connInfo.getQueryMasterPort()); - String heap = String.format("%d MB", queryMaster.getMaxHeap() / 1024 / 1024); - line = String.format(fmtQueryMasterLine, - queryMasterHost, - connInfo.getClientPort(), - queryMaster.getNumQueryMasterTasks(), - heap, - queryMaster.getWorkerStatus()); - writer.write(line); - } - - writer.write("\n\n"); - } - - if (!deadQueryMasters.isEmpty()) { - writer.write("Dead QueryMasters\n"); - writer.write("=================\n\n"); - - String fmtQueryMasterLine = "%1$-25s %2$-5s %3$-10s%n"; - line = String.format(fmtQueryMasterLine, "QueryMaster", "Port", "Status"); - writer.write(line); - line = String.format(fmtQueryMasterLine, DASHLINE_LEN25, DASHLINE_LEN5, DASHLINE_LEN10); - writer.write(line); - - for (WorkerResourceInfo queryMaster : deadQueryMasters) { - TajoProtos.WorkerConnectionInfoProto connInfo = queryMaster.getConnectionInfo(); - String queryMasterHost = String.format("%s:%d", connInfo.getHost(), connInfo.getQueryMasterPort()); - line = String.format(fmtQueryMasterLine, - queryMasterHost, - connInfo.getClientPort(), - queryMaster.getWorkerStatus()); - writer.write(line); - } - - writer.write("\n\n"); - } - - writer.write("Worker\n"); - writer.write("======\n\n"); - - String fmtWorkerInfo = "%1$-5s %2$-5s%n"; - String workerInfoLine = String.format(fmtWorkerInfo, "Live", "Dead"); - writer.write(workerInfoLine); - line = String.format(fmtWorkerInfo, DASHLINE_LEN5, DASHLINE_LEN5); - writer.write(line); - - line = String.format(fmtWorkerInfo, liveWorkers.size(), deadWorkers.size()); - writer.write(line); - writer.write("\n"); - - writer.write("Live Workers\n"); - writer.write("============\n\n"); - if(liveWorkers.isEmpty()) { - writer.write("No Live Workers\n\n"); - } else { - writeWorkerInfo(writer, liveWorkers); - } - - writer.write("Dead Workers\n"); - writer.write("============\n\n"); - if(deadWorkers.isEmpty()) { - writer.write("No Dead Workers\n\n"); - } else { - writeWorkerInfo(writer, deadWorkers); - } - } - - private void writeWorkerInfo(Writer writer, List<WorkerResourceInfo> workers) throws ParseException, - IOException, ServiceException, SQLException { - String fmtWorkerLine = "%1$-25s %2$-5s %3$-5s %4$-10s %5$-10s %6$-12s %7$-10s%n"; - String line = String.format(fmtWorkerLine, - "Worker", "Port", "Tasks", - "Mem", "Disk", - "Heap", "Status"); - writer.write(line); - line = String.format(fmtWorkerLine, - DASHLINE_LEN25, DASHLINE_LEN5, DASHLINE_LEN5, - DASHLINE_LEN10, DASHLINE_LEN10, - DASHLINE_LEN12, DASHLINE_LEN10); - writer.write(line); - - for (WorkerResourceInfo worker : workers) { - TajoProtos.WorkerConnectionInfoProto connInfo = worker.getConnectionInfo(); - String workerHost = String.format("%s:%d", connInfo.getHost(), connInfo.getPeerRpcPort()); - String mem = String.format("%d/%d", worker.getUsedMemoryMB(), - worker.getMemoryMB()); - String disk = String.format("%.2f/%.2f", worker.getUsedDiskSlots(), - worker.getDiskSlots()); - String heap = String.format("%d/%d MB", worker.getFreeHeap()/1024/1024, - worker.getMaxHeap()/1024/1024); - - line = String.format(fmtWorkerLine, workerHost, - connInfo.getPullServerPort(), - worker.getNumRunningTasks(), - mem, disk, heap, worker.getWorkerStatus()); - writer.write(line); - } - writer.write("\n\n"); - } - - private void processList(Writer writer) throws ParseException, IOException, - ServiceException, SQLException { - tajoClient = TajoHAClientUtil.getTajoClient(tajoConf, tajoClient); - List<BriefQueryInfo> queryList = tajoClient.getRunningQueryList(); - SimpleDateFormat df = new SimpleDateFormat(DATE_FORMAT); - StringBuilder builder = new StringBuilder(); - - /* print title */ - builder.append(StringUtils.rightPad("QueryId", 21)); - builder.append(StringUtils.rightPad("State", 20)); - builder.append(StringUtils.rightPad("StartTime", 20)); - builder.append(StringUtils.rightPad("Query", 30)).append("\n"); - - builder.append(StringUtils.rightPad(StringUtils.repeat("-", 20), 21)); - builder.append(StringUtils.rightPad(StringUtils.repeat("-", 19), 20)); - builder.append(StringUtils.rightPad(StringUtils.repeat("-", 19), 20)); - builder.append(StringUtils.rightPad(StringUtils.repeat("-", 29), 30)).append("\n"); - writer.write(builder.toString()); - - builder = new StringBuilder(); - for (BriefQueryInfo queryInfo : queryList) { - builder.append(StringUtils.rightPad(new QueryId(queryInfo.getQueryId()).toString(), 21)); - builder.append(StringUtils.rightPad(queryInfo.getState().name(), 20)); - builder.append(StringUtils.rightPad(df.format(queryInfo.getStartTime()), 20)); - builder.append(StringUtils.abbreviate(queryInfo.getQuery(), 30)).append("\n"); - } - writer.write(builder.toString()); - } - - public void processKill(Writer writer, String queryIdStr) - throws IOException, ServiceException { - QueryStatus status = tajoClient.killQuery(TajoIdUtils.parseQueryId(queryIdStr)); - if (status.getState() == TajoProtos.QueryState.QUERY_KILLED) { - writer.write(queryIdStr + " is killed successfully.\n"); - } else if (status.getState() == TajoProtos.QueryState.QUERY_KILL_WAIT) { - writer.write(queryIdStr + " will be finished after a while.\n"); - } else { - writer.write("ERROR:" + status.getErrorMessage()); - } - } - - private void processMasters(Writer writer) throws ParseException, IOException, - ServiceException, SQLException { - tajoClient = TajoHAClientUtil.getTajoClient(tajoConf, tajoClient); - if (tajoConf.getBoolVar(TajoConf.ConfVars.TAJO_MASTER_HA_ENABLE)) { - - List<String> list = HAServiceUtil.getMasters(tajoConf); - int i = 0; - for (String master : list) { - if (i > 0) { - writer.write(" "); - } - writer.write(master); - i++; - } - writer.write("\n"); - } else { - String confMasterServiceAddr = tajoConf.getVar(TajoConf.ConfVars.TAJO_MASTER_UMBILICAL_RPC_ADDRESS); - InetSocketAddress masterAddress = NetUtils.createSocketAddr(confMasterServiceAddr); - writer.write(masterAddress.getHostName()); - writer.write("\n"); - } - } - - public static void main(String [] args) throws Exception { - TajoConf conf = new TajoConf(); - - Writer writer = new PrintWriter(System.out); - try { - TajoAdmin admin = new TajoAdmin(conf, writer); - admin.runCommand(args); - } finally { - writer.close(); - System.exit(0); - } - } -}
http://git-wip-us.apache.org/repos/asf/tajo/blob/ad4fda7c/tajo-client/src/main/java/org/apache/tajo/cli/tools/TajoDump.java ---------------------------------------------------------------------- diff --git a/tajo-client/src/main/java/org/apache/tajo/cli/tools/TajoDump.java b/tajo-client/src/main/java/org/apache/tajo/cli/tools/TajoDump.java deleted file mode 100644 index 7f38a5d..0000000 --- a/tajo-client/src/main/java/org/apache/tajo/cli/tools/TajoDump.java +++ /dev/null @@ -1,202 +0,0 @@ -/** - * 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.cli.tools; - -import com.google.protobuf.ServiceException; - -import org.apache.commons.cli.*; -import org.apache.tajo.auth.UserRoleInfo; -import org.apache.tajo.catalog.CatalogConstants; -import org.apache.tajo.catalog.CatalogUtil; -import org.apache.tajo.catalog.DDLBuilder; -import org.apache.tajo.catalog.TableDesc; -import org.apache.tajo.catalog.proto.CatalogProtos.StoreType; -import org.apache.tajo.client.TajoClient; -import org.apache.tajo.client.TajoClientImpl; -import org.apache.tajo.conf.TajoConf; -import org.apache.tajo.util.Pair; -import org.apache.tajo.util.TUtil; - -import java.io.IOException; -import java.io.PrintWriter; -import java.sql.SQLException; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collections; -import java.util.List; - -public class TajoDump { - private static final org.apache.commons.cli.Options options; - - static { - options = new Options(); - options.addOption("h", "host", true, "Tajo server host"); - options.addOption("p", "port", true, "Tajo server port"); - options.addOption("a", "all", false, "dump all table DDLs"); - } - - private static void printUsage() { - HelpFormatter formatter = new HelpFormatter(); - formatter.printHelp( "tajo-dump [options] [database name]", options); - } - - private static Pair<String, Integer> getConnectionAddr(TajoConf conf, CommandLine cmd) { - String hostName = null; - Integer port = null; - if (cmd.hasOption("h")) { - hostName = cmd.getOptionValue("h"); - } - if (cmd.hasOption("p")) { - port = Integer.parseInt(cmd.getOptionValue("p")); - } - - if(hostName == null) { - if (conf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS) != null) { - hostName = conf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS).split(":")[0]; - } - } - if (port == null) { - if (conf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS) != null) { - port = Integer.parseInt(conf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS).split(":")[1]); - } - } - return new Pair<String, Integer>(hostName, port); - } - - public static void main(String [] args) throws ParseException, IOException, ServiceException, SQLException { - final TajoConf conf = new TajoConf(); - final CommandLineParser parser = new PosixParser(); - final CommandLine cmd = parser.parse(options, args); - final Pair<String, Integer> hostAndPort = getConnectionAddr(conf, cmd); - final String hostName = hostAndPort.getFirst(); - final Integer port = hostAndPort.getSecond(); - final UserRoleInfo userInfo = UserRoleInfo.getCurrentUser(); - - String baseDatabaseName = null; - if (cmd.getArgList().size() > 0) { - baseDatabaseName = (String) cmd.getArgList().get(0); - } - - boolean isDumpingAllDatabases = cmd.hasOption('a'); - - // Neither two choices - if (!isDumpingAllDatabases && baseDatabaseName == null) { - printUsage(); - System.exit(-1); - } - - TajoClient client = null; - if ((hostName == null) ^ (port == null)) { - System.err.println("ERROR: cannot find any TajoMaster rpc address in arguments and tajo-site.xml."); - System.exit(-1); - } else if (hostName != null && port != null) { - conf.setVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS, hostName+":"+port); - client = new TajoClientImpl(conf); - } else { - client = new TajoClientImpl(conf); - } - - PrintWriter writer = new PrintWriter(System.out); - dump(client, userInfo, baseDatabaseName, isDumpingAllDatabases, true, true, writer); - - System.exit(0); - } - - private static boolean isAcceptableDumpingDatabase(String databaseName) { - return (databaseName == null || !databaseName.equalsIgnoreCase(CatalogConstants.INFORMATION_SCHEMA_DB_NAME)); - } - - public static void dump(TajoClient client, UserRoleInfo userInfo, String baseDatabaseName, - boolean isDumpingAllDatabases, boolean includeUserName, boolean includeDate, PrintWriter out) - throws SQLException, ServiceException { - printHeader(out, userInfo, includeUserName, includeDate); - - if (isDumpingAllDatabases) { - // sort database names in an ascending lexicographic order of the names. - List<String> sorted = new ArrayList<String>(client.getAllDatabaseNames()); - Collections.sort(sorted); - - for (String databaseName : sorted) { - if (isAcceptableDumpingDatabase(databaseName)) { - dumpDatabase(client, databaseName, out); - } - } - } else { - dumpDatabase(client, baseDatabaseName, out); - } - out.flush(); - } - - private static void printHeader(PrintWriter writer, UserRoleInfo userInfo, boolean includeUSerName, - boolean includeDate) { - writer.write("--\n"); - writer.write("-- Tajo database dump\n"); - if (includeUSerName) { - writer.write("--\n-- Dump user: " + userInfo.getUserName() + "\n"); - } - if (includeDate) { - writer.write("--\n-- Dump date: " + toDateString() + "\n"); - } - writer.write("--\n"); - writer.write("\n"); - } - - private static void dumpDatabase(TajoClient client, String databaseName, PrintWriter writer) - throws SQLException, ServiceException { - writer.write("\n"); - writer.write("--\n"); - writer.write(String.format("-- Database name: %s%n", CatalogUtil.denormalizeIdentifier(databaseName))); - writer.write("--\n"); - writer.write("\n"); - writer.write(String.format("CREATE DATABASE IF NOT EXISTS %s;", CatalogUtil.denormalizeIdentifier(databaseName))); - writer.write("\n\n"); - - // returned list is immutable. - List<String> tableNames = TUtil.newList(client.getTableList(databaseName)); - Collections.sort(tableNames); - for (String tableName : tableNames) { - try { - TableDesc table = client.getTableDesc(CatalogUtil.buildFQName(databaseName, tableName)); - - if (table.getMeta().getStoreType() == StoreType.SYSTEM) { - continue; - } - - if (table.isExternal()) { - writer.write(DDLBuilder.buildDDLForExternalTable(table)); - } else { - writer.write(DDLBuilder.buildDDLForBaseTable(table)); - } - writer.write("\n\n"); - } catch (Exception e) { - // dump for each table can throw any exception. We need to skip the exception case. - // here, the error message prints out via stderr. - System.err.println("ERROR:" + tableName + "," + e.getMessage()); - } - } - } - - private static String toDateString() { - DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); - java.util.Date today = Calendar.getInstance().getTime(); - return df.format(today); - } -} http://git-wip-us.apache.org/repos/asf/tajo/blob/ad4fda7c/tajo-client/src/main/java/org/apache/tajo/cli/tools/TajoGetConf.java ---------------------------------------------------------------------- diff --git a/tajo-client/src/main/java/org/apache/tajo/cli/tools/TajoGetConf.java b/tajo-client/src/main/java/org/apache/tajo/cli/tools/TajoGetConf.java deleted file mode 100644 index aa7620b..0000000 --- a/tajo-client/src/main/java/org/apache/tajo/cli/tools/TajoGetConf.java +++ /dev/null @@ -1,161 +0,0 @@ -/** - * 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.cli.tools; - -import com.google.protobuf.ServiceException; -import org.apache.commons.cli.*; -import org.apache.tajo.client.TajoClient; -import org.apache.tajo.client.TajoClientImpl; -import org.apache.tajo.conf.TajoConf; - -import java.io.IOException; -import java.io.PrintWriter; -import java.io.Writer; -import java.sql.SQLException; - -public class TajoGetConf { - private static final org.apache.commons.cli.Options options; - - static { - options = new Options(); - options.addOption("h", "host", true, "Tajo server host"); - options.addOption("p", "port", true, "Tajo server port"); - } - - private TajoConf tajoConf; - private TajoClient tajoClient; - private Writer writer; - - public final static String defaultLeftPad = " "; - public final static String defaultDescPad = " "; - - public TajoGetConf(TajoConf tajoConf, Writer writer) { - this(tajoConf, writer, null); - } - - public TajoGetConf(TajoConf tajoConf, Writer writer, TajoClient tajoClient) { - this.tajoConf = tajoConf; - this.writer = writer; - this.tajoClient = tajoClient; - } - - private void printUsage(boolean tsqlMode) { - if (!tsqlMode) { - HelpFormatter formatter = new HelpFormatter(); - formatter.printHelp( "getconf <key> [options]", options ); - } - System.out.println(defaultLeftPad + "key" + defaultDescPad + "gets a specific key from the configuration"); - } - - public void runCommand(String[] args) throws Exception { - runCommand(args, true); - } - - public void runCommand(String[] args, boolean tsqlMode) throws Exception { - CommandLineParser parser = new PosixParser(); - - if (args.length == 0) { - printUsage(tsqlMode); - return; - } - - CommandLine cmd = parser.parse(options, args); - - String hostName = null; - Integer port = null; - if (cmd.hasOption("h")) { - hostName = cmd.getOptionValue("h"); - } - if (cmd.hasOption("p")) { - port = Integer.parseInt(cmd.getOptionValue("p")); - } - - String param; - if (cmd.getArgs().length > 1) { - printUsage(tsqlMode); - return; - } else { - param = cmd.getArgs()[0]; - } - - // if there is no "-h" option, - if(hostName == null) { - if (tajoConf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS) != null) { - // it checks if the client service address is given in configuration and distributed mode. - // if so, it sets entryAddr. - hostName = tajoConf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS).split(":")[0]; - } - } - if (port == null) { - if (tajoConf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS) != null) { - // it checks if the client service address is given in configuration and distributed mode. - // if so, it sets entryAddr. - port = Integer.parseInt(tajoConf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS).split(":")[1]); - } - } - - if ((hostName == null) ^ (port == null)) { - return; - } else if (hostName != null && port != null) { - tajoConf.setVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS, hostName + ":" + port); - tajoClient = new TajoClientImpl(tajoConf); - } else if (hostName == null && port == null) { - tajoClient = new TajoClientImpl(tajoConf); - } - - processConfKey(writer, param); - writer.flush(); - } - - private void processConfKey(Writer writer, String param) throws ParseException, IOException, - ServiceException, SQLException { - String value = tajoConf.getTrimmed(param); - - // If there is no value in the configuration file, we need to find all ConfVars. - if (value == null) { - for(TajoConf.ConfVars vars : TajoConf.ConfVars.values()) { - if (vars.varname.equalsIgnoreCase(param)) { - value = tajoConf.getVar(vars); - break; - } - } - } - - if (value != null) { - writer.write(value); - } else { - writer.write("Configuration " + param + " is missing."); - } - - writer.write("\n"); - } - - public static void main(String [] args) throws Exception { - TajoConf conf = new TajoConf(); - - Writer writer = new PrintWriter(System.out); - try { - TajoGetConf admin = new TajoGetConf(conf, writer); - admin.runCommand(args, false); - } finally { - writer.close(); - System.exit(0); - } - } -} http://git-wip-us.apache.org/repos/asf/tajo/blob/ad4fda7c/tajo-client/src/main/java/org/apache/tajo/cli/tools/TajoHAAdmin.java ---------------------------------------------------------------------- diff --git a/tajo-client/src/main/java/org/apache/tajo/cli/tools/TajoHAAdmin.java b/tajo-client/src/main/java/org/apache/tajo/cli/tools/TajoHAAdmin.java deleted file mode 100644 index ef8fee9..0000000 --- a/tajo-client/src/main/java/org/apache/tajo/cli/tools/TajoHAAdmin.java +++ /dev/null @@ -1,211 +0,0 @@ -/** - * 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.cli.tools; - -import com.google.protobuf.ServiceException; -import org.apache.commons.cli.*; -import org.apache.tajo.client.TajoClient; -import org.apache.tajo.client.TajoClientImpl; -import org.apache.tajo.client.TajoHAClientUtil; -import org.apache.tajo.conf.TajoConf; -import org.apache.tajo.ha.HAServiceUtil; - -import java.io.IOException; -import java.io.PrintWriter; -import java.io.Writer; - -public class TajoHAAdmin { - private static final Options options; - - static { - options = new Options(); - options.addOption("h", "host", true, "Tajo server host"); - options.addOption("p", "port", true, "Tajo server port"); - options.addOption("transitionToActive", null, true, "Transitions the master into Active state"); - options.addOption("transitionToBackup", null, true, "Transitions the master into Backup state"); - options.addOption("getState", null, true, "Returns the state of the master"); - options.addOption("formatHA", null, false, "Format HA status on share storage"); - } - - private TajoConf tajoConf; - private TajoClient tajoClient; - private Writer writer; - - public TajoHAAdmin(TajoConf tajoConf, Writer writer) { - this(tajoConf, writer, null); - } - - public TajoHAAdmin(TajoConf tajoConf, Writer writer, TajoClient tajoClient) { - this.tajoConf = tajoConf; - this.writer = writer; - this.tajoClient = tajoClient; - } - - private void printUsage() { - HelpFormatter formatter = new HelpFormatter(); - formatter.printHelp( "haadmin [options]", options ); - } - - public void runCommand(String[] args) throws Exception { - if(args.length == 1 && - (args[0].equalsIgnoreCase("-transitionToActive") - || args[0].equalsIgnoreCase("-transitionToBackup") - || args[0].equalsIgnoreCase("-getState"))) { - writer.write("Not enough arguments: expected 1 but got 0\n"); - writer.flush(); - return; - } - - CommandLineParser parser = new PosixParser(); - CommandLine cmd = parser.parse(options, args); - - String param = ""; - int cmdType = 0; - - String hostName = null; - Integer port = null; - if (cmd.hasOption("h")) { - hostName = cmd.getOptionValue("h"); - } - if (cmd.hasOption("p")) { - port = Integer.parseInt(cmd.getOptionValue("p")); - } - - if (cmd.hasOption("transitionToActive")) { - cmdType = 1; - param = cmd.getOptionValue("transitionToActive"); - } else if (cmd.hasOption("transitionToBackup")) { - cmdType = 2; - param = cmd.getOptionValue("transitionToBackup"); - } else if (cmd.hasOption("getState")) { - cmdType = 3; - param = cmd.getOptionValue("getState"); - } else if (cmd.hasOption("formatHA")) { - cmdType = 4; - } - - // if there is no "-h" option, - if(hostName == null) { - if (tajoConf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS) != null) { - // it checks if the client service address is given in configuration and distributed mode. - // if so, it sets entryAddr. - hostName = tajoConf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS).split(":")[0]; - } - } - if (port == null) { - if (tajoConf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS) != null) { - // it checks if the client service address is given in configuration and distributed mode. - // if so, it sets entryAddr. - port = Integer.parseInt(tajoConf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS).split(":")[1]); - } - } - - if (cmdType == 0) { - printUsage(); - return; - } - - - if ((hostName == null) ^ (port == null)) { - System.err.println("ERROR: cannot find valid Tajo server address"); - return; - } else if (hostName != null && port != null) { - tajoConf.setVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS, hostName + ":" + port); - tajoClient = new TajoClientImpl(tajoConf); - } else if (hostName == null && port == null) { - tajoClient = new TajoClientImpl(tajoConf); - } - - if (!tajoConf.getBoolVar(TajoConf.ConfVars.TAJO_MASTER_HA_ENABLE)) { - writer.write("HA is not enabled for this tajo cluster."); - } else { - switch (cmdType) { - case 1: - writer.write("Not Yet Implemented\n"); - break; - case 2: - writer.write("Not Yet Implemented\n"); - break; - case 3: - getState(writer, param); - break; - case 4: - formatHA(writer); - break; - default: - printUsage(); - break; - } - } - - writer.flush(); - } - - private void getState(Writer writer, String param) throws ParseException, IOException, - ServiceException { - tajoClient = TajoHAClientUtil.getTajoClient(tajoConf, tajoClient); - int retValue = HAServiceUtil.getState(param, tajoConf); - - switch (retValue) { - case 1: - writer.write("The master is active.\n"); - break; - case 0: - writer.write("The master is backup.\n"); - break; - case -1: - writer.write("Finding failed. - master:" + param + "\n"); - break; - default: - writer.write("Cannot find the master. - master:" + param + "\n"); - break; - } - } - - private void formatHA(Writer writer) throws ParseException, IOException, - ServiceException { - int retValue = HAServiceUtil.formatHA(tajoConf); - - switch (retValue) { - case 1: - writer.write("Formatting finished successfully.\n"); - break; - case 0: - writer.write("If you want to format the ha information, you must shutdown tajo masters " - + " before formatting.\n"); - break; - default: - writer.write("Cannot format ha information.\n"); - break; - } - } - - public static void main(String [] args) throws Exception { - TajoConf conf = new TajoConf(); - - Writer writer = new PrintWriter(System.out); - try { - TajoHAAdmin admin = new TajoHAAdmin(conf, writer); - admin.runCommand(args); - } finally { - writer.close(); - System.exit(0); - } - } -} http://git-wip-us.apache.org/repos/asf/tajo/blob/ad4fda7c/tajo-client/src/main/java/org/apache/tajo/cli/tsql/DefaultTajoCliOutputFormatter.java ---------------------------------------------------------------------- diff --git a/tajo-client/src/main/java/org/apache/tajo/cli/tsql/DefaultTajoCliOutputFormatter.java b/tajo-client/src/main/java/org/apache/tajo/cli/tsql/DefaultTajoCliOutputFormatter.java deleted file mode 100644 index 5cbe77b..0000000 --- a/tajo-client/src/main/java/org/apache/tajo/cli/tsql/DefaultTajoCliOutputFormatter.java +++ /dev/null @@ -1,211 +0,0 @@ -/** - * 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.cli.tsql; - -import org.apache.commons.lang.exception.ExceptionUtils; -import org.apache.tajo.QueryId; -import org.apache.tajo.SessionVars; -import org.apache.tajo.TajoConstants; -import org.apache.tajo.catalog.TableDesc; -import org.apache.tajo.catalog.statistics.TableStats; -import org.apache.tajo.client.QueryStatus; -import org.apache.tajo.util.FileUtil; - -import java.io.InputStream; -import java.io.PrintWriter; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; - -public class DefaultTajoCliOutputFormatter implements TajoCliOutputFormatter { - private int printPauseRecords; - private boolean printPause; - private boolean printErrorTrace; - private String nullChar; - public static char QUIT_COMMAND = 'q'; - - @Override - public void init(TajoCli.TajoCliContext context) { - this.printPause = context.getBool(SessionVars.CLI_PAGING_ENABLED); - this.printPauseRecords = context.getInt(SessionVars.CLI_PAGE_ROWS); - this.printErrorTrace = context.getBool(SessionVars.CLI_DISPLAY_ERROR_TRACE); - this.nullChar = context.get(SessionVars.CLI_NULL_CHAR); - } - - @Override - public void setScriptMode() { - this.printPause = false; - } - - private String getQuerySuccessMessage(TableDesc tableDesc, float responseTime, int totalPrintedRows, String postfix, - boolean endOfTuple) { - TableStats stat = tableDesc.getStats(); - String volume = stat == null ? (endOfTuple ? "0 B" : "unknown bytes") : - FileUtil.humanReadableByteCount(stat.getNumBytes(), false); - long resultRows = stat == null ? TajoConstants.UNKNOWN_ROW_NUMBER : stat.getNumRows(); - - String displayRowNum; - if (resultRows == TajoConstants.UNKNOWN_ROW_NUMBER) { - - if (endOfTuple) { - displayRowNum = totalPrintedRows + " rows"; - } else { - displayRowNum = "unknown row number"; - } - - } else { - displayRowNum = resultRows + " rows"; - } - return "(" + displayRowNum + ", " + getResponseTimeReadable(responseTime) + ", " + volume + " " + postfix + ")"; - } - - protected String getResponseTimeReadable(float responseTime) { - return responseTime + " sec"; - } - - @Override - public void printResult(PrintWriter sout, InputStream sin, TableDesc tableDesc, - float responseTime, ResultSet res) throws Exception { - long resultRows = tableDesc.getStats() == null ? -1 : tableDesc.getStats().getNumRows(); - if (resultRows == -1) { - resultRows = Integer.MAX_VALUE; - } - - if (res == null) { - sout.println(getQuerySuccessMessage(tableDesc, responseTime, 0, "inserted", true)); - return; - } - ResultSetMetaData rsmd = res.getMetaData(); - int numOfColumns = rsmd.getColumnCount(); - for (int i = 1; i <= numOfColumns; i++) { - if (i > 1) sout.print(", "); - String columnName = rsmd.getColumnName(i); - sout.print(columnName); - } - sout.println("\n-------------------------------"); - - int numOfPrintedRows = 0; - int totalPrintedRows = 0; - boolean endOfTuple = true; - while (res.next()) { - for (int i = 1; i <= numOfColumns; i++) { - if (i > 1) sout.print(", "); - String columnValue = res.getString(i); - if(res.wasNull()){ - sout.print(nullChar); - } else { - sout.print(columnValue); - } - } - sout.println(); - sout.flush(); - numOfPrintedRows++; - totalPrintedRows++; - if (printPause && printPauseRecords > 0 && totalPrintedRows < resultRows && numOfPrintedRows >= printPauseRecords) { - if (resultRows < Integer.MAX_VALUE) { - sout.print("(" + totalPrintedRows + "/" + resultRows + " rows, continue... 'q' is quit)"); - } else { - sout.print("(" + totalPrintedRows + " rows, continue... 'q' is quit)"); - } - sout.flush(); - if (sin != null) { - if (sin.read() == QUIT_COMMAND) { - endOfTuple = false; - sout.println(); - break; - } - } - numOfPrintedRows = 0; - sout.println(); - } - } - sout.println(getQuerySuccessMessage(tableDesc, responseTime, totalPrintedRows, "selected", endOfTuple)); - sout.flush(); - } - - @Override - public void printNoResult(PrintWriter sout) { - sout.println("(0 rows)"); - sout.flush(); - } - - @Override - public void printProgress(PrintWriter sout, QueryStatus status) { - sout.println("Progress: " + (int)(status.getProgress() * 100.0f) - + "%, response time: " - + getResponseTimeReadable((float)((status.getFinishTime() - status.getSubmitTime()) / 1000.0))); - sout.flush(); - } - - @Override - public void printMessage(PrintWriter sout, String message) { - sout.println(message); - sout.flush(); - } - - @Override - public void printErrorMessage(PrintWriter sout, Throwable t) { - sout.println(parseErrorMessage(t.getMessage())); - if (printErrorTrace) { - sout.println(ExceptionUtils.getStackTrace(t)); - } - sout.flush(); - } - - @Override - public void printErrorMessage(PrintWriter sout, String message) { - sout.println(parseErrorMessage(message)); - sout.flush(); - } - - @Override - public void printKilledMessage(PrintWriter sout, QueryId queryId) { - sout.println(TajoCli.KILL_PREFIX + queryId); - sout.flush(); - } - - @Override - public void printErrorMessage(PrintWriter sout, QueryStatus status) { - if (status.getErrorMessage() != null && !status.getErrorMessage().isEmpty()) { - printErrorMessage(sout, parseErrorMessage(status.getErrorMessage())); - } else { - printErrorMessage(sout, "No error message"); - } - if (printErrorTrace && status.getErrorTrace() != null && !status.getErrorTrace().isEmpty()) { - sout.println(status.getErrorTrace()); - } - sout.flush(); - } - - public static String parseErrorMessage(String message) { - if (message == null) { - return TajoCli.ERROR_PREFIX + "No error message"; - } - String[] lines = message.split("\n"); - message = lines[0]; - - int index = message.lastIndexOf(TajoCli.ERROR_PREFIX); - if (index < 0) { - message = TajoCli.ERROR_PREFIX + message; - } else { - message = message.substring(index); - } - - return message; - } -} http://git-wip-us.apache.org/repos/asf/tajo/blob/ad4fda7c/tajo-client/src/main/java/org/apache/tajo/cli/tsql/InvalidStatementException.java ---------------------------------------------------------------------- diff --git a/tajo-client/src/main/java/org/apache/tajo/cli/tsql/InvalidStatementException.java b/tajo-client/src/main/java/org/apache/tajo/cli/tsql/InvalidStatementException.java deleted file mode 100644 index 2fed9fe..0000000 --- a/tajo-client/src/main/java/org/apache/tajo/cli/tsql/InvalidStatementException.java +++ /dev/null @@ -1,25 +0,0 @@ -/** - * 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.cli.tsql; - -public class InvalidStatementException extends Exception { - public InvalidStatementException(String message) { - super(message); - } -} http://git-wip-us.apache.org/repos/asf/tajo/blob/ad4fda7c/tajo-client/src/main/java/org/apache/tajo/cli/tsql/ParsedResult.java ---------------------------------------------------------------------- diff --git a/tajo-client/src/main/java/org/apache/tajo/cli/tsql/ParsedResult.java b/tajo-client/src/main/java/org/apache/tajo/cli/tsql/ParsedResult.java deleted file mode 100644 index 7894731..0000000 --- a/tajo-client/src/main/java/org/apache/tajo/cli/tsql/ParsedResult.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * 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.cli.tsql; - - -public class ParsedResult { - public static enum StatementType { - META, - STATEMENT - } - - private final StatementType type; - private final String historyStatement; - private final String statement; - - public ParsedResult(StatementType type, String statement, String historyStatement) { - this.type = type; - this.statement = statement; - this.historyStatement = historyStatement; - } - - public StatementType getType() { - return type; - } - - public String getHistoryStatement() { - return historyStatement.trim(); - } - - public String getStatement() { - return statement.trim(); - } - - public String toString() { - return "(" + type.name() + ") " + historyStatement; - } -} http://git-wip-us.apache.org/repos/asf/tajo/blob/ad4fda7c/tajo-client/src/main/java/org/apache/tajo/cli/tsql/SimpleParser.java ---------------------------------------------------------------------- diff --git a/tajo-client/src/main/java/org/apache/tajo/cli/tsql/SimpleParser.java b/tajo-client/src/main/java/org/apache/tajo/cli/tsql/SimpleParser.java deleted file mode 100644 index 56315a8..0000000 --- a/tajo-client/src/main/java/org/apache/tajo/cli/tsql/SimpleParser.java +++ /dev/null @@ -1,388 +0,0 @@ -/** - * 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.cli.tsql; - -import java.util.ArrayList; -import java.util.List; - -import static org.apache.tajo.cli.tsql.ParsedResult.StatementType.META; -import static org.apache.tajo.cli.tsql.ParsedResult.StatementType.STATEMENT; - -/** - * This is a parser used in tsql to parse multiple SQL lines into SQL statements. - * It helps tsql recognizes the termination of each SQL statement and quotation mark (') while - * parses multiple separate lines. - */ -public class SimpleParser { - - public static enum ParsingState { - TOK_START, // Start State - META, // Meta Command - STATEMENT, // Statement - WITHIN_QUOTE, // Within Quote - INVALID, // Invalid Statement - STATEMENT_EOS, // End State (End of Statement) - META_EOS // End State (End of Statement) - } - - ParsingState state = START_STATE; - int lineNum; - - /** - * It will be used to store a query statement into Jline history. - * the query statement for history does not include unnecessary white spaces and new line. - */ - private StringBuilder historyAppender = new StringBuilder(); - /** - * It will be used to submit a query statement to the TajoMaster. It just contains a raw query statement string. - */ - private StringBuilder rawAppender = new StringBuilder(); - - public static final ParsingState START_STATE = ParsingState.TOK_START; - - /** - * <h2>State Machine</h2> - * All whitespace are ignored in all cases except for - * - * <pre> - * (start) TOK_START --> META ---------------------> META_EOS - * | - * | - * | - * |-----------> STATEMENT ----------> STMT_EOS - * \ ^ - * \ / - * \-> WITHIN_QUOTE - * \ ^ - * \---/ - * </pre> - */ - - public static List<ParsedResult> parseScript(String str) throws InvalidStatementException { - SimpleParser parser = new SimpleParser(); - List<ParsedResult> parsedResults = new ArrayList<ParsedResult>(); - parsedResults.addAll(parser.parseLines(str)); - parsedResults.addAll(parser.EOF()); - return parsedResults; - } - - public List<ParsedResult> parseLines(String str) throws InvalidStatementException { - List<ParsedResult> statements = new ArrayList<ParsedResult>(); - int lineStartIdx; - int idx = 0; - char [] chars = str.toCharArray(); - - // if parsing continues, it means that the previous line is broken by '\n'. - // So, we should add new line to rawAppender. - if (isStatementContinue()) { - rawAppender.append("\n"); - } - - while(idx < str.length()) { - - // initialization for new statement - if (state == ParsingState.TOK_START) { - lineNum = 0; - - // ignore all whitespace before start - if (Character.isWhitespace(chars[idx])) { - idx++; - continue; - } - } - - //////////////////////////// - // TOK_START --> META - //////////////////////////// - - lineStartIdx = idx; - - if (state == ParsingState.TOK_START && chars[idx] == '\\') { - state = ParsingState.META; - - //////////////////////////// - // META --> TOK_EOS - //////////////////////////// - while (state != ParsingState.META_EOS && idx < chars.length) { - char character = chars[idx++]; - - if (isEndOfMeta(character)) { - state = ParsingState.META_EOS; - } else if (Character.isWhitespace(character)) { - // skip - } - } - - if (state == ParsingState.META_EOS) { - historyAppender.append(str.subSequence(lineStartIdx, idx - 1).toString()); - appendToRawStatement(str.subSequence(lineStartIdx, idx - 1).toString(), true); - } else { - historyAppender.append(str.subSequence(lineStartIdx, idx).toString()); - appendToRawStatement(str.subSequence(lineStartIdx, idx).toString(), true); - } - - } else if (isInlineCommentStart(chars, idx)) { - idx = consumeInlineComment(chars, idx); - appendToRawStatement(str.subSequence(lineStartIdx, idx).toString(), true); - - ///////////////////////////////// - // TOK_START -> STATEMENT - // or TOK_STATEMENT -> STATEMENT - //////////////////////////////// - } else if (isStatementContinue() || isStatementStart(chars[idx])) { - if (!isStatementContinue()) { // TOK_START -> STATEMENT - state = ParsingState.STATEMENT; - rawAppender.append("\n"); - } - - while (!isTerminateState(state) && idx < chars.length) { - char character = chars[idx++]; - - /////////////////////////////////////////////////////// - // in-statement loop BEGIN - /////////////////////////////////////////////////////// - if (isEndOfStatement(character)) { - state = ParsingState.STATEMENT_EOS; - - } else if (state == ParsingState.STATEMENT && character == '\n') { - appendToBothStatements(chars, lineStartIdx, idx, 1); // omit new line chacter '\n' from history statement - lineStartIdx = idx; - - } else if (state == ParsingState.STATEMENT && character == '\'') { // TOK_STATEMENT -> WITHIN_QUOTE - state = ParsingState.WITHIN_QUOTE; - - if (idx < chars.length) { - character = chars[idx++]; - } else { - continue; - } - - - // idx points the characters followed by the current character. So, we should use 'idx - 1' - // in order to point the current character. - } else if (state == ParsingState.STATEMENT && idx < chars.length && isInlineCommentStart(chars, idx - 1)) { - idx++; - appendToBothStatements(chars, lineStartIdx, idx, 2); // omit two dash characters '--' from history statement - int commentStartIdx = idx; - idx = consumeInlineComment(chars, idx); - appendToRawStatement(str.subSequence(commentStartIdx, idx).toString(), true); - lineStartIdx = idx; - } - /////////////////////////////////////////////////////// - // in-statement loop END - /////////////////////////////////////////////////////// - - if (state == ParsingState.WITHIN_QUOTE) { - while(idx < chars.length) { - /////////////////////////////// - // WITHIN_QUOTE --> STATEMENT - /////////////////////////////// - if (character == '\'') { - state = ParsingState.STATEMENT; - break; - } - character = chars[idx++]; - } - if (state == ParsingState.WITHIN_QUOTE && character == '\'') { - state = ParsingState.STATEMENT; - } - } - } - - // After all characters are consumed - - if (state == ParsingState.STATEMENT_EOS) { // If one query statement is terminated - appendToBothStatements(chars, lineStartIdx, idx - 1); // skip semicolon (;) - } else { - appendToBothStatements(chars, lineStartIdx, idx); - - // if it is not within quote and there is no space between lines, adds a space. - if (state == ParsingState.STATEMENT && (historyAppender.charAt(historyAppender.length() - 1) != ' ')) { - historyAppender.append(" "); - rawAppender.append("\n"); - } - } - } else { // skip unknown character - idx++; - } - - lineNum++; - statements.addAll(doProcessEndOfStatement(state == ParsingState.META)); - } - - return statements; - } - - /** - * Append the range of characters into a given StringBuilder instance. - * - * @param chars Characters - * @param fromIdx start character index - * @param toIdx end character index - */ - private void appendToStatement(StringBuilder builder, char[] chars, int fromIdx, int toIdx) { - builder.append(chars, fromIdx, toIdx - fromIdx); - } - - /** - * Append the range of characters into both history and raw appenders. It omits the number of characters specified by - * <code>omitCharNums</code>. - * - * - * @param chars Characters - * @param fromIdx start character index - * @param toIdx end character index - * @param omitCharNums how many characters will be omitted from history statement - */ - private void appendToBothStatements(char[] chars, int fromIdx, int toIdx, int omitCharNums) { - appendToStatement(historyAppender, chars, fromIdx, toIdx - omitCharNums); - if (historyAppender.charAt(historyAppender.length() - 1) != ' ') { - historyAppender.append(" "); - } - appendToStatement(rawAppender, chars, fromIdx, toIdx); - } - - /** - * Append the range of characters into both history and raw appenders. - * - * - * @param chars Characters - * @param fromIdx start character index - * @param toIdx end character index - */ - private void appendToBothStatements(char[] chars, int fromIdx, int toIdx) { - historyAppender.append(chars, fromIdx, toIdx - fromIdx); - rawAppender.append(chars, fromIdx, toIdx - fromIdx); - } - - private int consumeInlineComment(char [] chars, int currentIdx) { - currentIdx++; - while (currentIdx < chars.length && !isNewLine(chars[currentIdx])) { - currentIdx++; - } - return currentIdx; - } - - private void appendToRawStatement(String str, boolean addLF) { - if (!str.isEmpty() && !"\n".equals(str) && - rawAppender.length() > 0 && addLF && rawAppender.charAt(rawAppender.length() - 1) != '\n') { - rawAppender.append(str); - } else { - rawAppender.append(str); - } - } - - private static boolean isEndOfMeta(char character) { - return character == ';' || character == '\n'; - } - - private static boolean isEndOfStatement(char character) { - return character == ';'; - } - - /** - * It checks if inline comment '--' begins. - * @param chars - * @param idx - * @return - */ - private boolean isInlineCommentStart(char[] chars, int idx) { - if (idx >= chars.length - 1) { - return false; - } - return (state == ParsingState.STATEMENT || state == ParsingState.TOK_START) && - (chars[idx] == '-' && chars[idx + 1] == '-'); - } - - private boolean isNewLine(char character) { - return character == '\n'; - } - - private boolean isStatementStart(char character) { - return state == ParsingState.TOK_START && (Character.isLetterOrDigit(character)); - } - - private boolean isStatementContinue() { - return state == ParsingState.WITHIN_QUOTE || state == ParsingState.STATEMENT; - } - - /** - * process all parsed statements so far and return a list of parsed results. - * - * @param endOfFile TRUE if the end of file. - * @return the list of parsed results, each of result contains one query statement or meta command. - * @throws InvalidStatementException - */ - private List<ParsedResult> doProcessEndOfStatement(boolean endOfFile) throws InvalidStatementException { - List<ParsedResult> parsedResults = new ArrayList<ParsedResult>(); - String errorMessage = ""; - if (endOfFile) { - if (state == ParsingState.META) { - state = ParsingState.META_EOS; - } else if (state == ParsingState.STATEMENT) { - state = ParsingState.STATEMENT_EOS; - } else if (state == ParsingState.WITHIN_QUOTE) { - state = ParsingState.INVALID; - errorMessage = "unterminated quoted string at LINE " + lineNum; - } - } - - if (isTerminateState(state)) { - String historyStatement = historyAppender.toString(); - String rawStatement = rawAppender.toString(); - if (state == ParsingState.META_EOS) { - parsedResults.add(new ParsedResult(META, rawStatement, historyStatement)); - state = ParsingState.TOK_START; - } else if (state == ParsingState.STATEMENT_EOS) { - parsedResults.add(new ParsedResult(STATEMENT, rawStatement, historyStatement)); - } else { - throw new InvalidStatementException("ERROR: " + errorMessage); - } - - // reset all states - historyAppender.delete(0, historyAppender.length()); - rawAppender.delete(0, rawAppender.length()); - state = START_STATE; - } - - return parsedResults; - } - - /** - * It manually triggers the end of file. - * - * @return the list of parsed results, each of result contains one query statement or meta command. - * @throws InvalidStatementException - */ - public List<ParsedResult> EOF() throws InvalidStatementException { - return doProcessEndOfStatement(true); - } - - private static boolean isTerminateState(ParsingState state) { - return (state == ParsingState.META_EOS || state == ParsingState.STATEMENT_EOS || state == ParsingState.INVALID); - } - - public ParsingState getState() { - return state; - } - - public String toString() { - return "[" + state.name() + "]: " + historyAppender.toString(); - } -} http://git-wip-us.apache.org/repos/asf/tajo/blob/ad4fda7c/tajo-client/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java ---------------------------------------------------------------------- diff --git a/tajo-client/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java b/tajo-client/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java deleted file mode 100644 index db7f981..0000000 --- a/tajo-client/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java +++ /dev/null @@ -1,701 +0,0 @@ -/** - * 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.cli.tsql; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Preconditions; -import com.google.protobuf.ServiceException; -import jline.UnsupportedTerminal; -import jline.console.ConsoleReader; -import org.apache.commons.cli.*; -import org.apache.tajo.*; -import org.apache.tajo.ipc.*; -import org.apache.tajo.TajoProtos.QueryState; -import org.apache.tajo.catalog.TableDesc; -import org.apache.tajo.cli.tsql.commands.*; -import org.apache.tajo.client.*; -import org.apache.tajo.conf.TajoConf; -import org.apache.tajo.conf.TajoConf.ConfVars; -import org.apache.tajo.util.FileUtil; - -import java.io.*; -import java.lang.reflect.Constructor; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -import static org.apache.tajo.cli.tsql.ParsedResult.StatementType.META; -import static org.apache.tajo.cli.tsql.ParsedResult.StatementType.STATEMENT; -import static org.apache.tajo.cli.tsql.SimpleParser.ParsingState; - -public class TajoCli { - public static final String ERROR_PREFIX = "ERROR: "; - public static final String KILL_PREFIX = "KILL: "; - - private final TajoConf conf; - private TajoClient client; - private final TajoCliContext context; - - // Jline and Console related things - private final ConsoleReader reader; - private final InputStream sin; - private final PrintWriter sout; - private TajoFileHistory history; - - // Current States - private String currentDatabase; - - private TajoCliOutputFormatter displayFormatter; - - private boolean wasError = false; - - private static final Class [] registeredCommands = { - DescTableCommand.class, - DescFunctionCommand.class, - HelpCommand.class, - ExitCommand.class, - CopyrightCommand.class, - VersionCommand.class, - ConnectDatabaseCommand.class, - ListDatabaseCommand.class, - SetCommand.class, - UnsetCommand.class, - ExecExternalShellCommand.class, - HdfsCommand.class, - TajoAdminCommand.class, - TajoGetConfCommand.class, - TajoHAAdminCommand.class - }; - private final Map<String, TajoShellCommand> commands = new TreeMap<String, TajoShellCommand>(); - - protected static final Options options; - private static final String HOME_DIR = System.getProperty("user.home"); - private static final String HISTORY_FILE = ".tajo_history"; - - static { - options = new Options(); - options.addOption("c", "command", true, "execute only single command, then exit"); - options.addOption("f", "file", true, "execute commands from file, then exit"); - options.addOption("h", "host", true, "Tajo server host"); - options.addOption("p", "port", true, "Tajo server port"); - options.addOption("B", "background", false, "execute as background process"); - options.addOption("conf", "conf", true, "configuration value"); - options.addOption("param", "param", true, "parameter value in SQL file"); - options.addOption("help", "help", false, "help"); - } - - public class TajoCliContext extends OverridableConf { - public TajoCliContext(TajoConf conf) { - super(conf, ConfigKey.ConfigType.SESSION); - } - - public TajoClient getTajoClient() { - return client; - } - - public void setCurrentDatabase(String databasae) { - currentDatabase = databasae; - } - - public String getCurrentDatabase() { - return currentDatabase; - } - - public PrintWriter getOutput() { - return sout; - } - - public TajoConf getConf() { - return conf; - } - - @VisibleForTesting - public String getCliSideVar(String key) { - if (SessionVars.exists(key)) { - ConfigKey configKey = SessionVars.get(key); - return get(configKey); - } else { - return get(key); - } - } - - public void setCliSideVar(String key, String value) { - Preconditions.checkNotNull(key); - Preconditions.checkNotNull(value); - - boolean shouldReloadFormatter = false; - - if (SessionVars.exists(key)) { - SessionVars configKey = SessionVars.get(key); - put(configKey, value); - shouldReloadFormatter = configKey.getMode() == SessionVars.VariableMode.CLI_SIDE_VAR; - } else { - set(key, value); - - // It is hard to recognize it is a client side variable. So, we always reload formatter. - shouldReloadFormatter = true; - } - - if (shouldReloadFormatter) { - try { - initFormatter(); - } catch (Exception e) { - System.err.println(ERROR_PREFIX + e.getMessage()); - } - } - } - - public Map<String, TajoShellCommand> getCommands() { - return commands; - } - } - - public TajoCli(TajoConf c, String [] args, InputStream in, OutputStream out) throws Exception { - CommandLineParser parser = new PosixParser(); - CommandLine cmd = parser.parse(options, args); - - this.conf = new TajoConf(c); - context = new TajoCliContext(conf); - this.sin = in; - if (cmd.hasOption("B")) { - this.reader = new ConsoleReader(sin, out, new UnsupportedTerminal()); - } else { - this.reader = new ConsoleReader(sin, out); - } - - this.reader.setExpandEvents(false); - this.sout = new PrintWriter(reader.getOutput()); - initFormatter(); - - if (cmd.hasOption("help")) { - printUsage(); - System.exit(0); - } - - String hostName = null; - Integer port = null; - if (cmd.hasOption("h")) { - hostName = cmd.getOptionValue("h"); - } - if (cmd.hasOption("p")) { - port = Integer.parseInt(cmd.getOptionValue("p")); - } - - String baseDatabase = null; - if (cmd.getArgList().size() > 0) { - baseDatabase = (String) cmd.getArgList().get(0); - } - - if (cmd.getOptionValues("conf") != null) { - processConfVarCommand(cmd.getOptionValues("conf")); - } - - // if there is no "-h" option, - if(hostName == null) { - if (conf.getVar(ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS) != null) { - // it checks if the client service address is given in configuration and distributed mode. - // if so, it sets entryAddr. - hostName = conf.getVar(ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS).split(":")[0]; - } - } - if (port == null) { - if (conf.getVar(ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS) != null) { - // it checks if the client service address is given in configuration and distributed mode. - // if so, it sets entryAddr. - port = Integer.parseInt(conf.getVar(ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS).split(":")[1]); - } - } - - if ((hostName == null) ^ (port == null)) { - System.err.println(ERROR_PREFIX + "cannot find valid Tajo server address"); - throw new RuntimeException("cannot find valid Tajo server address"); - } else if (hostName != null && port != null) { - conf.setVar(ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS, hostName+":"+port); - client = new TajoClientImpl(conf, baseDatabase); - } else if (hostName == null && port == null) { - client = new TajoClientImpl(conf, baseDatabase); - } - - try { - checkMasterStatus(); - context.setCurrentDatabase(client.getCurrentDatabase()); - initHistory(); - initCommands(); - - if (cmd.getOptionValues("conf") != null) { - processSessionVarCommand(cmd.getOptionValues("conf")); - } - - if (cmd.hasOption("c")) { - displayFormatter.setScriptMode(); - int exitCode = executeScript(cmd.getOptionValue("c")); - sout.flush(); - System.exit(exitCode); - } - if (cmd.hasOption("f")) { - displayFormatter.setScriptMode(); - cmd.getOptionValues(""); - File sqlFile = new File(cmd.getOptionValue("f")); - if (sqlFile.exists()) { - String script = FileUtil.readTextFile(new File(cmd.getOptionValue("f"))); - script = replaceParam(script, cmd.getOptionValues("param")); - int exitCode = executeScript(script); - sout.flush(); - System.exit(exitCode); - } else { - System.err.println(ERROR_PREFIX + "No such a file \"" + cmd.getOptionValue("f") + "\""); - System.exit(-1); - } - } - } catch (Exception e) { - System.err.println(ERROR_PREFIX + "Exception was thrown. Caused by " + e.getMessage()); - - if (client != null) { - client.close(); - } - - throw e; - } - - addShutdownHook(); - } - - private void processConfVarCommand(String[] confCommands) throws ServiceException { - for (String eachParam: confCommands) { - String[] tokens = eachParam.split("="); - if (tokens.length != 2) { - continue; - } - - if (!SessionVars.exists(tokens[0])) { - conf.set(tokens[0], tokens[1]); - } - } - } - - private void processSessionVarCommand(String[] confCommands) throws ServiceException { - for (String eachParam: confCommands) { - String[] tokens = eachParam.split("="); - if (tokens.length != 2) { - continue; - } - - if (SessionVars.exists(tokens[0])) { - ((SetCommand)commands.get("\\set")).set(tokens[0], tokens[1]); - } - } - } - - private void initFormatter() throws Exception { - Class formatterClass = context.getClass(SessionVars.CLI_FORMATTER_CLASS); - if (displayFormatter == null || !displayFormatter.getClass().equals(formatterClass)) { - displayFormatter = (TajoCliOutputFormatter)formatterClass.newInstance(); - } - displayFormatter.init(context); - } - - public TajoCliContext getContext() { - return context; - } - - protected static String replaceParam(String script, String[] params) { - if (params == null || params.length == 0) { - return script; - } - - for (String eachParam: params) { - String[] tokens = eachParam.split("="); - if (tokens.length != 2) { - continue; - } - script = script.replace("${" + tokens[0] + "}", tokens[1]); - } - - return script; - } - - private void initHistory() { - try { - String historyPath = HOME_DIR + File.separator + HISTORY_FILE; - if ((new File(HOME_DIR)).exists()) { - history = new TajoFileHistory(new File(historyPath)); - history.setAutoTrim(false); - history.setIgnoreDuplicates(false); - reader.setHistory(history); - } else { - System.err.println(ERROR_PREFIX + "home directory : '" + HOME_DIR +"' does not exist."); - } - } catch (Exception e) { - System.err.println(ERROR_PREFIX + e.getMessage()); - } - } - - private void initCommands() { - for (Class clazz : registeredCommands) { - TajoShellCommand cmd = null; - try { - Constructor cons = clazz.getConstructor(new Class[] {TajoCliContext.class}); - cmd = (TajoShellCommand) cons.newInstance(context); - } catch (Exception e) { - System.err.println(e.getMessage()); - throw new RuntimeException(e.getMessage()); - } - commands.put(cmd.getCommand(), cmd); - for (String alias : cmd.getAliases()) { - commands.put(alias, cmd); - } - } - } - - private void addShutdownHook() { - Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { - @Override - public void run() { - try { - history.flush(); - } catch (IOException e) { - } - client.close(); - } - })); - } - - private String updatePrompt(ParsingState state) throws ServiceException { - if (state == ParsingState.WITHIN_QUOTE) { - return "'"; - } else if (state == ParsingState.TOK_START) { - return context.getCurrentDatabase(); - } else { - return ""; - } - } - - public int runShell() throws Exception { - String line; - String currentPrompt = context.getCurrentDatabase(); - int exitCode; - ParsingState latestState = SimpleParser.START_STATE; - - sout.write("Try \\? for help.\n"); - - SimpleParser parser = new SimpleParser(); - - try { - while((line = reader.readLine(currentPrompt + "> ")) != null) { - if (line.equals("")) { - continue; - } - wasError = false; - if (line.startsWith("{")) { - executeJsonQuery(line); - } else { - List<ParsedResult> parsedResults = parser.parseLines(line); - - if (latestState != ParsingState.TOK_START && parsedResults.size() > 0) { - // Add multi-line statements to history in addition to individual lines. - ParsedResult parsed = parsedResults.get(0); - history.add(parsed.getHistoryStatement() + (parsed.getType() == STATEMENT ? ";" : "")); - } - - exitCode = executeParsedResults(parsedResults); - latestState = parser.getState(); - currentPrompt = updatePrompt(latestState); - - // if at least one failed - if (exitCode != 0) { - return exitCode; - } - } - } - } catch (Exception e) { - System.err.println(ERROR_PREFIX + "Exception was thrown. Casued by " + e.getMessage()); - - if (client != null) { - client.close(); - } - - throw e; - } - return 0; - } - - private int executeParsedResults(Collection<ParsedResult> parsedResults) throws Exception { - int exitCode; - for (ParsedResult parsedResult : parsedResults) { - if (parsedResult.getType() == META) { - exitCode = executeMetaCommand(parsedResult.getStatement()); - } else { - exitCode = executeQuery(parsedResult.getStatement()); - } - - if (exitCode != 0 && context.getBool(SessionVars.ON_ERROR_STOP)) { - return exitCode; - } - } - - return 0; - } - - public int executeMetaCommand(String line) throws Exception { - checkMasterStatus(); - String [] metaCommands = line.split(";"); - for (String metaCommand : metaCommands) { - String arguments [] = metaCommand.split(" "); - - TajoShellCommand invoked = commands.get(arguments[0]); - if (invoked == null) { - printInvalidCommand(arguments[0]); - wasError = true; - return -1; - } - - try { - invoked.invoke(arguments); - } catch (IllegalArgumentException ige) { - displayFormatter.printErrorMessage(sout, ige); - wasError = true; - return -1; - } catch (Exception e) { - displayFormatter.printErrorMessage(sout, e); - wasError = true; - return -1; - } finally { - context.getOutput().flush(); - } - - if (wasError && context.getBool(SessionVars.ON_ERROR_STOP)) { - break; - } - } - - return 0; - } - - private void executeJsonQuery(String json) throws ServiceException, IOException { - checkMasterStatus(); - long startTime = System.currentTimeMillis(); - ClientProtos.SubmitQueryResponse response = client.executeQueryWithJson(json); - if (response == null) { - displayFormatter.printErrorMessage(sout, "response is null"); - wasError = true; - } else if (response.getResultCode() == ClientProtos.ResultCode.OK) { - if (response.getIsForwarded()) { - QueryId queryId = new QueryId(response.getQueryId()); - waitForQueryCompleted(queryId); - } else { - if (!response.hasTableDesc() && !response.hasResultSet()) { - displayFormatter.printMessage(sout, "OK"); - wasError = true; - } else { - localQueryCompleted(response, startTime); - } - } - } else { - if (response.hasErrorMessage()) { - displayFormatter.printErrorMessage(sout, response.getErrorMessage()); - wasError = true; - } - } - } - - private int executeQuery(String statement) throws ServiceException, IOException { - checkMasterStatus(); - long startTime = System.currentTimeMillis(); - ClientProtos.SubmitQueryResponse response = null; - try{ - response = client.executeQuery(statement); - } catch (ServiceException e){ - displayFormatter.printErrorMessage(sout, e.getMessage()); - wasError = true; - } catch(Throwable te){ - displayFormatter.printErrorMessage(sout, te); - wasError = true; - } - - if (response == null) { - displayFormatter.printErrorMessage(sout, "response is null"); - wasError = true; - } else if (response.getResultCode() == ClientProtos.ResultCode.OK) { - if (response.getIsForwarded()) { - QueryId queryId = new QueryId(response.getQueryId()); - waitForQueryCompleted(queryId); - } else { - if (!response.hasTableDesc() && !response.hasResultSet()) { - displayFormatter.printMessage(sout, "OK"); - } else { - localQueryCompleted(response, startTime); - } - } - } else { - if (response.hasErrorMessage()) { - displayFormatter.printErrorMessage(sout, response.getErrorMessage()); - wasError = true; - } - } - - return wasError ? -1 : 0; - } - - private void localQueryCompleted(ClientProtos.SubmitQueryResponse response, long startTime) { - ResultSet res = null; - try { - QueryId queryId = new QueryId(response.getQueryId()); - float responseTime = ((float)(System.currentTimeMillis() - startTime) / 1000.0f); - TableDesc desc = new TableDesc(response.getTableDesc()); - - // non-forwarded INSERT INTO query does not have any query id. - // In this case, it just returns succeeded query information without printing the query results. - if (response.getMaxRowNum() < 0 && queryId.equals(QueryIdFactory.NULL_QUERY_ID)) { - displayFormatter.printResult(sout, sin, desc, responseTime, res); - } else { - res = TajoClientUtil.createResultSet(conf, client, response); - displayFormatter.printResult(sout, sin, desc, responseTime, res); - } - } catch (Throwable t) { - displayFormatter.printErrorMessage(sout, t); - wasError = true; - } finally { - if (res != null) { - try { - res.close(); - } catch (SQLException e) { - } - } - } - } - - private void waitForQueryCompleted(QueryId queryId) { - // if query is empty string - if (queryId.equals(QueryIdFactory.NULL_QUERY_ID)) { - return; - } - - // query execute - ResultSet res = null; - QueryStatus status = null; - try { - - int initRetries = 0; - int progressRetries = 0; - while (true) { - // TODO - configurable - status = client.getQueryStatus(queryId); - if(TajoClientUtil.isQueryWaitingForSchedule(status.getState())) { - Thread.sleep(Math.min(20 * initRetries, 1000)); - initRetries++; - continue; - } - - if (TajoClientUtil.isQueryRunning(status.getState()) || status.getState() == QueryState.QUERY_SUCCEEDED) { - displayFormatter.printProgress(sout, status); - } - - if (TajoClientUtil.isQueryComplete(status.getState()) && status.getState() != QueryState.QUERY_KILL_WAIT) { - break; - } else { - Thread.sleep(Math.min(200 * progressRetries, 1000)); - progressRetries += 2; - } - } - - if (status.getState() == QueryState.QUERY_ERROR || status.getState() == QueryState.QUERY_FAILED) { - displayFormatter.printErrorMessage(sout, status); - wasError = true; - } else if (status.getState() == QueryState.QUERY_KILLED) { - displayFormatter.printKilledMessage(sout, queryId); - wasError = true; - } else { - if (status.getState() == QueryState.QUERY_SUCCEEDED) { - float responseTime = ((float)(status.getFinishTime() - status.getSubmitTime()) / 1000.0f); - ClientProtos.GetQueryResultResponse response = client.getResultResponse(queryId); - if (status.hasResult()) { - res = TajoClientUtil.createResultSet(conf, client, queryId, response); - TableDesc desc = new TableDesc(response.getTableDesc()); - displayFormatter.printResult(sout, sin, desc, responseTime, res); - } else { - TableDesc desc = new TableDesc(response.getTableDesc()); - displayFormatter.printResult(sout, sin, desc, responseTime, res); - } - } - } - } catch (Throwable t) { - displayFormatter.printErrorMessage(sout, t); - wasError = true; - } finally { - if (res != null) { - try { - res.close(); - } catch (SQLException e) { - } - } else { - if (status != null && status.getQueryId() != null) { - client.closeQuery(status.getQueryId()); - } - } - } - } - - public int executeScript(String script) throws Exception { - wasError = false; - List<ParsedResult> results = SimpleParser.parseScript(script); - return executeParsedResults(results); - } - - private void printUsage() { - HelpFormatter formatter = new HelpFormatter(); - formatter.printHelp("tsql [options] [database]", options); - } - - private void printInvalidCommand(String command) { - sout.println("Invalid command " + command + ". Try \\? for help."); - } - - @VisibleForTesting - public void close() { - //for testcase - if (client != null) { - client.close(); - } - - if (reader != null) { - reader.shutdown(); - } - } - - private void checkMasterStatus() throws IOException, ServiceException { - String sessionId = client.getSessionId() != null ? client.getSessionId().getId() : null; - client = TajoHAClientUtil.getTajoClient(conf, client, context); - if(sessionId != null && (client.getSessionId() == null || - !sessionId.equals(client.getSessionId().getId()))) { - commands.clear(); - initHistory(); - initCommands(); - } - } - - public static void main(String [] args) throws Exception { - TajoConf conf = new TajoConf(); - TajoCli shell = new TajoCli(conf, args, System.in, System.out); - System.out.println(); - System.exit(shell.runShell()); - } -}
