private SQLOperation getOperationFromBuilder( PropertyIsLike op, SQLExpression propName, String sqlEncoded ) { SQLOperationBuilder builder = new SQLOperationBuilder(); if ( !op.isMatchCase() ) { builder.add( "LOWER(" ); } builder.add( propName ); if ( op.isMatchCase() ) { builder.add( "::TEXT LIKE '" ); } else { builder.add( "::TEXT) LIKE '" ); } builder.add( sqlEncoded ); builder.add( "'" ); return builder.toOperation(); }
@Override public SQLExpression toProtoSQL( List<SQLExpression> args, SQLDialect dialect ) { if ( args.size() != 1 ) { throw new IllegalArgumentException( "Unable to map function '" + NAME + "' to SQL. Expected a single argument." ); } SQLExpression arg = args.get( 0 ); // TODO infer type information on arguments // arg.cast( expr ); SQLOperationBuilder builder = new SQLOperationBuilder( VARCHAR ); builder.add( "area(" ); builder.add( arg ); builder.add( ")" ); return builder.toOperation(); }
@Override public SQLExpression toProtoSQL( List<SQLExpression> args, SQLDialect dialect ) { if ( args.size() != 1 ) { throw new IllegalArgumentException( "Unable to map function '" + NAME + "' to SQL. Expected a single argument." ); } SQLExpression arg = args.get( 0 ); // TODO infer type information on arguments // arg.cast( expr ); SQLOperationBuilder builder = new SQLOperationBuilder( VARCHAR ); builder.add( "lower(" ); builder.add( arg ); builder.add( ")" ); return builder.toOperation(); }
@Override public SQLExpression toProtoSQL( List<SQLExpression> args, SQLDialect dialect ) { if ( args.size() != 1 ) { throw new IllegalArgumentException( "Unable to map function '" + NAME + "' to SQL. Expected a single argument." ); } SQLExpression arg = args.get( 0 ); // TODO infer type information on arguments // arg.cast( expr ); SQLOperationBuilder builder = new SQLOperationBuilder( VARCHAR ); builder.add( "upper(" ); builder.add( arg ); builder.add( ")" ); return builder.toOperation(); }
/** * 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(); }
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( ")" ); break; builder.add( "(" ); 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( ")" ); break; builder.add( "NOT (" ); builder.add( toProtoSQL( op.getParams()[0] ) ); builder.add( ")" ); break;
BBOX bbox = (BBOX) op; if ( !bbox.getAllowFalsePositives() ) { builder.add( " (" ); builder.add( propNameExpr ); builder.add( " && " ); builder.add( toProtoSQL( bbox.getBoundingBox(), storageCRS, srid ) ); if ( !bbox.getAllowFalsePositives() ) { builder.add( " AND " ); if ( useLegacyPredicates ) { builder.add( "intersects(" ); } else { builder.add( "ST_Intersects(" ); builder.add( propNameExpr ); builder.add( "," ); builder.add( toProtoSQL( bbox.getBoundingBox(), storageCRS, srid ) ); builder.add( "))" ); Beyond beyond = (Beyond) op; if ( useLegacyPredicates ) { builder.add( "NOT dwithin(" ); } else { builder.add( "NOT ST_DWithin(" ); builder.add( propNameExpr ); builder.add( "," ); builder.add( toProtoSQL( beyond.getGeometry(), storageCRS, srid ) ); builder.add( "," );
case BBOX: { BBOX bbox = (BBOX) op; builder.add( propNameExpr ).add( ".STIntersects(" ); builder.add( toProtoSQL( bbox.getBoundingBox(), storageCRS, srid ) ); builder.add( ")=1" ); break; builder.add( "NOT " ).add( propNameExpr ).add( ".STDWithin(" ); builder.add( toProtoSQL( beyond.getGeometry(), storageCRS, srid ) ); builder.add( "," ); PrimitiveParticleConverter converter = new DefaultPrimitiveConverter( pt, null, false ); SQLArgument argument = new SQLArgument( value, converter ); builder.add( argument ); builder.add( ")=1" ); break; builder.add( propNameExpr ).add( ".STContains(" ); builder.add( toProtoSQL( contains.getGeometry(), storageCRS, srid ) ); builder.add( ")=1" ); break; builder.add( propNameExpr ).add( ".STCrosses(" ); builder.add( toProtoSQL( crosses.getGeometry(), storageCRS, srid ) ); builder.add( ")=1" ); break; builder.add( propNameExpr ).add( ".STDisjoint(" ); builder.add( toProtoSQL( disjoint.getGeometry(), storageCRS, srid ) );
case ADD: { 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(); break; builder.add( "(" ); builder.add( toProtoSQL( expr.getParams()[0], true ) ); builder.add( "/" ); builder.add( toProtoSQL( expr.getParams()[1], true ) ); builder.add( ")" ); sql = builder.toOperation(); break; builder.add( "(" ); builder.add( toProtoSQL( expr.getParams()[0], true ) ); builder.add( "*" ); builder.add( toProtoSQL( expr.getParams()[1], true ) ); builder.add( ")" ); sql = builder.toOperation(); break; builder.add( "(" ); builder.add( toProtoSQL( expr.getParams()[0], true ) ); builder.add( "-" );
builder.add( "LOWER (" + propName + ")" ); } else { builder.add( propName ); builder.add( " LIKE " ); PrimitiveType pt = new PrimitiveType( STRING ); PrimitiveValue value = new PrimitiveValue( sqlEncoded, pt ); PrimitiveParticleConverter converter = new DefaultPrimitiveConverter( pt, null, propName.isMultiValued() ); SQLArgument argument = new SQLArgument( value, converter ); builder.add( argument );
SQLExpression upper = toProtoSQL( propIsBetween.getUpperBoundary(), true ); inferType( lower, expr, upper ); builder.add( "(" ); addExpression( builder, lower, op.isMatchCase() ); builder.add( " <= " ); addExpression( builder, expr, op.isMatchCase() ); builder.add( " AND " ); addExpression( builder, expr, op.isMatchCase() ); builder.add( " <= " ); addExpression( builder, upper, op.isMatchCase() ); builder.add( ")" ); sqlOper = builder.toOperation(); break; SQLOperationBuilder builder = new SQLOperationBuilder( BOOLEAN ); addExpression( builder, param1, op.isMatchCase() ); builder.add( " = " ); addExpression( builder, param2, op.isMatchCase() ); sqlOper = builder.toOperation(); inferType( param1, param2 ); addExpression( builder, param1, op.isMatchCase() ); builder.add( " > " ); addExpression( builder, param2, op.isMatchCase() ); sqlOper = builder.toOperation(); inferType( param1, param2 ); addExpression( builder, param1, op.isMatchCase() ); builder.add( " >= " );