package com.thinkbiganalytics.util;
/*-
* #%L
* thinkbig-nifi-core-processors
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* Licensed 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.
* #L%
*/
import com.thinkbiganalytics.hive.util.HiveUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
*/
public class PartitionKey implements Cloneable {
private String alias;
private String key;
private String type;
private String formula;
public PartitionKey(String key, String type, String formula) {
Validate.notEmpty(key);
Validate.notEmpty(type);
Validate.notEmpty(formula);
this.key = key.trim().toLowerCase();
this.type = type.trim().toLowerCase();
this.formula = formula.trim().toLowerCase();
}
public static PartitionKey createFromString(String value) {
if (StringUtils.isEmpty(value)) {
return null;
}
String[] values = value.split("\\|");
if (values.length != 3) {
throw new RuntimeException("Expecting format field|type|formula got " + value);
}
return new PartitionKey(values[0], values[1], values[2]);
}
public static PartitionKey[] partitionKeysForTableAlias(PartitionKey[] keys, String alias) {
List<PartitionKey> partitionKeys = new ArrayList<>();
Arrays.stream(keys).forEach(key -> {
try {
PartitionKey clonedKey = (PartitionKey) key.clone();
clonedKey.setAlias(alias);
partitionKeys.add(clonedKey);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
});
return partitionKeys.toArray(new PartitionKey[0]);
}
public String getKey() {
return key;
}
public String getKeyForSql() {
return HiveUtils.quoteIdentifier(key);
}
public String getKeyWithAlias() {
return toAliasSQL() + getKeyForSql();
}
public String getFormula() {
return formula.indexOf('(') > -1 ? formula : HiveUtils.quoteIdentifier(key);
}
public String getFormulaWithAlias() {
surroundFormulaColumnWithTick();
if (alias != null) {
int idx = formula.indexOf("(");
if (idx > -1) {
StringBuffer sb = new StringBuffer(formula);
sb.insert(idx + 1, alias + ".");
return sb.toString();
}
return getKeyWithAlias();
}
return getFormula();
}
/**
* if column in formula has a space, surround it with a tick mark
*/
private void surroundFormulaColumnWithTick() {
int idx = formula.indexOf("(");
String column = StringUtils.substringBetween(formula, "(", ")");
if (StringUtils.isNotBlank(column) && column.charAt(0) != '`') {
column = HiveUtils.quoteIdentifier(column);
StringBuffer sb = new StringBuffer();
sb.append(StringUtils.substringBefore(formula, "(")).append("(").append(column).append(")");
formula = sb.toString();
}
}
/**
* Generates the where statement against the source table using the provided value
*/
public String toSourceSQLWhere(String value) {
if ("string".equalsIgnoreCase(type)) {
return formula + "='" + value + "'";
} else {
return formula + "=" + value;
}
}
/**
* Generates the where statement against the target table using the provided value
*/
public String toTargetSQLWhere(String value) {
return toPartitionNameValue(value);
}
private String toAliasSQL() {
return (alias != null ? alias + "." : "");
}
/**
* Generates the partition specification portion using the value
*/
public String toPartitionNameValue(String value) {
if ("string".equalsIgnoreCase(type)) {
return toAliasSQL() + getKeyForSql() + "='" + value + "'";
} else {
return toAliasSQL() + getKeyForSql() + "=" + value;
}
}
public String getAlias() {
return alias;
}
private void setAlias(String alias) {
this.alias = alias;
}
}