blob: 541aa8631b48aa1e61171ba5212aee76cd35c6ea [file] [log] [blame]
package org.apache.hawq.pxf.plugins.jdbc;
/*
* 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.
*/
import java.util.ArrayList;
import java.util.List;
import org.apache.hawq.pxf.api.LogicalFilter;
import org.apache.hawq.pxf.plugins.jdbc.utils.DbProduct;
import org.apache.hawq.pxf.api.BasicFilter;
import org.apache.hawq.pxf.api.FilterParser;
import org.apache.hawq.pxf.api.io.DataType;
import org.apache.hawq.pxf.api.utilities.ColumnDescriptor;
import org.apache.hawq.pxf.api.utilities.InputData;
/**
* Parse filter object generated by parent class {@link org.apache.hawq.pxf.plugins.jdbc.JdbcFilterBuilder},
* and build WHERE statement.
* For Multiple filters , currently only support HDOP_AND .
* The unsupported Filter operation and LogicalOperation ,will return null statement.
*
*/
public class WhereSQLBuilder extends JdbcFilterBuilder {
private InputData inputData;
public WhereSQLBuilder(InputData input) {
inputData = input;
}
/**
* 1.check for LogicalOperator, Jdbc currently only support HDOP_AND.
* 2.and convert to BasicFilter List.
*/
private static List<BasicFilter> convertBasicFilterList(Object filter, List<BasicFilter> returnList) throws UnsupportedFilterException {
if (returnList == null)
returnList = new ArrayList<>();
if (filter instanceof BasicFilter) {
returnList.add((BasicFilter) filter);
return returnList;
}
LogicalFilter lfilter = (LogicalFilter) filter;
if (lfilter.getOperator() != FilterParser.LogicalOperation.HDOP_AND)
throw new UnsupportedFilterException("unsupported LogicalOperation : " + lfilter.getOperator());
for (Object f : lfilter.getFilterList()) {
returnList = convertBasicFilterList(f, returnList);
}
return returnList;
}
public String buildWhereSQL(String db_product) throws Exception {
if (!inputData.hasFilter())
return null;
List<BasicFilter> filters = null;
try {
String filterString = inputData.getFilterString();
Object filterObj = getFilterObject(filterString);
filters = convertBasicFilterList(filterObj, filters);
StringBuffer sb = new StringBuffer("1=1");
for (Object obj : filters) {
BasicFilter filter = (BasicFilter) obj;
sb.append(" AND ");
ColumnDescriptor column = inputData.getColumn(filter.getColumn().index());
//the column name of filter
sb.append(column.columnName());
//the operation of filter
FilterParser.Operation op = filter.getOperation();
switch (op) {
case HDOP_LT:
sb.append("<");
break;
case HDOP_GT:
sb.append(">");
break;
case HDOP_LE:
sb.append("<=");
break;
case HDOP_GE:
sb.append(">=");
break;
case HDOP_EQ:
sb.append("=");
break;
default:
throw new UnsupportedFilterException("unsupported Filter operation : " + op);
}
DbProduct dbProduct = DbProduct.getDbProduct(db_product);
Object val = filter.getConstant().constant();
switch (DataType.get(column.columnTypeCode())) {
case SMALLINT:
case INTEGER:
case BIGINT:
case FLOAT8:
case REAL:
case BOOLEAN:
sb.append(val.toString());
break;
case TEXT:
sb.append("'").append(val.toString()).append("'");
break;
case DATE:
//According to the database products, for the date field for special treatment.
sb.append(dbProduct.wrapDate(val));
break;
default:
throw new UnsupportedFilterException("unsupported column type for filtering : " + column.columnTypeCode());
}
}
return sb.toString();
} catch (UnsupportedFilterException ex) {
return null;
}
}
static class UnsupportedFilterException extends Exception {
UnsupportedFilterException(String message) {
super(message);
}
}
}