PHOENIX-5552 Hive against Phoenix gets "Expecting "RPAREN", got "L" in Tez mode"
diff --git a/phoenix-hive/src/main/java/org/apache/phoenix/hive/constants/PhoenixStorageHandlerConstants.java b/phoenix-hive/src/main/java/org/apache/phoenix/hive/constants/PhoenixStorageHandlerConstants.java
index e3c7d84..2c3c602 100644
--- a/phoenix-hive/src/main/java/org/apache/phoenix/hive/constants/PhoenixStorageHandlerConstants.java
+++ b/phoenix-hive/src/main/java/org/apache/phoenix/hive/constants/PhoenixStorageHandlerConstants.java
@@ -17,10 +17,6 @@
*/
package org.apache.phoenix.hive.constants;
-import com.google.common.collect.Lists;
-import org.apache.hadoop.io.IntWritable;
-
-import java.util.List;
/**
* Constants using for Hive Storage Handler implementation
@@ -31,9 +27,6 @@
public static final String PHOENIX_TABLE_NAME = "phoenix.table.name";
- public static final String DEFAULT_PHOENIX_INPUT_CLASS = "org.apache.phoenix.hive.mapreduce" +
- ".PhoenixResultWritable";
-
public static final String ZOOKEEPER_QUORUM = "phoenix.zookeeper.quorum";
public static final String ZOOKEEPER_PORT = "phoenix.zookeeper.client.port";
public static final String ZOOKEEPER_PARENT = "phoenix.zookeeper.znode.parent";
@@ -54,10 +47,6 @@
public static final String COLON = ":";
public static final String COMMA = ",";
public static final String EMPTY_STRING = "";
- public static final String SPACE = " ";
- public static final String LEFT_ROUND_BRACKET = "(";
- public static final String RIGHT_ROUND_BRACKET = ")";
- public static final String QUOTATION_MARK = "'";
public static final String EQUAL = "=";
public static final String IS = "is";
public static final String QUESTION = "?";
@@ -73,36 +62,4 @@
public static final String IN_OUT_WORK = "in.out.work";
public static final String IN_WORK = "input";
public static final String OUT_WORK = "output";
-
- public static final String MR = "mr";
- public static final String TEZ = "tez";
- public static final String SPARK = "spark";
-
- public static final String DATE_TYPE = "date";
- public static final String TIMESTAMP_TYPE = "timestamp";
- public static final String BETWEEN_COMPARATOR = "between";
- public static final String IN_COMPARATOR = "in";
- public static final List<String> COMMON_COMPARATOR = Lists.newArrayList("=", "<", ">", "<=",
- ">=");
-
- // date/timestamp
- public static final String COLUMNE_MARKER = "$columnName$";
- public static final String PATERN_MARKER = "$targetPattern$";
- public static final String DATE_PATTERN = "'?\\d{4}-\\d{2}-\\d{2}'?";
- public static final String TIMESTAMP_PATTERN = "'?\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\" +
- ".?\\d{0,9}'?";
- public static final String COMMON_OPERATOR_PATTERN = "(\\(?\"?" + COLUMNE_MARKER + "\"?\\)?\\s*" +
- "(=|>|<|<=|>=)\\s*(" + PATERN_MARKER + "))";
- public static final String BETWEEN_OPERATOR_PATTERN = "(\\(?\"?" + COLUMNE_MARKER + "\"?\\)?\\s*(" +
- "(?i)not)?\\s*(?i)between\\s*(" + PATERN_MARKER + ")\\s*(?i)and\\s*(" + PATERN_MARKER
- + "))";
- public static final String IN_OPERATOR_PATTERN = "(\\(?\"?" + COLUMNE_MARKER + "\"?\\)?\\s*((?i)" +
- "not)?\\s*(?i)in\\s*\\((" + PATERN_MARKER + ",?\\s*)+\\))";
-
- public static final String FUNCTION_VALUE_MARKER = "$value$";
- public static final String DATE_FUNCTION_TEMPLETE = "to_date(" + FUNCTION_VALUE_MARKER + ")";
- public static final String TIMESTAMP_FUNCTION_TEMPLATE = "to_timestamp(" +
- FUNCTION_VALUE_MARKER + ")";
-
- public static final IntWritable INT_ZERO = new IntWritable(0);
}
diff --git a/phoenix-hive/src/main/java/org/apache/phoenix/hive/mapreduce/PhoenixInputFormat.java b/phoenix-hive/src/main/java/org/apache/phoenix/hive/mapreduce/PhoenixInputFormat.java
index b550e32..6e8e8ec 100644
--- a/phoenix-hive/src/main/java/org/apache/phoenix/hive/mapreduce/PhoenixInputFormat.java
+++ b/phoenix-hive/src/main/java/org/apache/phoenix/hive/mapreduce/PhoenixInputFormat.java
@@ -24,7 +24,6 @@
import java.sql.Statement;
import java.util.Arrays;
import java.util.List;
-import java.util.Map;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -44,7 +43,6 @@
import org.apache.hadoop.hive.ql.plan.ExprNodeGenericFuncDesc;
import org.apache.hadoop.hive.ql.plan.TableScanDesc;
import org.apache.hadoop.hive.serde.serdeConstants;
-import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
import org.apache.hadoop.hive.shims.ShimLoader;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.mapred.InputFormat;
@@ -98,36 +96,23 @@
executionEngine);
}
- if (PhoenixStorageHandlerConstants.MR.equals(executionEngine)) {
- List<IndexSearchCondition> conditionList = null;
- String filterExprSerialized = jobConf.get(TableScanDesc.FILTER_EXPR_CONF_STR);
- if (filterExprSerialized != null) {
- ExprNodeGenericFuncDesc filterExpr =
- Utilities.deserializeExpression(filterExprSerialized);
- PhoenixPredicateDecomposer predicateDecomposer =
- PhoenixPredicateDecomposer.create(Arrays.asList(jobConf.get(serdeConstants.LIST_COLUMNS).split(",")));
- predicateDecomposer.decomposePredicate(filterExpr);
- if (predicateDecomposer.isCalledPPD()) {
- conditionList = predicateDecomposer.getSearchConditionList();
- }
+ List<IndexSearchCondition> conditionList = null;
+ String filterExprSerialized = jobConf.get(TableScanDesc.FILTER_EXPR_CONF_STR);
+ if (filterExprSerialized != null) {
+ ExprNodeGenericFuncDesc filterExpr =
+ Utilities.deserializeExpression(filterExprSerialized);
+ PhoenixPredicateDecomposer predicateDecomposer =
+ PhoenixPredicateDecomposer
+ .create(Arrays.asList(jobConf.get(serdeConstants.LIST_COLUMNS).split(",")));
+ predicateDecomposer.decomposePredicate(filterExpr);
+ if (predicateDecomposer.isCalledPPD()) {
+ conditionList = predicateDecomposer.getSearchConditionList();
}
-
- query = PhoenixQueryBuilder.getInstance().buildQuery(jobConf, tableName,
- PhoenixStorageHandlerUtil.getReadColumnNames(jobConf), conditionList);
- } else if (PhoenixStorageHandlerConstants.TEZ.equals(executionEngine)) {
- Map<String, TypeInfo> columnTypeMap =
- PhoenixStorageHandlerUtil.createColumnTypeMap(jobConf);
- if (LOG.isDebugEnabled()) {
- LOG.debug("Column type map for TEZ : " + columnTypeMap);
- }
-
- String whereClause = jobConf.get(TableScanDesc.FILTER_TEXT_CONF_STR);
- query = PhoenixQueryBuilder.getInstance().buildQuery(jobConf, tableName,
- PhoenixStorageHandlerUtil.getReadColumnNames(jobConf), whereClause, columnTypeMap);
- } else {
- throw new IOException(executionEngine + " execution engine unsupported yet.");
}
+ query = PhoenixQueryBuilder.getInstance().buildQuery(jobConf, tableName,
+ PhoenixStorageHandlerUtil.getReadColumnNames(jobConf), conditionList);
+
final QueryPlan queryPlan = getQueryPlan(jobConf, query);
final List<KeyRange> allSplits = queryPlan.getSplits();
final List<InputSplit> splits = generateSplits(jobConf, queryPlan, allSplits, query);
diff --git a/phoenix-hive/src/main/java/org/apache/phoenix/hive/query/PhoenixQueryBuilder.java b/phoenix-hive/src/main/java/org/apache/phoenix/hive/query/PhoenixQueryBuilder.java
index ab409ad..0cd9d0a 100644
--- a/phoenix-hive/src/main/java/org/apache/phoenix/hive/query/PhoenixQueryBuilder.java
+++ b/phoenix-hive/src/main/java/org/apache/phoenix/hive/query/PhoenixQueryBuilder.java
@@ -17,11 +17,9 @@
*/
package org.apache.phoenix.hive.query;
-import com.google.common.base.CharMatcher;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Predicate;
-import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import java.io.IOException;
@@ -30,15 +28,11 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
import javax.annotation.Nullable;
-import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.hive.ql.plan.ExprNodeConstantDesc;
import org.apache.hadoop.hive.serde.serdeConstants;
-import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
import org.apache.hadoop.mapred.JobConf;
import org.apache.phoenix.hive.constants.PhoenixStorageHandlerConstants;
import org.apache.phoenix.hive.ql.index.IndexSearchCondition;
@@ -89,31 +83,6 @@
}
}
- private String makeQueryString(JobConf jobConf, String tableName, List<String>
- readColumnList, String whereClause, String queryTemplate, String hints, Map<String,
- TypeInfo> columnTypeMap) throws IOException {
- StringBuilder sql = new StringBuilder();
- List<String> conditionColumnList = buildWhereClause(jobConf, sql, whereClause, columnTypeMap);
- readColumnList = replaceColumns(jobConf, readColumnList);
-
- if (conditionColumnList.size() > 0) {
- addConditionColumnToReadColumn(readColumnList, conditionColumnList);
- sql.insert(0, queryTemplate.replace("$HINT$", hints).replace("$COLUMN_LIST$",
- getSelectColumns(jobConf, tableName, readColumnList)).replace("$TABLE_NAME$",
- tableName));
- } else {
- sql.append(queryTemplate.replace("$HINT$", hints).replace("$COLUMN_LIST$",
- getSelectColumns(jobConf, tableName, readColumnList)).replace("$TABLE_NAME$",
- tableName));
- }
-
- if (LOG.isInfoEnabled()) {
- LOG.info("Input query : " + sql.toString());
- }
-
- return sql.toString();
- }
-
private static String findReplacement(JobConf jobConf, String column) {
Map<String, String> columnMappingMap = getColumnMappingMap(jobConf.get
(PhoenixStorageHandlerConstants.PHOENIX_COLUMN_MAPPING));
@@ -191,20 +160,6 @@
}
public String buildQuery(JobConf jobConf, String tableName, List<String> readColumnList,
- String whereClause, Map<String, TypeInfo> columnTypeMap) throws
- IOException {
- String hints = getHint(jobConf, tableName);
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("Building query with columns : " + readColumnList + " table name : " +
- tableName + " with where conditions : " + whereClause + " hints : " + hints);
- }
-
- return makeQueryString(jobConf, tableName, Lists.newArrayList(readColumnList),
- whereClause, QUERY_TEMPLATE, hints, columnTypeMap);
- }
-
- public String buildQuery(JobConf jobConf, String tableName, List<String> readColumnList,
List<IndexSearchCondition> searchConditions) throws IOException {
String hints = getHint(jobConf, tableName);
@@ -234,422 +189,6 @@
return hints.toString();
}
- private List<String> buildWhereClause(JobConf jobConf, StringBuilder sql, String whereClause,
- Map<String, TypeInfo> columnTypeMap) throws IOException {
- if (whereClause == null || whereClause.isEmpty()) {
- return Collections.emptyList();
- }
-
- List<String> conditionColumnList = Lists.newArrayList();
- sql.append(" where ");
-
- whereClause = StringUtils.replaceEach(whereClause, new String[]{"UDFToString"}, new
- String[]{"to_char"});
-
- for (String columnName : columnTypeMap.keySet()) {
- if (whereClause.contains(columnName)) {
- String column = findReplacement(jobConf, columnName);
- whereClause = whereClause.replaceAll("\\b" + columnName + "\\b", "\"" + column + "\"");
- conditionColumnList.add(column);
-
-
- if (PhoenixStorageHandlerConstants.DATE_TYPE.equals(
- columnTypeMap.get(columnName).getTypeName())) {
- whereClause = applyDateFunctionUsingRegex(whereClause, column);
- } else if (PhoenixStorageHandlerConstants.TIMESTAMP_TYPE.equals(
- columnTypeMap.get(columnName).getTypeName())) {
- whereClause = applyTimestampFunctionUsingRegex(whereClause, column);
- }
- }
- }
-
- sql.append(whereClause);
-
- return conditionColumnList;
- }
-
- private String applyDateFunctionUsingRegex(String whereClause, String columnName) {
- whereClause = applyFunctionForCommonOperator(whereClause, columnName, true);
- whereClause = applyFunctionForBetweenOperator(whereClause, columnName, true);
- whereClause = applyFunctionForInOperator(whereClause, columnName, true);
-
- return whereClause;
- }
-
- private String applyTimestampFunctionUsingRegex(String whereClause, String columnName) {
- whereClause = applyFunctionForCommonOperator(whereClause, columnName, false);
- whereClause = applyFunctionForBetweenOperator(whereClause, columnName, false);
- whereClause = applyFunctionForInOperator(whereClause, columnName, false);
-
- return whereClause;
- }
-
- private String applyFunctionForCommonOperator(String whereClause, String columnName, boolean
- isDate) {
- String targetPattern = isDate ? PhoenixStorageHandlerConstants.DATE_PATTERN :
- PhoenixStorageHandlerConstants.TIMESTAMP_PATTERN;
- String pattern = StringUtils.replaceEach(PhoenixStorageHandlerConstants
- .COMMON_OPERATOR_PATTERN,
- new String[]{PhoenixStorageHandlerConstants.COLUMNE_MARKER,
- PhoenixStorageHandlerConstants.PATERN_MARKER}, new String[]{columnName,
- targetPattern});
-
- Matcher matcher = Pattern.compile(pattern).matcher(whereClause);
-
- while (matcher.find()) {
- String token = matcher.group(1);
- String datePart = matcher.group(3);
-
- String convertString = token.replace(datePart, applyFunction(isDate ?
- PhoenixStorageHandlerConstants.DATE_FUNCTION_TEMPLETE :
- PhoenixStorageHandlerConstants.TIMESTAMP_FUNCTION_TEMPLATE, datePart));
- whereClause = whereClause.replaceAll(StringUtils.replaceEach(token, new String[]{"(",
- ")"}, new String[]{"\\(", "\\)"}), convertString);
- }
-
- return whereClause;
- }
-
- private String applyFunctionForBetweenOperator(String whereClause, String columnName, boolean
- isDate) {
- String targetPattern = isDate ? PhoenixStorageHandlerConstants.DATE_PATTERN :
- PhoenixStorageHandlerConstants.TIMESTAMP_PATTERN;
- String pattern = StringUtils.replaceEach(PhoenixStorageHandlerConstants
- .BETWEEN_OPERATOR_PATTERN,
- new String[]{PhoenixStorageHandlerConstants.COLUMNE_MARKER,
- PhoenixStorageHandlerConstants.PATERN_MARKER}, new String[]{columnName,
- targetPattern});
-
- Matcher matcher = Pattern.compile(pattern).matcher(whereClause);
-
- while (matcher.find()) {
- String token = matcher.group(1);
- boolean isNot = matcher.group(2) == null ? false : true;
- String fromDate = matcher.group(3);
- String toDate = matcher.group(4);
-
- String convertString = StringUtils.replaceEach(token, new String[]{fromDate, toDate},
- new String[]{applyFunction(isDate ? PhoenixStorageHandlerConstants
- .DATE_FUNCTION_TEMPLETE : PhoenixStorageHandlerConstants
- .TIMESTAMP_FUNCTION_TEMPLATE, fromDate),
- applyFunction(isDate ? PhoenixStorageHandlerConstants
- .DATE_FUNCTION_TEMPLETE : PhoenixStorageHandlerConstants
- .TIMESTAMP_FUNCTION_TEMPLATE, toDate)});
-
- whereClause = whereClause.replaceAll(pattern, convertString);
- }
-
- return whereClause;
- }
-
- private String applyFunctionForInOperator(String whereClause, String columnName, boolean
- isDate) {
- String targetPattern = isDate ? PhoenixStorageHandlerConstants.DATE_PATTERN :
- PhoenixStorageHandlerConstants.TIMESTAMP_PATTERN;
- String pattern = StringUtils.replaceEach(PhoenixStorageHandlerConstants.IN_OPERATOR_PATTERN,
- new String[]{PhoenixStorageHandlerConstants.COLUMNE_MARKER,
- PhoenixStorageHandlerConstants.PATERN_MARKER}, new String[]{columnName,
- targetPattern});
- String itemPattern = "(" + targetPattern + ")";
-
- Matcher matcher = Pattern.compile(pattern).matcher(whereClause);
-
- while (matcher.find()) {
- String token = matcher.group(1);
- Matcher itemMatcher = Pattern.compile(itemPattern).matcher(token);
- while (itemMatcher.find()) {
- String item = itemMatcher.group(1);
-
- token = token.replace(item, applyFunction(isDate ? PhoenixStorageHandlerConstants
- .DATE_FUNCTION_TEMPLETE : PhoenixStorageHandlerConstants
- .TIMESTAMP_FUNCTION_TEMPLATE, item));
- }
-
- whereClause = whereClause.replaceAll(pattern, token);
- }
-
- return whereClause;
- }
-
- /**
- * replace value to specific part of pattern.
- * if pattern is to_date($value$) and value is '2016-01-15'. then return to_date('2016-01-15').
- * if pattern is cast($value$ as date) and value is '2016-01-15'. then return cast
- * ('2016-01-15' as date).
- */
- private String applyFunction(String pattern, String value) {
- if (!value.startsWith(PhoenixStorageHandlerConstants.QUOTATION_MARK)) {
- value = PhoenixStorageHandlerConstants.QUOTATION_MARK + value +
- PhoenixStorageHandlerConstants.QUOTATION_MARK;
- }
-
- return pattern.replace(PhoenixStorageHandlerConstants.FUNCTION_VALUE_MARKER, value);
- }
-
- private String getCompareValueForDateAndTimestampFunction(String compareValue) {
- if (compareValue.startsWith(PhoenixStorageHandlerConstants.QUOTATION_MARK)) {
- return compareValue;
- } else {
- return PhoenixStorageHandlerConstants.QUOTATION_MARK + compareValue +
- PhoenixStorageHandlerConstants.QUOTATION_MARK;
- }
- }
-
- private String applyDateFunction(String whereClause, String columnName) {
- StringBuilder whereCondition = new StringBuilder();
- for (Iterator<String> iterator = Splitter.on(CharMatcher.WHITESPACE).omitEmptyStrings()
- .split(whereClause).iterator(); iterator.hasNext(); whereCondition.append
- (PhoenixStorageHandlerConstants.SPACE)) {
- String token = iterator.next();
- if (isMyCondition(columnName, token)) {
- whereCondition.append(token);
-
- String comparator = iterator.next();
- whereCondition.append(PhoenixStorageHandlerConstants.SPACE);
- whereCondition.append(comparator).append(PhoenixStorageHandlerConstants.SPACE);
- if (PhoenixStorageHandlerConstants.BETWEEN_COMPARATOR.equalsIgnoreCase
- (comparator)) {
- whereCondition.append("to_date(").append
- (getCompareValueForDateAndTimestampFunction(iterator.next())).append
- (") ").append(iterator.next()).append(PhoenixStorageHandlerConstants
- .SPACE)
- .append("to_date(");
-
- String toCompareValue = iterator.next();
- if (toCompareValue.endsWith(PhoenixStorageHandlerConstants
- .RIGHT_ROUND_BRACKET)) {
- int rightBracketIndex = toCompareValue.indexOf
- (PhoenixStorageHandlerConstants.RIGHT_ROUND_BRACKET);
- whereCondition.append(getCompareValueForDateAndTimestampFunction
- (toCompareValue.substring(0, rightBracketIndex))).append
- (PhoenixStorageHandlerConstants.RIGHT_ROUND_BRACKET).append
- (toCompareValue.substring(rightBracketIndex));
- } else {
- whereCondition.append(getCompareValueForDateAndTimestampFunction
- (toCompareValue)).append(PhoenixStorageHandlerConstants
- .RIGHT_ROUND_BRACKET);
- }
- } else if (PhoenixStorageHandlerConstants.IN_COMPARATOR.equalsIgnoreCase
- (comparator)) {
- while (iterator.hasNext()) {
- String aToken = iterator.next();
- if (aToken.equals(PhoenixStorageHandlerConstants.LEFT_ROUND_BRACKET) ||
- aToken.equals(PhoenixStorageHandlerConstants.COMMA)) {
- whereCondition.append(aToken);
- } else if (aToken.equals(PhoenixStorageHandlerConstants
- .RIGHT_ROUND_BRACKET)) {
- whereCondition.append(aToken);
- break;
- } else if (aToken.endsWith(PhoenixStorageHandlerConstants
- .RIGHT_ROUND_BRACKET)) {
- int bracketIndex = aToken.indexOf(PhoenixStorageHandlerConstants
- .RIGHT_ROUND_BRACKET);
- whereCondition.append("to_date(").append
- (getCompareValueForDateAndTimestampFunction(aToken.substring
- (0, bracketIndex))).append
- (PhoenixStorageHandlerConstants.RIGHT_ROUND_BRACKET).append
- (aToken.substring(bracketIndex));
- break;
- } else if (aToken.endsWith(PhoenixStorageHandlerConstants.COMMA)) {
- if (aToken.startsWith(PhoenixStorageHandlerConstants
- .LEFT_ROUND_BRACKET)) {
- int bracketIndex = aToken.lastIndexOf
- (PhoenixStorageHandlerConstants.LEFT_ROUND_BRACKET);
- whereCondition.append(aToken.substring(0, bracketIndex + 1))
- .append("to_date(").append
- (getCompareValueForDateAndTimestampFunction(aToken
- .substring(bracketIndex + 1, aToken.length() - 1)
- )).append("),");
- } else {
- whereCondition.append("to_date(").append
- (getCompareValueForDateAndTimestampFunction(aToken
- .substring(0, aToken.length() - 1))).append("),");
- }
- }
-
- whereCondition.append(PhoenixStorageHandlerConstants.SPACE);
- }
- } else if (PhoenixStorageHandlerConstants.COMMON_COMPARATOR.contains(comparator)) {
- String compareValue = getCompareValueForDateAndTimestampFunction(iterator
- .next());
- whereCondition.append("to_date(");
- if (compareValue.endsWith(PhoenixStorageHandlerConstants.RIGHT_ROUND_BRACKET)) {
- int rightBracketIndex = compareValue.indexOf
- (PhoenixStorageHandlerConstants.RIGHT_ROUND_BRACKET);
- whereCondition.append(getCompareValueForDateAndTimestampFunction
- (compareValue.substring(0, rightBracketIndex))).append
- (PhoenixStorageHandlerConstants.RIGHT_ROUND_BRACKET).append
- (compareValue.substring(rightBracketIndex));
- } else {
- whereCondition.append(getCompareValueForDateAndTimestampFunction
- (compareValue)).append(PhoenixStorageHandlerConstants
- .RIGHT_ROUND_BRACKET);
- }
- }
- } else {
- whereCondition.append(token);
- }
- }
-
- return whereCondition.toString();
- }
-
- // Assume timestamp value is yyyy-MM-dd HH:mm:ss.SSS
- private String applyTimestampFunction(String whereClause, String columnName) {
- StringBuilder whereCondition = new StringBuilder();
- for (Iterator<String> iterator = Splitter.on(CharMatcher.WHITESPACE).omitEmptyStrings()
- .split(whereClause).iterator(); iterator.hasNext(); whereCondition.append
- (PhoenixStorageHandlerConstants.SPACE)) {
- String token = iterator.next();
- if (isMyCondition(columnName, token)) {
- whereCondition.append(token);
-
- String comparator = iterator.next();
- whereCondition.append(PhoenixStorageHandlerConstants.SPACE);
- whereCondition.append(comparator).append(PhoenixStorageHandlerConstants.SPACE);
- if (PhoenixStorageHandlerConstants.BETWEEN_COMPARATOR.equalsIgnoreCase
- (comparator)) {
- String fromCompareValue = iterator.next() + PhoenixStorageHandlerConstants
- .SPACE + iterator.next();
- whereCondition.append("to_timestamp(").append
- (getCompareValueForDateAndTimestampFunction(fromCompareValue)).append
- (PhoenixStorageHandlerConstants.RIGHT_ROUND_BRACKET);
- whereCondition.append(PhoenixStorageHandlerConstants.SPACE).append(iterator
- .next()).append(PhoenixStorageHandlerConstants.SPACE);
- whereCondition.append("to_timestamp(");
-
- String toCompareValue = iterator.next() + PhoenixStorageHandlerConstants
- .SPACE + iterator.next();
- if (toCompareValue.endsWith(PhoenixStorageHandlerConstants
- .RIGHT_ROUND_BRACKET)) {
- int rightBracketIndex = toCompareValue.indexOf
- (PhoenixStorageHandlerConstants.RIGHT_ROUND_BRACKET);
- whereCondition.append(getCompareValueForDateAndTimestampFunction
- (toCompareValue.substring(0, rightBracketIndex))).append
- (PhoenixStorageHandlerConstants.RIGHT_ROUND_BRACKET).append
- (toCompareValue.substring(rightBracketIndex));
- } else {
- whereCondition.append(getCompareValueForDateAndTimestampFunction
- (toCompareValue)).append(PhoenixStorageHandlerConstants
- .RIGHT_ROUND_BRACKET);
- }
- } else if (PhoenixStorageHandlerConstants.IN_COMPARATOR.equalsIgnoreCase
- (comparator)) {
- while (iterator.hasNext()) {
- String aToken = iterator.next();
- if (aToken.equals(PhoenixStorageHandlerConstants.LEFT_ROUND_BRACKET) ||
- aToken.equals(PhoenixStorageHandlerConstants.COMMA)) {
- whereCondition.append(aToken);
- } else if (aToken.equals(PhoenixStorageHandlerConstants
- .RIGHT_ROUND_BRACKET)) {
- whereCondition.append(aToken);
- break;
- } else {
- String compareValue = aToken + PhoenixStorageHandlerConstants.SPACE +
- iterator.next();
-
- if (compareValue.startsWith(PhoenixStorageHandlerConstants
- .LEFT_ROUND_BRACKET)) {
- int leftBracketIndex = compareValue.lastIndexOf
- (PhoenixStorageHandlerConstants.LEFT_ROUND_BRACKET);
- whereCondition.append(compareValue.substring(0, leftBracketIndex
- + 1)).append("to_timestamp(");
-
- if (compareValue.endsWith(PhoenixStorageHandlerConstants
- .RIGHT_ROUND_BRACKET)) {
- int rightBracketIndex = compareValue.indexOf
- (PhoenixStorageHandlerConstants.RIGHT_ROUND_BRACKET);
- whereCondition.append
- (getCompareValueForDateAndTimestampFunction
- (compareValue.substring(leftBracketIndex + 1,
- rightBracketIndex)))
- .append(PhoenixStorageHandlerConstants
- .RIGHT_ROUND_BRACKET).append(compareValue
- .substring(rightBracketIndex));
- } else if (compareValue.endsWith(PhoenixStorageHandlerConstants
- .COMMA)) {
- whereCondition.append
- (getCompareValueForDateAndTimestampFunction
- (compareValue.substring(leftBracketIndex + 1,
- compareValue.length() - 1)))
- .append(PhoenixStorageHandlerConstants
- .RIGHT_ROUND_BRACKET).append
- (PhoenixStorageHandlerConstants.COMMA);
- } else {
- whereCondition.append
- (getCompareValueForDateAndTimestampFunction
- (compareValue.substring(leftBracketIndex + 1)
- )).append(PhoenixStorageHandlerConstants
- .RIGHT_ROUND_BRACKET);
- }
- } else if (compareValue.endsWith(PhoenixStorageHandlerConstants
- .RIGHT_ROUND_BRACKET)) {
- int rightBracketIndex = compareValue.indexOf
- (PhoenixStorageHandlerConstants.RIGHT_ROUND_BRACKET);
- whereCondition.append("to_timestamp(").append
- (getCompareValueForDateAndTimestampFunction(compareValue
- .substring(0, rightBracketIndex)))
- .append(PhoenixStorageHandlerConstants
- .RIGHT_ROUND_BRACKET).append(compareValue
- .substring(rightBracketIndex));
- break;
- } else if (compareValue.endsWith(PhoenixStorageHandlerConstants
- .COMMA)) {
- whereCondition.append("to_timestamp(").append
- (getCompareValueForDateAndTimestampFunction(compareValue
- .substring(0, compareValue.length() - 1))).append
- ("),");
- }
- }
-
- whereCondition.append(PhoenixStorageHandlerConstants.SPACE);
- }
- } else if (PhoenixStorageHandlerConstants.COMMON_COMPARATOR.contains(comparator)) {
- String timestampValue = iterator.next() + PhoenixStorageHandlerConstants
- .SPACE + iterator.next();
- whereCondition.append("to_timestamp(");
- if (timestampValue.endsWith(PhoenixStorageHandlerConstants
- .RIGHT_ROUND_BRACKET)) {
- int rightBracketIndex = timestampValue.indexOf
- (PhoenixStorageHandlerConstants.RIGHT_ROUND_BRACKET);
- whereCondition.append(getCompareValueForDateAndTimestampFunction
- (timestampValue.substring(0, rightBracketIndex))).append
- (PhoenixStorageHandlerConstants.RIGHT_ROUND_BRACKET).append
- (timestampValue.substring(rightBracketIndex));
- } else {
- whereCondition.append(getCompareValueForDateAndTimestampFunction
- (timestampValue)).append(PhoenixStorageHandlerConstants
- .RIGHT_ROUND_BRACKET);
- }
- }
- } else {
- whereCondition.append(token);
- }
- }
-
- return whereCondition.toString();
- }
-
- private boolean isMyCondition(String columnName, String token) {
- boolean itsMine = false;
-
- if (columnName.equals(token)) {
- itsMine = true;
- } else if (token.startsWith(PhoenixStorageHandlerConstants.LEFT_ROUND_BRACKET) && token
- .substring(token.lastIndexOf(PhoenixStorageHandlerConstants.LEFT_ROUND_BRACKET) +
- 1).equals(columnName)) {
- itsMine = true;
- } else if (token.startsWith(PhoenixStorageHandlerConstants.LEFT_ROUND_BRACKET) && token
- .endsWith(PhoenixStorageHandlerConstants.RIGHT_ROUND_BRACKET)
- && token.substring(token.lastIndexOf(PhoenixStorageHandlerConstants
- .LEFT_ROUND_BRACKET) + 1, token.indexOf(PhoenixStorageHandlerConstants
- .RIGHT_ROUND_BRACKET)).equals(columnName)) {
- itsMine = true;
- }
-
- return itsMine;
- }
-
protected List<String> buildWhereClause(JobConf jobConf, StringBuilder sql,
List<IndexSearchCondition> conditions)
throws IOException {
diff --git a/phoenix-hive/src/test/java/org/apache/phoenix/hive/query/PhoenixQueryBuilderTest.java b/phoenix-hive/src/test/java/org/apache/phoenix/hive/query/PhoenixQueryBuilderTest.java
index bc2cbe3..cd0f93b 100644
--- a/phoenix-hive/src/test/java/org/apache/phoenix/hive/query/PhoenixQueryBuilderTest.java
+++ b/phoenix-hive/src/test/java/org/apache/phoenix/hive/query/PhoenixQueryBuilderTest.java
@@ -170,4 +170,23 @@
"\"" + COLUMN_DATE + "\" is not null ",
BUILDER.buildQuery(jobConf, TABLE_NAME, readColumnList, searchConditions));
}
+
+ @Test
+ public void testBuildQueryWithBigintColumns() throws IOException {
+ final String COLUMN_BIGINT = "Column_Bigint";
+ final String tableName = "TEST_TABLE";
+ final String expectedQueryPrefix = "select /*+ NO_CACHE */ \"" + COLUMN_BIGINT +
+ "\" from " + tableName + " where ";
+
+ JobConf jobConf = new JobConf();
+ List<String> readColumnList = Lists.newArrayList(COLUMN_BIGINT);
+
+ List<IndexSearchCondition> searchConditions = Lists.newArrayList(
+ mockedIndexSearchCondition("GenericUDFOPEqual", 100L,
+ null, COLUMN_BIGINT, "bigint", false)
+ );
+
+ assertEquals(expectedQueryPrefix + "\"" + COLUMN_BIGINT + "\" = 100",
+ BUILDER.buildQuery(jobConf, TABLE_NAME, readColumnList, searchConditions));
+ }
}