blob: f37a3802d4a44975f161764f94a83a29df2de74c [file] [log] [blame]
/**
* 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.lens.cli.commands;
import java.io.File;
import java.util.List;
import org.apache.lens.api.APIResult;
import org.apache.lens.api.metastore.XDimensionTable;
import org.apache.lens.api.metastore.XPartition;
import org.apache.lens.api.metastore.XStorageTableElement;
import org.apache.lens.cli.commands.annotations.UserDocumentation;
import org.springframework.shell.core.CommandMarker;
import org.springframework.shell.core.annotation.CliCommand;
import org.springframework.shell.core.annotation.CliOption;
import org.springframework.stereotype.Component;
import lombok.NonNull;
/**
* The Class LensDimensionTableCommands.
*/
@Component
@UserDocumentation(title = "Commands for Dimension Tables Management",
description = "These commands provide CRUD for dimension tables, associated storages, and fact partitions")
public class LensDimensionTableCommands extends LogicalTableCrudCommand<XDimensionTable>
implements CommandMarker {
/**
* Show dimension tables.
*
* @return the string
*/
@CliCommand(value = "show dimtables",
help = "display list of dimtables in current database. If optional <dimension_name> is supplied,"
+ " only facts belonging to dimension <dimension_name> will be displayed")
public String showDimensionTables(
@CliOption(key = {"", "dimension_name"}, mandatory = false, help = "<dimension_name>") String dimensionName) {
return showAll(dimensionName);
}
/**
* Creates the dimension table.
*
* @param path Path to dim spec
* @return the string
*/
@CliCommand(value = "create dimtable",
help = "Create a new dimension table taking spec from <path-to-dimtable-spec-file>")
public String createDimensionTable(
@CliOption(key = {"", "path"}, mandatory = true, help = "<path-to-dimtable-spec-file>") @NonNull final File path) {
return create(path, false);
}
/**
* Describe dimension table.
*
* @param name the dim
* @return the string
*/
@CliCommand(value = "describe dimtable", help = "describe dimtable <dimtable_name>")
public String describeDimensionTable(
@CliOption(key = {"", "dimtable_name"}, mandatory = true, help = "<dimtable_name>") String name) {
return describe(name);
}
/**
* Update dimension table.
*
* @param name the dimtable name
* @param path the path to spec file
* @return the string
*/
@CliCommand(value = "update dimtable",
help = "update dimtable <dimtable_name> taking spec from <path-to-dimtable-spec>")
public String updateDimensionTable(
@CliOption(key = {"", "dimtable_name"}, mandatory = true, help = "<dimtable_name>") String name,
@CliOption(key = {"", "path"}, mandatory = true, help = "<path-to-dimtable-spec>") @NonNull final File path) {
return update(name, path);
}
/**
* Drop dimension table.
*
* @param name the dim
* @param cascade the cascade
* @return the string
*/
@CliCommand(value = "drop dimtable",
help = "drop dimtable <dimtable_name>. "
+ " If <cascade> is true, all the storage tables associated with the dimtable <dimtable_name> are also dropped."
+ " By default <cascade> is false")
public String dropDimensionTable(
@CliOption(key = {"", "dimtable_name"}, mandatory = true, help = "<dimtable_name>") String name,
@CliOption(key = {"cascade"}, mandatory = false, specifiedDefaultValue = "true", unspecifiedDefaultValue = "false",
help = "<cascade>")
boolean cascade) {
return drop(name, cascade);
}
/**
* Gets the dim storages.
*
* @param table the dim
* @return the dim storages
*/
@CliCommand(value = "dimtable list storages", help = "display list of storage associated to dimtable <dimtable_name>")
public String getDimStorages(
@CliOption(key = {"", "dimtable_name"}, mandatory = true, help = "<dimtable_name>") String table) {
return showAllStorages(table);
}
/**
* Adds the new dim storage.
*
* @param tableName dimtable name
* @param path path to storage spec
* @return the string
*/
@CliCommand(value = "dimtable add storage",
help = "adds a new storage to dimtable <dimtable_name>, taking storage spec from <path-to-storage-spec>")
public String addNewDimStorage(
@CliOption(key = {"", "dimtable_name"}, mandatory = true, help = "<dimtable_name>") String tableName,
@CliOption(key = {"", "path"}, mandatory = true, help = "<path-to-storage-spec>") @NonNull final File path) {
return addStorage(tableName, path);
}
/**
* Gets the storage from dim.
*
* @param tableName dimtable name
* @return path storage spec path
*/
@CliCommand(value = "dimtable get storage", help = "describe storage <storage_name> of dimtable <dimtable_name>")
public String getStorageFromDim(
@CliOption(key = {"", "dimtable_name"}, mandatory = true, help = "<dimtable_name>") String tableName,
@CliOption(key = {"", "storage_name"}, mandatory = true, help = "<storage_name>") String storage) {
return getStorage(tableName, storage);
}
/**
* Drop storage from dim.
*
* @param tableName dimtable name
* @param storageName storage name
* @return the string
*/
@CliCommand(value = "dimtable drop storage", help = "drop storage <storage_name> from dimtable <dimtable_name>")
public String dropStorageFromDim(
@CliOption(key = {"", "dimtable_name"}, mandatory = true, help = "<dimtable_name>") String tableName,
@CliOption(key = {"", "storage_name"}, mandatory = true, help = "<storage_name>") String storageName) {
return dropStorage(tableName, storageName);
}
/**
* Drop all dim storages.
*
* @param tableName the table
* @return the string
*/
@CliCommand(value = "dimtable drop all storages", help = "drop all storages associated to dimension table")
public String dropAllDimStorages(
@CliOption(key = {"", "dimtable_name"}, mandatory = true, help = "<dimtable_name>") String tableName) {
return dropAllStorages(tableName);
}
/**
* Gets the all partitions of dim.
*
* @param tableName dimtable name
* @param storageName storage name
* @param filter partition filter
* @return the all partitions of dim
*/
@CliCommand(value = "dimtable list partitions",
help = "get all partitions associated with dimtable <dimtable_name>, "
+ "storage <storage_name> filtered by <partition-filter>")
public String getAllPartitionsOfDimtable(
@CliOption(key = {"", "dimtable_name"}, mandatory = true, help = "<dimtable_name>") String tableName,
@CliOption(key = {"", "storage_name"}, mandatory = true, help = "<storage_name>") String storageName,
@CliOption(key = {"", "filter"}, mandatory = false, help = "<partition-filter>") String filter) {
return getAllPartitions(tableName, storageName, filter);
}
/**
* Drop all partitions of dim.
*
* @param tableName dimtable name
* @param storageName storage name
* @param filter partition query filter
* @return the string
*/
@CliCommand(value = "dimtable drop partitions",
help = "drop all partitions associated with dimtable "
+ "<dimtable_name>, storage <storage_name> filtered by <partition-filter>")
public String dropAllPartitionsOfDim(
@CliOption(key = {"", "dimtable_name"}, mandatory = true, help = "<dimtable_name>") String tableName,
@CliOption(key = {"", "storage_name"}, mandatory = true, help = "<storage_name>") String storageName,
@CliOption(key = {"", "filter"}, mandatory = false, help = "<partition-filter>") String filter) {
return dropPartitions(tableName, storageName, filter);
}
/**
* Adds the partition to dim table.
*
* @param tableName dimtable name
* @param storageName storage name
* @param path partition spec path
* @return the string
*/
@CliCommand(value = "dimtable add single-partition",
help = "add single partition to dimtable <dimtable_name>'s"
+ " storage <storage_name>, reading spec from <partition-spec-path>")
public String addPartitionToDimtable(
@CliOption(key = {"", "dimtable_name"}, mandatory = true, help = "<dimtable_name>") String tableName,
@CliOption(key = {"", "storage_name"}, mandatory = true, help = "<storage_name>") String storageName,
@CliOption(key = {"", "path"}, mandatory = true, help = "<partition-spec-path>") @NonNull final File path) {
return addPartition(tableName, storageName, path);
}
@CliCommand(value = "dimtable update single-partition",
help = "update single partition to dimtable <dimtable_name>'s"
+ " storage <storage_name>, reading spec from <partition-spec-path>"
+ " The partition has to exist to be eligible for updation.")
public String updatePartitionOfDimtable(
@CliOption(key = {"", "dimtable_name"}, mandatory = true, help = "<dimtable_name>") String tableName,
@CliOption(key = {"", "storage_name"}, mandatory = true, help = "<storage_name>") String storageName,
@CliOption(key = {"", "path"}, mandatory = true, help = "<partition-spec-path>") @NonNull final File path) {
return updatePartition(tableName, storageName, path);
}
/**
* Adds the partitions to dim table.
*
* @param tableName dimtable name
* @param storageName storage name
* @param path partition spec path
* @return the string
*/
@CliCommand(value = "dimtable add partitions",
help = "add multiple partition to dimtable <dimtable_name>'s"
+ " storage <storage_name>, reading partition list spec from <partition-list-spec-path>")
public String addPartitionsToDimtable(
@CliOption(key = {"", "dimtable_name"}, mandatory = true, help = "<dimtable_name>") String tableName,
@CliOption(key = {"", "storage_name"}, mandatory = true, help = "<storage_name>") String storageName,
@CliOption(key = {"", "path"}, mandatory = true, help = "<partition-list-spec-path>") @NonNull final File path) {
return addPartitions(tableName, storageName, path.getPath());
}
@CliCommand(value = "dimtable update partitions",
help = "update multiple partition to dimtable <dimtable_name>'s"
+ " storage <storage_name>, reading partition list spec from <partition-list-spec-path>"
+" The partitions have to exist to be eligible for updation.")
public String updatePartitionsOfDimtable(
@CliOption(key = {"", "dimtable_name"}, mandatory = true, help = "<dimtable_name>") String tableName,
@CliOption(key = {"", "storage_name"}, mandatory = true, help = "<storage_name>") String storageName,
@CliOption(key = {"", "path"}, mandatory = true, help = "<partition-list-spec-path>") String path) {
return updatePartitions(tableName, storageName, path);
}
@Override
protected XStorageTableElement readStorage(String tableName, String storage) {
return getClient().getStorageFromDim(tableName, storage);
}
@Override
public APIResult doDropStorage(String tableName, String storageName) {
return getClient().dropStorageFromDim(tableName, storageName);
}
@Override
public List<String> getAllStorages(String name) {
return getClient().getDimStorages(name);
}
@Override
public APIResult doAddStorage(String name, String path) {
return getClient().addStorageToDim(name, path);
}
@Override
public APIResult doDropAllStorages(String name) {
return getClient().dropAllStoragesOfDim(name);
}
@Override
protected List<XPartition> readAllPartitions(String tableName, String storageName, String filter) {
return getClient().getAllPartitionsOfDim(tableName, storageName, filter);
}
@Override
protected APIResult doAddPartition(String tableName, String storageName, String path) {
return getClient().addPartitionToDim(tableName, storageName, path);
}
@Override
protected APIResult doAddPartitions(String tableName, String storageName, String path) {
return getClient().addPartitionsToDim(tableName, storageName, path);
}
@Override
protected APIResult doDropPartitions(String tableName, String storageName, String filter) {
return getClient().dropAllPartitionsOfDim(tableName, storageName, filter);
}
@Override
protected APIResult doDropPartitions(String tableName, String storageName, String filter, String updatePeriod) {
return getClient().dropAllPartitionsOfDim(tableName, storageName, filter);
}
@Override
protected APIResult doUpdatePartition(String tableName, String storageName, String validPath) {
return getClient().updatePartitionOfDim(tableName, storageName, validPath);
}
@Override
protected APIResult doUpdatePartitions(String tableName, String storageName, String validPath) {
return getClient().updatePartitionsOfDim(tableName, storageName, validPath);
}
@Override
public List<String> getAll() {
return getClient().getAllDimensionTables();
}
@Override
public List<String> getAll(String dimesionName) {
return getClient().getAllDimensionTables(dimesionName);
}
@Override
protected APIResult doCreate(String path, boolean ignoreIfExists) {
return getClient().createDimensionTable(path);
}
@Override
protected XDimensionTable doRead(String name) {
return getClient().getDimensionTable(name);
}
@Override
public APIResult doUpdate(String name, String path) {
return getClient().updateDimensionTable(name, path);
}
@Override
protected APIResult doDelete(String name, boolean cascade) {
return getClient().dropDimensionTable(name, cascade);
}
}