boolean isValidatedFilter) throws MetaException { assert tree != null; FilterBuilder queryBuilder = new FilterBuilder(isValidatedFilter); if (table != null) { queryBuilder.append("table.tableName == t1 && table.database.name == t2 && table.database.catalogName == t3"); params.put("t1", table.getTableName()); params.put("t2", table.getDbName()); params.put("t3", table.getCatName()); } else { queryBuilder.append("database.name == dbName && database.catalogName == catName"); params.put("dbName", dbName); params.put("catName", catName); if (queryBuilder.hasError()) { assert !isValidatedFilter; LOG.info("JDO filter pushdown cannot be used: {}", queryBuilder.getErrorMessage()); return null; String jdoFilter = queryBuilder.getFilter(); LOG.debug("jdoFilter = {}", jdoFilter); return jdoFilter;
@Override public void visit(LeafNode node) throws MetaException { if (node.operator == Operator.LIKE) { filterBuffer.setError("LIKE is not supported for SQL filter pushdown"); return; if (filterBuffer.hasError()) return; FilterType colType = FilterType.fromType(colTypeStr); if (colType == FilterType.Invalid) { filterBuffer.setError("Filter pushdown not supported for type " + colTypeStr); return; Object nodeValue = node.value; if (valType == FilterType.Invalid) { filterBuffer.setError("Filter pushdown not supported for value " + node.value.getClass()); return; filterBuffer.setError("Cannot push down filter for " + colTypeStr + " column and value " + nodeValue.getClass()); return;
@Override public void visit(LeafNode node) throws MetaException { if (node.operator == Operator.LIKE) { filterBuffer.setError("LIKE is not supported for SQL filter pushdown"); return; if (filterBuffer.hasError()) return; FilterType colType = FilterType.fromType(colTypeStr); if (colType == FilterType.Invalid) { filterBuffer.setError("Filter pushdown not supported for type " + colTypeStr); return; Object nodeValue = node.value; if (valType == FilterType.Invalid) { filterBuffer.setError("Filter pushdown not supported for value " + node.value.getClass()); return; filterBuffer.setError("Cannot push down filter for " + colTypeStr + " column and value " + nodeValue.getClass()); return;
@Override public void visit(LeafNode node) throws MetaException { if (node.operator == Operator.LIKE) { filterBuffer.setError("LIKE is not supported for SQL filter pushdown"); return; if (filterBuffer.hasError()) return; FilterType colType = FilterType.fromType(colTypeStr); if (colType == FilterType.Invalid) { filterBuffer.setError("Filter pushdown not supported for type " + colTypeStr); return; Object nodeValue = node.value; if (valType == FilterType.Invalid) { filterBuffer.setError("Filter pushdown not supported for value " + node.value.getClass()); return; filterBuffer.setError("Cannot push down filter for " + colTypeStr + " column and value " + nodeValue.getClass()); return;
fltr.append("partitionName ").append(isEq ? "== " : "!= ").append(paramName); } else if (keyPos + 1 == keyCount) { fltr.append(isEq ? "" : "!").append("partitionName.endsWith(") .append(paramName).append(")"); } else if (keyPos == 0) { fltr.append(isEq ? "" : "!").append("partitionName.startsWith(") .append(paramName).append(")"); } else { fltr.append("partitionName.indexOf(").append(paramName).append(")") .append(isEq ? ">= 0" : "< 0");
fltr.append("partitionName ").append(isEq ? "== " : "!= ").append(paramName); } else if (keyPos + 1 == keyCount) { fltr.append(isEq ? "" : "!").append("partitionName.endsWith(") .append(paramName).append(")"); } else if (keyPos == 0) { fltr.append(isEq ? "" : "!").append("partitionName.startsWith(") .append(paramName).append(")"); } else { fltr.append("partitionName.indexOf(").append(paramName).append(")") .append(isEq ? ">= 0" : "< 0");
filterBuilder.setError("Filtering is supported only on partition keys of type " + "string" + (isIntegralSupported ? ", or integral types" : "")); return null; filterBuilder.setError("Filtering is supported only on partition keys of type " + "string" + (isIntegralSupported ? ", or integral types" : "")); return null;
int partitionColumnCount = table.getPartitionKeys().size(); int partitionColumnIndex = getPartColIndexForFilter(table, filterBuilder); if (filterBuilder.hasError()) return; String valueAsString = getJdoFilterPushdownParam( table, partitionColumnIndex, filterBuilder, canPushDownIntegral); if (filterBuilder.hasError()) return; if (isReverseOrder) { filterBuilder.setError( "Value should be on the RHS for LIKE operator : Key <" + keyName + ">");
int partitionColumnCount = table.getPartitionKeys().size(); int partitionColumnIndex = getPartColIndexForFilter(table, filterBuilder); if (filterBuilder.hasError()) return; String valueAsString = getJdoFilterPushdownParam( table, partitionColumnIndex, filterBuilder, canPushDownIntegral); if (filterBuilder.hasError()) return; if (isReverseOrder) { filterBuilder.setError( "Value should be on the RHS for LIKE operator : Key <" + keyName + ">");
private void generateJDOFilterOverTables(Map<String, Object> params, FilterBuilder filterBuilder) throws MetaException { if (keyName.equals(hive_metastoreConstants.HIVE_FILTER_FIELD_OWNER)) { keyName = "this.owner"; } else if (keyName.equals(hive_metastoreConstants.HIVE_FILTER_FIELD_LAST_ACCESS)) { //lastAccessTime expects an integer, so we cannot use the "like operator" if (operator == Operator.LIKE) { filterBuilder.setError("Like is not supported for HIVE_FILTER_FIELD_LAST_ACCESS"); return; } keyName = "this.lastAccessTime"; } else if (keyName.startsWith(hive_metastoreConstants.HIVE_FILTER_FIELD_PARAMS)) { if (!TABLE_FILTER_OPS.contains(operator)) { filterBuilder.setError("Only " + TABLE_FILTER_OPS + " are supported " + "operators for HIVE_FILTER_FIELD_PARAMS"); return; } String paramKeyName = keyName.substring(hive_metastoreConstants.HIVE_FILTER_FIELD_PARAMS.length()); keyName = "this.parameters.get(\"" + paramKeyName + "\")"; //value is persisted as a string in the db, so make sure it's a string here // in case we get a long. value = value.toString(); } else { filterBuilder.setError("Invalid key name in filter. " + "Use constants from org.apache.hadoop.hive.metastore.api"); return; } generateJDOFilterGeneral(params, filterBuilder); }
boolean isValidatedFilter) throws MetaException { assert tree != null; FilterBuilder queryBuilder = new FilterBuilder(isValidatedFilter); if (table != null) { queryBuilder.append("table.tableName == t1 && table.database.name == t2 && table.database.catalogName == t3"); params.put("t1", table.getTableName()); params.put("t2", table.getDbName()); params.put("t3", table.getCatName()); } else { queryBuilder.append("database.name == dbName && database.catalogName == catName"); params.put("dbName", dbName); params.put("catName", catName); if (queryBuilder.hasError()) { assert !isValidatedFilter; LOG.info("JDO filter pushdown cannot be used: {}", queryBuilder.getErrorMessage()); return null; String jdoFilter = queryBuilder.getFilter(); LOG.debug("jdoFilter = {}", jdoFilter); return jdoFilter;
filterBuilder.setError("Filtering is supported only on partition keys of type " + "string" + (isIntegralSupported ? ", or integral types" : "")); return null; filterBuilder.setError("Filtering is supported only on partition keys of type " + "string" + (isIntegralSupported ? ", or integral types" : "")); return null;
Map<String, Object> params, boolean isValidatedFilter) throws MetaException { assert tree != null; FilterBuilder queryBuilder = new FilterBuilder(isValidatedFilter); if (table != null) { queryBuilder.append("table.tableName == t1 && table.database.name == t2"); params.put("t1", table.getTableName()); params.put("t2", table.getDbName()); } else { queryBuilder.append("database.name == dbName"); params.put("dbName", dbName); if (queryBuilder.hasError()) { assert !isValidatedFilter; LOG.info("JDO filter pushdown cannot be used: " + queryBuilder.getErrorMessage()); return null; String jdoFilter = queryBuilder.getFilter(); LOG.debug("jdoFilter = " + jdoFilter); return jdoFilter;
Map<String, Object> params, boolean isValidatedFilter) throws MetaException { assert tree != null; FilterBuilder queryBuilder = new FilterBuilder(isValidatedFilter); if (table != null) { queryBuilder.append("table.tableName == t1 && table.database.name == t2"); params.put("t1", table.getTableName()); params.put("t2", table.getDbName()); } else { queryBuilder.append("database.name == dbName"); params.put("dbName", dbName); if (queryBuilder.hasError()) { assert !isValidatedFilter; LOG.info("JDO filter pushdown cannot be used: " + queryBuilder.getErrorMessage()); return null; String jdoFilter = queryBuilder.getFilter(); LOG.debug("jdoFilter = " + jdoFilter); return jdoFilter;
private void generateJDOFilterOverTables(Map<String, Object> params, FilterBuilder filterBuilder) throws MetaException { if (keyName.equals(hive_metastoreConstants.HIVE_FILTER_FIELD_OWNER)) { keyName = "this.owner"; } else if (keyName.equals(hive_metastoreConstants.HIVE_FILTER_FIELD_LAST_ACCESS)) { //lastAccessTime expects an integer, so we cannot use the "like operator" if (operator == Operator.LIKE) { filterBuilder.setError("Like is not supported for HIVE_FILTER_FIELD_LAST_ACCESS"); return; } keyName = "this.lastAccessTime"; } else if (keyName.startsWith(hive_metastoreConstants.HIVE_FILTER_FIELD_PARAMS)) { if (!TABLE_FILTER_OPS.contains(operator)) { filterBuilder.setError("Only " + TABLE_FILTER_OPS + " are supported " + "operators for HIVE_FILTER_FIELD_PARAMS"); return; } String paramKeyName = keyName.substring(hive_metastoreConstants.HIVE_FILTER_FIELD_PARAMS.length()); keyName = "this.parameters.get(\"" + paramKeyName + "\")"; //value is persisted as a string in the db, so make sure it's a string here // in case we get a long. value = value.toString(); } else { filterBuilder.setError("Invalid key name in filter. " + "Use constants from org.apache.hadoop.hive.metastore.api"); return; } generateJDOFilterGeneral(params, filterBuilder); }
/** * Get partition column index in the table partition column list that * corresponds to the key that is being filtered on by this tree node. * @param table The table. * @param filterBuilder filter builder used to report error, if any. * @return The index. */ public int getPartColIndexForFilter( Table table, FilterBuilder filterBuilder) throws MetaException { int partitionColumnIndex; assert (table.getPartitionKeys().size() > 0); for (partitionColumnIndex = 0; partitionColumnIndex < table.getPartitionKeys().size(); ++partitionColumnIndex) { if (table.getPartitionKeys().get(partitionColumnIndex).getName(). equalsIgnoreCase(keyName)) { break; } } if( partitionColumnIndex == table.getPartitionKeys().size()) { filterBuilder.setError("Specified key <" + keyName + "> is not a partitioning key for the table"); return -1; } return partitionColumnIndex; }
/** * Generates a general filter. Given a map of <key, value>, * generates a statement of the form: * key1 operator value2 (&& | || ) key2 operator value2 ... * * Currently supported types for value are String and Long. * The LIKE operator for Longs is unsupported. */ private void generateJDOFilterGeneral(Map<String, Object> params, FilterBuilder filterBuilder) throws MetaException { String paramName = PARAM_PREFIX + params.size(); params.put(paramName, value); if (isReverseOrder) { if (operator == Operator.LIKE) { filterBuilder.setError("Value should be on the RHS for LIKE operator : " + "Key <" + keyName + ">"); } else { filterBuilder.append(paramName + " " + operator.getJdoOp() + " " + keyName); } } else { if (operator == Operator.LIKE) { filterBuilder.append(" " + keyName + "." + operator.getJdoOp() + "(" + paramName + ") "); } else { filterBuilder.append(" " + keyName + " " + operator.getJdoOp() + " " + paramName); } } }
/** * Generates a general filter. Given a map of <key, value>, * generates a statement of the form: * key1 operator value2 (&& | || ) key2 operator value2 ... * * Currently supported types for value are String and Long. * The LIKE operator for Longs is unsupported. */ private void generateJDOFilterGeneral(Map<String, Object> params, FilterBuilder filterBuilder) throws MetaException { String paramName = PARAM_PREFIX + params.size(); params.put(paramName, value); if (isReverseOrder) { if (operator == Operator.LIKE) { filterBuilder.setError("Value should be on the RHS for LIKE operator : " + "Key <" + keyName + ">"); } else { filterBuilder.append(paramName + " " + operator.getJdoOp() + " " + keyName); } } else { if (operator == Operator.LIKE) { filterBuilder.append(" " + keyName + "." + operator.getJdoOp() + "(" + paramName + ") "); } else { filterBuilder.append(" " + keyName + " " + operator.getJdoOp() + " " + paramName); } } }