List of usage examples for org.apache.solr.search FunctionQParser parseValueSourceList
public List<ValueSource> parseValueSourceList() throws SyntaxError
From source file:com.gogobot.DistanceParser.java
License:Apache License
@Override public ValueSource parse(FunctionQParser fp) throws SyntaxError { // TODO: dispatch through SpatialQueryable in the future? //note: parseValueSourceList can't handle a field reference to an AbstractSpatialFieldType, // so those fields are expressly handled via sfield= List<ValueSource> sources = fp.parseValueSourceList(); // "m" is a multi-value source, "x" is a single-value source // allow (m,m) (m,x,x) (x,x,m) (x,x,x,x) // if not enough points are present, "pt" will be checked first, followed by "sfield". MultiValueSource mv1 = null;/* w w w. jav a2 s .c om*/ MultiValueSource mv2 = null; if (sources.size() == 0) { // nothing to do now } else if (sources.size() == 1) { ValueSource vs = sources.get(0); if (!(vs instanceof MultiValueSource)) { throw new SyntaxError("geodist - invalid parameters:" + sources); } mv1 = (MultiValueSource) vs; } else if (sources.size() == 2) { ValueSource vs1 = sources.get(0); ValueSource vs2 = sources.get(1); if (vs1 instanceof MultiValueSource && vs2 instanceof MultiValueSource) { mv1 = (MultiValueSource) vs1; mv2 = (MultiValueSource) vs2; } else { mv1 = makeMV(sources, sources); } } else if (sources.size() == 3) { ValueSource vs1 = sources.get(0); ValueSource vs2 = sources.get(1); if (vs1 instanceof MultiValueSource) { // (m,x,x) mv1 = (MultiValueSource) vs1; mv2 = makeMV(sources.subList(1, 3), sources); } else { // (x,x,m) mv1 = makeMV(sources.subList(0, 2), sources); vs1 = sources.get(2); if (!(vs1 instanceof MultiValueSource)) { throw new SyntaxError("geodist - invalid parameters:" + sources); } mv2 = (MultiValueSource) vs1; } } else if (sources.size() == 4) { mv1 = makeMV(sources.subList(0, 2), sources); mv2 = makeMV(sources.subList(2, 4), sources); } else if (sources.size() > 4) { throw new SyntaxError("geodist - invalid parameters:" + sources); } if (mv1 == null) { mv1 = parsePoint(fp); mv2 = parseSfield(fp); } else if (mv2 == null) { mv2 = parsePoint(fp); if (mv2 == null) mv2 = parseSfield(fp); } if (mv1 == null || mv2 == null) { throw new SyntaxError("geodist - not enough parameters:" + sources); } // We have all the parameters at this point, now check if one of the points is constant double[] constants;//latLon constants = getConstants(mv1); MultiValueSource other = mv2; if (constants == null) { constants = getConstants(mv2); other = mv1; } // At this point we dispatch to one of: // * SpatialStrategy.makeDistanceValueSource // * HaversineConstFunction // * HaversineFunction // sfield can only be in mv2, according to the logic above if (mv2 instanceof SpatialStrategyMultiValueSource) { if (constants == null) throw new SyntaxError("When using AbstractSpatialFieldType (e.g. RPT not LatLonType)," + " the point must be supplied as constants"); // note: uses Haversine by default but can be changed via distCalc=... SpatialStrategy strategy = ((SpatialStrategyMultiValueSource) mv2).strategy; Point queryPoint = strategy.getSpatialContext().makePoint(constants[1], constants[0]); //TODO Spatial4j 0.4 will have a direct constant double multiplier = DistanceUtils.degrees2Dist(1, DistanceUtils.EARTH_MEAN_RADIUS_KM); return strategy.makeDistanceValueSource(queryPoint, multiplier); } if (constants != null && other instanceof VectorValueSource) { return new GogobotHaversineConstFunction(constants[0], constants[1], (VectorValueSource) other); } return new HaversineFunction(mv1, mv2, DistanceUtils.EARTH_MEAN_RADIUS_KM, true); }
From source file:com.mysoft.b2b.solr.B258DynamicSourceParser.java
License:Open Source License
public ValueSource parse(FunctionQParser fp) throws SyntaxError { String field = fp.parseArg(); ValueSource v1 = getValueSource(fp, field); List<ValueSource> sources = fp.parseValueSourceList(); return new B258DynamicSource(sources.toArray(new ValueSource[sources.size()]), v1); }
From source file:org.apache.lucene.function.dwarf.ManualScoreParser.java
License:Apache License
@Override public ValueSource parse(FunctionQParser fp) throws SyntaxError { List<ValueSource> sources = fp.parseValueSourceList(); ValueSource[] objl = sources.toArray(new ValueSource[sources.size()]); return new ManualScore(objl); }