/** * Set float range filter. Only match records if attribute value is beetwen min and max * (inclusive). */ public void SetFilterFloatRange(String attribute, float min, float max, boolean exclude) throws SphinxException { myAssert(min <= max, "min must be less or equal to max"); try { writeNetUTF8(_filters, attribute); _filters.writeInt(SPH_FILTER_FLOATRANGE); _filters.writeFloat(min); _filters.writeFloat(max); _filters.writeInt(exclude ? 1 : 0); } catch (Exception e) { myAssert(false, "IOException: " + e.getMessage()); } _filterCount++; }
/** Set values filter. Only match records where attribute value is in given set. */ public void SetFilter(String attribute, long[] values, boolean exclude) throws SphinxException { myAssert(values != null && values.length > 0, "values array must not be null or empty"); myAssert( attribute != null && attribute.length() > 0, "attribute name must not be null or empty"); try { writeNetUTF8(_filters, attribute); _filters.writeInt(SPH_FILTER_VALUES); _filters.writeInt(values.length); for (int i = 0; i < values.length; i++) _filters.writeLong(values[i]); _filters.writeInt(exclude ? 1 : 0); } catch (Exception e) { myAssert(false, "IOException: " + e.getMessage()); } _filterCount++; }
/** Add new query with current settings to current search request. */ public int AddQuery(String query, String index, String comment) throws SphinxException { ByteArrayOutputStream req = new ByteArrayOutputStream(); /* build request */ try { DataOutputStream out = new DataOutputStream(req); out.writeInt(_offset); out.writeInt(_limit); out.writeInt(_mode); out.writeInt(_ranker); if (_ranker == SPH_RANK_EXPR) { writeNetUTF8(out, _rankexpr); } out.writeInt(_sort); writeNetUTF8(out, _sortby); writeNetUTF8(out, query); int weightLen = _weights != null ? _weights.length : 0; out.writeInt(weightLen); if (_weights != null) { for (int i = 0; i < _weights.length; i++) out.writeInt(_weights[i]); } writeNetUTF8(out, index); out.writeInt(0); out.writeInt(_minId); out.writeInt(_maxId); /* filters */ out.writeInt(_filterCount); out.write(_rawFilters.toByteArray()); /* group-by, max matches, sort-by-group flag */ out.writeInt(_groupFunc); writeNetUTF8(out, _groupBy); out.writeInt(_maxMatches); writeNetUTF8(out, _groupSort); out.writeInt(_cutoff); out.writeInt(_retrycount); out.writeInt(_retrydelay); writeNetUTF8(out, _groupDistinct); /* anchor point */ if (_latitudeAttr == null || _latitudeAttr.length() == 0 || _longitudeAttr == null || _longitudeAttr.length() == 0) { out.writeInt(0); } else { out.writeInt(1); writeNetUTF8(out, _latitudeAttr); writeNetUTF8(out, _longitudeAttr); out.writeFloat(_latitude); out.writeFloat(_longitude); } /* per-index weights */ out.writeInt(_indexWeights.size()); for (Iterator e = _indexWeights.keySet().iterator(); e.hasNext(); ) { String indexName = (String) e.next(); Integer weight = (Integer) _indexWeights.get(indexName); writeNetUTF8(out, indexName); out.writeInt(weight.intValue()); } /* max query time */ out.writeInt(_maxQueryTime); /* per-field weights */ out.writeInt(_fieldWeights.size()); for (Iterator e = _fieldWeights.keySet().iterator(); e.hasNext(); ) { String field = (String) e.next(); Integer weight = (Integer) _fieldWeights.get(field); writeNetUTF8(out, field); out.writeInt(weight.intValue()); } /* comment */ writeNetUTF8(out, comment); /* overrides */ out.writeInt(_overrideTypes.size()); for (Iterator e = _overrideTypes.keySet().iterator(); e.hasNext(); ) { String attr = (String) e.next(); Integer type = (Integer) _overrideTypes.get(attr); Map values = (Map) _overrideValues.get(attr); writeNetUTF8(out, attr); out.writeInt(type.intValue()); out.writeInt(values.size()); for (Iterator e2 = values.keySet().iterator(); e2.hasNext(); ) { Long id = (Long) e2.next(); out.writeLong(id.longValue()); switch (type.intValue()) { case SPH_ATTR_FLOAT: out.writeFloat(((Float) values.get(id)).floatValue()); break; case SPH_ATTR_BIGINT: out.writeLong(((Long) values.get(id)).longValue()); break; default: out.writeInt(((Integer) values.get(id)).intValue()); break; } } } /* select-list */ writeNetUTF8(out, _select); /* done! */ out.flush(); int qIndex = _reqs.size(); _reqs.add(qIndex, req.toByteArray()); return qIndex; } catch (Exception e) { myAssert(false, "error in AddQuery(): " + e + ": " + e.getMessage()); } finally { try { _filters.close(); _rawFilters.close(); } catch (IOException e) { myAssert(false, "error in AddQuery(): " + e + ": " + e.getMessage()); } } return -1; }