@Override public final boolean existsTable(final String tableName) { String[] splitted = CatalogUtil.splitFQTableName(tableName); return existsTable(splitted[0], splitted[1]); }
@Override public TableDesc getTableDesc(String qualifiedName) throws UndefinedTableException { String[] splitted = CatalogUtil.splitFQTableName(qualifiedName); return getTableDesc(splitted[0], splitted[1]); }
private Pair<String, String> getQualifiedName(String currentDatabase, String tableName) { if (CatalogUtil.isFQTableName(tableName)) { String [] splitted = CatalogUtil.splitFQTableName(tableName); return new Pair<>(splitted[0], splitted[1]); } else { return new Pair<>(currentDatabase, tableName); } }
@Override public String getCatalogName(int column) throws SQLException { Column c = schema.getColumn(column - 1); if (CatalogUtil.isFQColumnName(c.getQualifiedName())) { return CatalogUtil.splitFQTableName(c.getQualifier())[0]; } return ""; }
@Override public ReturnState createTable(RpcController controller, TableDescProto request) { String [] splitted = CatalogUtil.splitFQTableName(request.getTableName()); String dbName = splitted[0]; String tbName = splitted[1]; if (linkedMetadataManager.existsDatabase(dbName)) { return errInsufficientPrivilege("drop a table in database '" + dbName + "'"); } if (metaDictionary.isSystemDatabase(dbName)) { return errInsufficientPrivilege("create a table in database '" + dbName + "'"); } wlock.lock(); try { store.createTable(request); LOG.info(String.format("relation \"%s\" is added to the catalog (%s)", CatalogUtil.getCanonicalTableName(dbName, tbName), bindAddressStr)); return OK; } catch (Throwable t) { printStackTraceIfError(LOG, t); return returnError(t); } finally { wlock.unlock(); } }
public void dropIndex(final QueryContext queryContext, final DropIndexNode dropIndexNode) throws UndefinedIndexException, UndefinedDatabaseException { String databaseName, simpleIndexName; if (CatalogUtil.isFQTableName(dropIndexNode.getIndexName())) { String[] splits = CatalogUtil.splitFQTableName(dropIndexNode.getIndexName()); databaseName = splits[0]; simpleIndexName = splits[1]; } else { databaseName = queryContext.getCurrentDatabase(); simpleIndexName = dropIndexNode.getIndexName(); } if (!catalog.existIndexByName(databaseName, simpleIndexName)) { throw new UndefinedIndexException(simpleIndexName); } IndexDesc desc = catalog.getIndexByName(databaseName, simpleIndexName); catalog.dropIndex(databaseName, simpleIndexName); Path indexPath = new Path(desc.getIndexPath()); try { FileSystem fs = indexPath.getFileSystem(context.getConf()); fs.delete(indexPath, true); } catch (IOException e) { throw new InternalError(e.getMessage()); } LOG.info("Index " + simpleIndexName + " is dropped."); }
@Override public void dropTable(String tableName) throws UndefinedDatabaseException, UndefinedTableException, InsufficientPrivilegeException { String[] splitted = CatalogUtil.splitFQTableName(tableName); final String databaseName = splitted[0]; final String simpleName = splitted[1]; try { final BlockingInterface stub = getStub(); final TableIdentifierProto request = buildTableIdentifier(databaseName, simpleName); final ReturnState state = stub.dropTable(null, request); throwsIfThisError(state, UndefinedDatabaseException.class); throwsIfThisError(state, UndefinedTableException.class); throwsIfThisError(state, InsufficientPrivilegeException.class); ensureOk(state); } catch (ServiceException e) { throw new RuntimeException(e); } }
private void checkIndexExistence(final QueryContext queryContext, final CreateIndexNode createIndexNode) throws DuplicateIndexException { String databaseName, simpleIndexName, qualifiedIndexName; if (CatalogUtil.isFQTableName(createIndexNode.getIndexName())) { String[] splits = CatalogUtil.splitFQTableName(createIndexNode.getIndexName()); databaseName = splits[0]; simpleIndexName = splits[1]; qualifiedIndexName = createIndexNode.getIndexName(); } else { databaseName = queryContext.getCurrentDatabase(); simpleIndexName = createIndexNode.getIndexName(); qualifiedIndexName = CatalogUtil.buildFQName(databaseName, simpleIndexName); } if (catalog.existIndexByName(databaseName, simpleIndexName)) { throw new DuplicateIndexException(qualifiedIndexName); } }
@Override public void hook(QueryContext queryContext, LogicalPlan plan) throws Exception { LogicalRootNode rootNode = plan.getRootBlock().getRoot(); CreateTableNode createTableNode = rootNode.getChild(); String [] splitted = CatalogUtil.splitFQTableName(createTableNode.getTableName()); String databaseName = splitted[0]; String tableName = splitted[1]; queryContext.setOutputTable(tableName); // set the final output table uri queryContext.setOutputPath(createTableNode.getUri()); if(createTableNode.getPartitionMethod() != null) { queryContext.setPartitionMethod(createTableNode.getPartitionMethod()); } queryContext.setCreateTable(); } }
public void createIndex(final QueryContext queryContext, final CreateIndexNode createIndexNode) throws DuplicateIndexException, UndefinedTableException, UndefinedDatabaseException { String databaseName, simpleIndexName, qualifiedIndexName; if (CatalogUtil.isFQTableName(createIndexNode.getIndexName())) { String[] splits = CatalogUtil.splitFQTableName(createIndexNode.getIndexName()); databaseName = splits[0]; simpleIndexName = splits[1]; qualifiedIndexName = createIndexNode.getIndexName(); } else { databaseName = queryContext.getCurrentDatabase(); simpleIndexName = createIndexNode.getIndexName(); qualifiedIndexName = CatalogUtil.buildFQName(databaseName, simpleIndexName); } if (catalog.existIndexByName(databaseName, simpleIndexName)) { throw new DuplicateIndexException(simpleIndexName); } ScanNode scanNode = PlannerUtil.findTopNode(createIndexNode, NodeType.SCAN); if (scanNode == null) { throw new InternalError("Cannot find the table of the relation"); } IndexDesc indexDesc = new IndexDesc(databaseName, CatalogUtil.extractSimpleName(scanNode.getTableName()), simpleIndexName, createIndexNode.getIndexPath(), createIndexNode.getKeySortSpecs(), createIndexNode.getIndexMethod(), createIndexNode.isUnique(), false, scanNode.getLogicalSchema()); catalog.createIndex(indexDesc); LOG.info("Index " + qualifiedIndexName + " is created for the table " + scanNode.getTableName() + "."); }
@Override public void execute(QueryMaster.QueryMasterContext context, QueryContext queryContext, Query query, ExecutionBlockId finalExecBlockId, Path finalOutputDir) throws Exception { CatalogService catalog = context.getWorkerContext().getCatalog(); Stage lastStage = query.getStage(finalExecBlockId); CreateIndexNode createIndexNode = (CreateIndexNode) lastStage.getBlock().getPlan(); String databaseName, simpleIndexName, qualifiedIndexName; if (CatalogUtil.isFQTableName(createIndexNode.getIndexName())) { String [] splits = CatalogUtil.splitFQTableName(createIndexNode.getIndexName()); databaseName = splits[0]; simpleIndexName = splits[1]; qualifiedIndexName = createIndexNode.getIndexName(); } else { databaseName = queryContext.getCurrentDatabase(); simpleIndexName = createIndexNode.getIndexName(); qualifiedIndexName = CatalogUtil.buildFQName(databaseName, simpleIndexName); } ScanNode scanNode = PlannerUtil.findTopNode(createIndexNode, NodeType.SCAN); if (scanNode == null) { throw new IOException("Cannot find the table of the relation"); } IndexDesc indexDesc = new IndexDesc(databaseName, CatalogUtil.extractSimpleName(scanNode.getTableName()), simpleIndexName, createIndexNode.getIndexPath(), createIndexNode.getKeySortSpecs(), createIndexNode.getIndexMethod(), createIndexNode.isUnique(), false, scanNode.getLogicalSchema()); catalog.createIndex(indexDesc); LOG.info("Index " + qualifiedIndexName + " is created for the table " + scanNode.getTableName() + "."); } }
@Override public ReturnState existTable(RpcController controller, SessionedStringProto request) throws ServiceException { try { Session session = context.getSessionManager().getSession(request.getSessionId().getId()); String databaseName; String tableName; if (CatalogUtil.isFQTableName(request.getValue())) { String [] splitted = CatalogUtil.splitFQTableName(request.getValue()); databaseName = splitted[0]; tableName = splitted[1]; } else { databaseName = session.getCurrentDatabase(); tableName = request.getValue(); } if (catalog.existsTable(databaseName, tableName)) { return OK; } else { return errUndefinedTable(tableName); } } catch (Throwable t) { printStackTraceIfError(LOG, t); return returnError(t); } }
@Override public ReturnState existIndexWithColumns(RpcController controller, GetIndexWithColumnsRequest request) throws ServiceException { try { context.getSessionManager().touch(request.getSessionId().getId()); Session session = context.getSessionManager().getSession(request.getSessionId().getId()); String tableName, databaseName; if (CatalogUtil.isFQTableName(request.getTableName())) { String [] splitted = CatalogUtil.splitFQTableName(request.getTableName()); databaseName = splitted[0]; tableName = splitted[1]; } else { databaseName = session.getCurrentDatabase(); tableName = request.getTableName(); } String[] columnNames = new String[request.getColumnNamesCount()]; columnNames = request.getColumnNamesList().toArray(columnNames); if (catalog.existIndexByColumnNames(databaseName, tableName, columnNames)) { return OK; } else { return errUndefinedIndex(tableName, request.getColumnNamesList()); } } catch (Throwable t) { return returnError(t); } }
@Override public ReturnState dropIndex(RpcController controller, SessionedStringProto request) throws ServiceException { try { context.getSessionManager().touch(request.getSessionId().getId()); Session session = context.getSessionManager().getSession(request.getSessionId().getId()); QueryContext queryContext = new QueryContext(conf, session); String indexName, databaseName; if (CatalogUtil.isFQTableName(request.getValue())) { String [] splitted = CatalogUtil.splitFQTableName(request.getValue()); databaseName = splitted[0]; indexName = splitted[1]; } else { databaseName = session.getCurrentDatabase(); indexName = request.getValue(); } catalog.dropIndex(databaseName, indexName); return OK; } catch (Throwable t) { return returnError(t); } } }
@Override public ReturnState existIndexesForTable(RpcController controller, SessionedStringProto request) throws ServiceException { try { context.getSessionManager().touch(request.getSessionId().getId()); Session session = context.getSessionManager().getSession(request.getSessionId().getId()); String tableName, databaseName; if (CatalogUtil.isFQTableName(request.getValue())) { String [] splitted = CatalogUtil.splitFQTableName(request.getValue()); databaseName = splitted[0]; tableName = splitted[1]; } else { databaseName = session.getCurrentDatabase(); tableName = request.getValue(); } if (catalog.existIndexesByTable(databaseName, tableName)) { return OK; } else { return errUndefinedIndex(tableName); } } catch (Throwable t) { return returnError(t); } }
@Override public ReturnState existIndexWithName(RpcController controller, SessionedStringProto request) throws ServiceException { try { context.getSessionManager().touch(request.getSessionId().getId()); Session session = context.getSessionManager().getSession(request.getSessionId().getId()); String indexName, databaseName; if (CatalogUtil.isFQTableName(request.getValue())) { String [] splitted = CatalogUtil.splitFQTableName(request.getValue()); databaseName = splitted[0]; indexName = splitted[1]; } else { databaseName = session.getCurrentDatabase(); indexName = request.getValue(); } if (catalog.existIndexByName(databaseName, indexName)) { return OK; } else { return errUndefinedIndexName(indexName); } } catch (Throwable t) { return returnError(t); } }
@Override public PartitionListResponse getPartitionsByTableName(RpcController controller, SessionedStringProto request) throws ServiceException { try { Session session = context.getSessionManager().getSession(request.getSessionId().getId()); String databaseName; String tableName; if (CatalogUtil.isFQTableName(request.getValue())) { String [] splitted = CatalogUtil.splitFQTableName(request.getValue()); databaseName = splitted[0]; tableName = splitted[1]; } else { databaseName = session.getCurrentDatabase(); tableName = request.getValue(); } List<PartitionDescProto> partitions = catalog.getPartitions(databaseName, tableName); return PartitionListResponse.newBuilder() .setState(OK) .addAllPartition(partitions) .build(); } catch (Throwable t) { return PartitionListResponse.newBuilder() .setState(returnError(t)) .build(); } }
@Override public IndexResponse getIndexWithColumns(RpcController controller, GetIndexWithColumnsRequest request) throws ServiceException { try { context.getSessionManager().touch(request.getSessionId().getId()); Session session = context.getSessionManager().getSession(request.getSessionId().getId()); String tableName, databaseName; if (CatalogUtil.isFQTableName(request.getTableName())) { String [] splitted = CatalogUtil.splitFQTableName(request.getTableName()); databaseName = splitted[0]; tableName = splitted[1]; } else { databaseName = session.getCurrentDatabase(); tableName = request.getTableName(); } String[] columnNames = new String[request.getColumnNamesCount()]; columnNames = request.getColumnNamesList().toArray(columnNames); return IndexResponse.newBuilder() .setState(OK) .setIndexDesc(catalog.getIndexByColumnNames(databaseName, tableName, columnNames).getProto()) .build(); } catch (Throwable t) { return IndexResponse.newBuilder() .setState(returnError(t)) .build(); } }
@Override public IndexResponse getIndexWithName(RpcController controller, SessionedStringProto request) throws ServiceException { try { context.getSessionManager().touch(request.getSessionId().getId()); Session session = context.getSessionManager().getSession(request.getSessionId().getId()); String indexName, databaseName; if (CatalogUtil.isFQTableName(request.getValue())) { String [] splitted = CatalogUtil.splitFQTableName(request.getValue()); databaseName = splitted[0]; indexName = splitted[1]; } else { databaseName = session.getCurrentDatabase(); indexName = request.getValue(); } IndexDescProto indexProto = catalog.getIndexByName(databaseName, indexName).getProto(); return IndexResponse.newBuilder() .setState(OK) .setIndexDesc(indexProto) .build(); } catch (Throwable t) { return IndexResponse.newBuilder() .setState(returnError(t)) .build(); } }
@Override public IndexListResponse getIndexesForTable(RpcController controller, SessionedStringProto request) throws ServiceException { try { context.getSessionManager().touch(request.getSessionId().getId()); Session session = context.getSessionManager().getSession(request.getSessionId().getId()); String tableName, databaseName; if (CatalogUtil.isFQTableName(request.getValue())) { String [] splitted = CatalogUtil.splitFQTableName(request.getValue()); databaseName = splitted[0]; tableName = splitted[1]; } else { databaseName = session.getCurrentDatabase(); tableName = request.getValue(); } IndexListResponse.Builder builder = IndexListResponse.newBuilder().setState(OK); for (IndexDesc index : catalog.getAllIndexesByTable(databaseName, tableName)) { builder.addIndexDesc(index.getProto()); } return builder.build(); } catch (Throwable t) { return IndexListResponse.newBuilder() .setState(returnError(t)) .build(); } }