package com.thinkbiganalytics.hive.util;
/*-
* #%L
* thinkbig-commons-hive
* %%
* 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 org.apache.commons.lang3.StringEscapeUtils;
import java.io.IOException;
import java.io.StringWriter;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
* Utility methods for interacting with Hive.
*/
public class HiveUtils {
/**
* Instances of {@code HiveUtils} should not be constructed.
*
* @throws UnsupportedOperationException always
*/
private HiveUtils() {
throw new UnsupportedOperationException();
}
/**
* Quotes the specified Hive identifier.
*
* @param identifier the Hive identifier to be quoted
* @return the quoted Hive identifier
*/
@Nonnull
public static String quoteIdentifier(@Nonnull final String identifier) {
return "`" + identifier.replaceAll("`", "``") + "`";
}
/**
* Quotes the specified Hive identifiers. This method is commonly used to reference a specific table in a specific database.
*
* <p>If the first argument is not {@code null}, then the result will be in the format: `first`.`second`. Otherwise, the
* format is the same as {@link #quoteIdentifier(String) quoteIdentifier(second)}</p>
*
* @param first the first identifier, name of the database, or {@code null}
* @param second the second identifier or name of the table
* @return the string containing the quoted Hive identifiers
*/
@Nonnull
public static String quoteIdentifier(@Nullable final String first, @Nonnull final String second) {
if (first != null) {
return quoteIdentifier(first) + "." + quoteIdentifier(second);
} else {
return quoteIdentifier(second);
}
}
/**
* Quotes the specified string for use in a Hive query.
*
* @param string the string to be quoted
* @return the quoted string
*/
@Nonnull
public static String quoteString(@Nonnull final String string) {
try {
final StringWriter writer = new StringWriter(string.length() + 2);
writer.append('"');
StringEscapeUtils.ESCAPE_JAVA.translate(string, writer);
writer.append('"');
return writer.toString();
} catch (final IOException e) {
throw new IllegalArgumentException("String contains invalid characters: " + string, e);
}
}
}