/** 如果是1 = id的情况,转化为id = 1 */ private static IFilter exchage(IFilter root) { IBooleanFilter bf = (IBooleanFilter) root; if (!FilterUtils.isConstValue(bf.getValue()) && FilterUtils.isConstValue(bf.getColumn())) { Object val = bf.getColumn(); bf.setColumn(bf.getValue()); bf.setValue(val); OPERATION newOp = bf.getOperation(); switch (bf.getOperation()) { case GT: newOp = OPERATION.LT; break; case LT: newOp = OPERATION.GT; break; case GT_EQ: newOp = OPERATION.LT_EQ; break; case LT_EQ: newOp = OPERATION.GT_EQ; break; default: break; } bf.setOperation(newOp); } return bf; }
/** 将0=1/1=1/true的恒等式进行优化 */ private static IFilter shortestFilter(IFilter root) throws EmptyResultFilterException { IFilter filter = FilterUtils.toDNFAndFlat(root); List<List<IFilter>> DNFfilter = FilterUtils.toDNFNodesArray(filter); List<List<IFilter>> newDNFfilter = new ArrayList<List<IFilter>>(); for (List<IFilter> andDNFfilter : DNFfilter) { boolean isShortest = false; List<IFilter> newAndDNFfilter = new ArrayList<IFilter>(); for (IFilter one : andDNFfilter) { if (one.getOperation() == OPERATION.CONSTANT) { boolean flag = false; if (((IBooleanFilter) one).getColumn() instanceof ISelectable) { // 可能是个not函数 newAndDNFfilter.add(one); // 不能丢弃 } else { String value = ((IBooleanFilter) one).getColumn().toString(); if (StringUtils.isNumeric(value)) { flag = BooleanUtils.toBoolean(Integer.valueOf(value)); } else { flag = BooleanUtils.toBoolean(((IBooleanFilter) one).getColumn().toString()); } if (!flag) { isShortest = true; break; } } } else { newAndDNFfilter.add(one); } } if (!isShortest) { if (newAndDNFfilter.isEmpty()) { // 代表出现为true or xxx,直接返回true IBooleanFilter f = ASTNodeFactory.getInstance().createBooleanFilter(); f.setOperation(OPERATION.CONSTANT); f.setColumn("1"); f.setColumnName(ObjectUtils.toString("1")); return f; } else { // 针对非false的情况 newDNFfilter.add(newAndDNFfilter); } } } if (newDNFfilter.isEmpty()) { throw new EmptyResultFilterException("空结果"); } return FilterUtils.DNFToOrLogicTree(newDNFfilter); }
private static void findBooleanFilter(IBooleanFilter filter, Parameters parameters) { if (filter == null) { return; } findObject(filter.getColumn(), parameters); findObject(filter.getValue(), parameters); if (filter.getOperation() == OPERATION.IN) { List<Object> values = filter.getValues(); if (values != null && !values.isEmpty()) { for (int i = 0; i < values.size(); i++) { findObject(values.get(i), parameters); } } } }
/** * 构造Range对象 * * @param f * @return */ protected Range getRange(IBooleanFilter f) { DataType type = getColumn(f).getDataType(); if (type == null) { type = DataTypeUtil.getTypeOfObject(f.getValue()); } switch (f.getOperation()) { case EQ: return new Range(null, type, getValue(f), getValue(f)); case GT: return new Range(null, type, getValue(f), false, null, true); case GT_EQ: return new Range(null, type, getValue(f), true, null, true); case LT: return new Range(null, type, null, true, getValue(f), false); case LT_EQ: return new Range(null, type, null, true, getValue(f), true); default: return null; } }
/** * 根据range结果,构造filter * * @param range * @param column * @return */ protected List<IFilter> buildFilter(Range range, Object column) { List<IFilter> filters = new ArrayList(2); if (range == null) { return filters; } if (range.isSingleValue()) { IBooleanFilter en = ASTNodeFactory.getInstance().createBooleanFilter().setOperation(OPERATION.EQ); en.setColumn(column); en.setValue(range.getMaxValue()); filters.add(en); return filters; } if (range.getMinValue() != null) { IBooleanFilter gn; if (range.isMinIncluded()) { gn = ASTNodeFactory.getInstance().createBooleanFilter().setOperation(OPERATION.GT_EQ); } else { gn = ASTNodeFactory.getInstance().createBooleanFilter().setOperation(OPERATION.GT); } gn.setColumn(column); gn.setValue(range.getMinValue()); filters.add(gn); } if (range.getMaxValue() != null) { IBooleanFilter ln; if (range.isMaxIncluded()) { ln = ASTNodeFactory.getInstance().createBooleanFilter().setOperation(OPERATION.LT_EQ); } else { ln = ASTNodeFactory.getInstance().createBooleanFilter().setOperation(OPERATION.LT); } ln.setColumn(column); ln.setValue(range.getMaxValue()); filters.add(ln); } return filters; }
protected ISelectable getColumn(IBooleanFilter f) { return (ISelectable) f.getColumn(); }
protected Comparable getValue(IBooleanFilter f) { return (Comparable) f.getValue(); }
private static IFilter typeConvert(IFilter root) { IBooleanFilter bf = (IBooleanFilter) root; // 如果是id in (xx) if (bf.getValues() != null && bf.getColumn() instanceof ISelectable) { for (int i = 0; i < bf.getValues().size(); i++) { bf.getValues() .set( i, OptimizerUtils.convertType( bf.getValues().get(i), ((ISelectable) bf.getColumn()).getDataType())); } } else { // 如果是 1 = id情况 if (FilterUtils.isConstValue(bf.getColumn()) && !FilterUtils.isConstValue(bf.getValue())) { DATA_TYPE type = null; if (bf.getValue() instanceof IColumn) { type = ((IColumn) bf.getValue()).getDataType(); } if (bf.getValue() instanceof IFunction) { type = ((IFunction) bf.getValue()).getDataType(); } bf.setColumn(OptimizerUtils.convertType(bf.getColumn(), type)); } // 如果是 id = 1情况 if (FilterUtils.isConstValue(bf.getValue()) && !FilterUtils.isConstValue(bf.getColumn())) { DATA_TYPE type = null; if (bf.getColumn() instanceof IColumn) { type = ((IColumn) bf.getColumn()).getDataType(); } if (bf.getColumn() instanceof IFunction) { type = ((IFunction) bf.getColumn()).getDataType(); } bf.setValue(OptimizerUtils.convertType(bf.getValue(), type)); } } return bf; }