package org.compass.core.impl; import org.compass.core.CompassQuery; import org.compass.core.CompassQueryFilter; import org.compass.core.CompassQueryFilterBuilder; import org.compass.core.engine.SearchEngineQueryFilterBuilder; import org.compass.core.mapping.ResourcePropertyLookup; import org.compass.core.spi.InternalCompass; /** * @author kimchy */ public class DefaultCompassQueryFilterBuilder implements CompassQueryFilterBuilder { public static class DefaultCompassBooleanQueryFilterBuilder implements CompassBooleanQueryFilterBuilder { private SearchEngineQueryFilterBuilder.SearchEngineBooleanQueryFilterBuilder filterBuilder; public DefaultCompassBooleanQueryFilterBuilder(SearchEngineQueryFilterBuilder.SearchEngineBooleanQueryFilterBuilder filterBuilder) { this.filterBuilder = filterBuilder; } public CompassBooleanQueryFilterBuilder and(CompassQueryFilter filter) { filterBuilder.and(((DefaultCompassQueryFilter) filter).getFilter()); return this; } public CompassBooleanQueryFilterBuilder or(CompassQueryFilter filter) { filterBuilder.or(((DefaultCompassQueryFilter) filter).getFilter()); return this; } public CompassBooleanQueryFilterBuilder andNot(CompassQueryFilter filter) { filterBuilder.andNot(((DefaultCompassQueryFilter) filter).getFilter()); return this; } public CompassBooleanQueryFilterBuilder xor(CompassQueryFilter filter) { filterBuilder.xor(((DefaultCompassQueryFilter) filter).getFilter()); return this; } public CompassQueryFilter toFilter() { return new DefaultCompassQueryFilter(filterBuilder.toFilter()); } } private final InternalCompass compass; private final SearchEngineQueryFilterBuilder filterBuilder; private boolean convertOnlyWithDotPath = false; public DefaultCompassQueryFilterBuilder(SearchEngineQueryFilterBuilder filterBuilder, InternalCompass compass) { this.filterBuilder = filterBuilder; this.compass = compass; } public CompassQueryFilterBuilder convertOnlyWithDotPath(boolean convertOnlyWithDotPath) { this.convertOnlyWithDotPath = convertOnlyWithDotPath; return this; } public CompassQueryFilter between(String name, Object low, Object high, boolean includeLow, boolean includeHigh) { ResourcePropertyLookup lookup = getLookup(name); return new DefaultCompassQueryFilter( filterBuilder.between(lookup.getPath(), lookup.getValue(low), lookup.getValue(high), includeLow, includeHigh)); } public CompassQueryFilter lt(String name, Object value) { ResourcePropertyLookup lookup = getLookup(name); return new DefaultCompassQueryFilter( filterBuilder.lt(lookup.getPath(), lookup.getValue(value))); } public CompassQueryFilter le(String name, Object value) { ResourcePropertyLookup lookup = getLookup(name); return new DefaultCompassQueryFilter( filterBuilder.le(lookup.getPath(), lookup.getValue(value))); } public CompassQueryFilter gt(String name, Object value) { ResourcePropertyLookup lookup = getLookup(name); return new DefaultCompassQueryFilter( filterBuilder.gt(lookup.getPath(), lookup.getValue(value))); } public CompassQueryFilter ge(String name, Object value) { ResourcePropertyLookup lookup = getLookup(name); return new DefaultCompassQueryFilter( filterBuilder.ge(lookup.getPath(), lookup.getValue(value))); } public CompassQueryFilter query(CompassQuery query) { return new DefaultCompassQueryFilter( filterBuilder.query(((DefaultCompassQuery) query).getSearchEngineQuery())); } public CompassBooleanQueryFilterBuilder bool() { return new DefaultCompassBooleanQueryFilterBuilder(filterBuilder.bool()); } private ResourcePropertyLookup getLookup(String name) { ResourcePropertyLookup lookup = compass.getMapping().getResourcePropertyLookup(name); lookup.setConvertOnlyWithDotPath(convertOnlyWithDotPath); return lookup; } }