/** * Translates the given {@link Operator} into an {@link SQLExpression}. * * @param op * operator to be translated, must not be <code>null</code> * @return corresponding SQL expression, never <code>null</code> * @throws UnmappableException * if translation is not possible (usually due to unmappable property names) * @throws FilterEvaluationException * if the filter contains invalid {@link ValueReference}s */ protected SQLExpression toProtoSQL( Operator op ) throws UnmappableException, FilterEvaluationException { SQLExpression sql = null; switch ( op.getType() ) { case COMPARISON: { sql = toProtoSQL( (ComparisonOperator) op ); break; } case LOGICAL: { sql = toProtoSQL( (LogicalOperator) op ); break; } case SPATIAL: { sql = toProtoSQL( (SpatialOperator) op ); break; } } return sql; }
protected SQLExpression toProtoSQL( Expression expr, boolean assertNotMultiValued ) throws UnmappableException, FilterEvaluationException { SQLExpression sql = toProtoSQL( expr ); if ( assertNotMultiValued ) { assertNotMultiValued( sql ); } return sql; }
protected boolean appendParamsFromFunction( Function function, List<SQLExpression> params ) throws UnmappableException, FilterEvaluationException { boolean isConstant = true; for ( Expression param : function.getParameters() ) { SQLExpression sqlParam = toProtoSQL( param ); if ( !( sqlParam instanceof SQLArgument ) ) { isConstant = false; } params.add( sqlParam ); } return isConstant; }
whereClause = toProtoSQL( filter.getOperator() ); } catch ( UnmappableException e ) { if ( !allowPartialMappings ) { if ( preFilterBBox != null ) { try { whereClause = toProtoSQL( preFilterBBox ); } catch ( UnmappableException e2 ) { LOG.warn( "Unable to map any filter constraints to WHERE-clause. Fallback to full memory filtering." ); orderByClause = toProtoSQL( sortCrit ); } catch ( UnmappableException e ) { if ( !allowPartialMappings ) {
SQLOperationBuilder builder = new SQLOperationBuilder(); builder.add( "(" ); builder.add( toProtoSQL( expr.getParams()[0], true ) ); builder.add( "+" ); builder.add( toProtoSQL( expr.getParams()[1], true ) ); builder.add( ")" ); sql = builder.toOperation(); SQLOperationBuilder builder = new SQLOperationBuilder(); builder.add( "(" ); builder.add( toProtoSQL( expr.getParams()[0], true ) ); builder.add( "/" ); builder.add( toProtoSQL( expr.getParams()[1], true ) ); builder.add( ")" ); sql = builder.toOperation(); sql = toProtoSQL( (Function) expr ); break; sql = toProtoSQL( (Literal<?>) expr ); break; SQLOperationBuilder builder = new SQLOperationBuilder(); builder.add( "(" ); builder.add( toProtoSQL( expr.getParams()[0], true ) ); builder.add( "*" ); builder.add( toProtoSQL( expr.getParams()[1], true ) ); builder.add( ")" ); sql = builder.toOperation();
case AND: { builder.add( "(" ); builder.add( toProtoSQL( op.getParams()[0] ) ); for ( int i = 1; i < op.getParams().length; i++ ) { builder.add( " AND " ); builder.add( toProtoSQL( op.getParams()[i] ) ); builder.add( toProtoSQL( op.getParams()[0] ) ); for ( int i = 1; i < op.getParams().length; i++ ) { builder.add( " OR " ); builder.add( toProtoSQL( op.getParams()[i] ) ); builder.add( toProtoSQL( op.getParams()[0] ) ); builder.add( ")" ); break;
/** * Translates the given {@link SortProperty} array into an {@link SQLExpression}. * * @param sortCrits * sort criteria to be translated, must not be <code>null</code> * @return corresponding SQL expression, never <code>null</code> * @throws UnmappableException * if translation is not possible (usually due to unmappable property names) * @throws FilterEvaluationException * if the filter contains invalid {@link ValueReference}s */ protected SQLExpression toProtoSQL( SortProperty[] sortCrits ) throws UnmappableException, FilterEvaluationException { SQLOperationBuilder builder = new SQLOperationBuilder(); for ( int i = 0; i < sortCrits.length; i++ ) { SortProperty sortCrit = sortCrits[i]; if ( i > 0 ) { builder.add( "," ); } builder.add( toProtoSQL( sortCrit.getSortProperty() ) ); if ( sortCrit.getSortOrder() ) { builder.add( " ASC" ); } else { builder.add( " DESC" ); } } return builder.toOperation(); }
PropertyIsBetween propIsBetween = (PropertyIsBetween) op; SQLOperationBuilder builder = new SQLOperationBuilder( BOOLEAN ); SQLExpression lower = toProtoSQL( propIsBetween.getLowerBoundary(), true ); SQLExpression expr = toProtoSQL( propIsBetween.getExpression(), true ); SQLExpression upper = toProtoSQL( propIsBetween.getUpperBoundary(), true ); inferType( lower, expr, upper ); builder.add( "(" ); SQLExpression param1 = toProtoSQL( propIsEqualTo.getParameter1() ); SQLExpression param2 = toProtoSQL( propIsEqualTo.getParameter2() ); if ( !param1.isMultiValued() && !param2.isMultiValued() ) { inferType( param1, param2 ); if ( propName instanceof ValueReference && literal instanceof Literal ) { PropertyIsLike propIsLike = buildIsLike( propName, literal, propIsEqualTo.isMatchCase() ); sqlOper = toProtoSQL( propIsLike ); } else { String msg = "Can not map filter. Multi-valued columns can only be compared to literals."; PropertyIsGreaterThan propIsGT = (PropertyIsGreaterThan) op; SQLOperationBuilder builder = new SQLOperationBuilder( BOOLEAN ); SQLExpression param1 = toProtoSQL( propIsGT.getParameter1(), true ); SQLExpression param2 = toProtoSQL( propIsGT.getParameter2(), true ); inferType( param1, param2 ); addExpression( builder, param1, op.isMatchCase() ); PropertyIsGreaterThanOrEqualTo propIsGTOrEqualTo = (PropertyIsGreaterThanOrEqualTo) op; SQLOperationBuilder builder = new SQLOperationBuilder( BOOLEAN ); SQLExpression param1 = toProtoSQL( propIsGTOrEqualTo.getParameter1(), true );
String singleChar = "" + op.getSingleChar(); SQLExpression propName = toProtoSQL( op.getExpression() );