/** * Removes the numeric refinement relative to an attribute and operator for the next queries. * * @param attribute an attribute that maybe has some refinements. * @param operator an {@link NumericRefinement#OPERATOR_EQ operator}. * @return this {@link Searcher} for chaining. */ @SuppressWarnings({"WeakerAccess", "unused"}) // For library users public Searcher removeNumericRefinement(@NonNull String attribute, @NonNull Integer operator) { return removeNumericRefinement(new NumericRefinement(attribute, operator, NumericRefinement.VALUE_UNKNOWN)); }
/** Constructs a numeric refinement for the given attribute, operator and value. * @param attribute the attribute to refine on. * @param operator a {@link NumericRefinement#OPERATOR_LT comparison operator} to apply. * @param value the value to refine with. */ public NumericRefinement(@NonNull String attribute, int operator, double value) { checkOperatorIsValid(operator); this.operator = operator; this.value = value; this.attribute = attribute; }
@Override public String toString() { return attribute + getOperatorSymbol(operator) + String.format(Locale.US, "%f", value); }
@Test public void getOperatorCodeValid() { Assert.assertEquals(NumericRefinement.OPERATOR_LT, NumericRefinement.getOperatorCode("lt")); Assert.assertEquals(NumericRefinement.OPERATOR_LE, NumericRefinement.getOperatorCode("le")); Assert.assertEquals(NumericRefinement.OPERATOR_EQ, NumericRefinement.getOperatorCode("eq")); Assert.assertEquals(NumericRefinement.OPERATOR_NE, NumericRefinement.getOperatorCode("ne")); Assert.assertEquals(NumericRefinement.OPERATOR_GE, NumericRefinement.getOperatorCode("ge")); Assert.assertEquals(NumericRefinement.OPERATOR_GT, NumericRefinement.getOperatorCode("gt")); }
private void rebuildQueryNumericFilters() { JSONArray numericFilters = new JSONArray(); for (SparseArray<NumericRefinement> refinements : numericRefinements.values()) { for (int i = 0; i < refinements.size(); i++) { numericFilters.put(refinements.valueAt(i).toString()); } } //noinspection deprecation (deprecated for end-users of API Client) query.setNumericFilters(numericFilters); query.setPage(0); }
@Test(expected = IllegalStateException.class) public void getOperatorCodeInvalid() { NumericRefinement.getOperatorCode("foo"); }
/** * Removes any numeric refinements relative to a specific attribute for the next queries. * * @param attribute the attribute that may have a refinement. * @return this {@link Searcher} for chaining. */ @SuppressWarnings({"WeakerAccess", "unused"}) // For library users public Searcher removeNumericRefinement(@NonNull String attribute) { return removeNumericRefinement(new NumericRefinement(attribute, NumericRefinement.OPERATOR_UNKNOWN, NumericRefinement.VALUE_UNKNOWN)); }
/** * Gets the current numeric refinement for an attribute and an operator. * * @param attribute the attribute to refine on. * @param operator one of the {@link NumericRefinement#OPERATOR_EQ operators} defined in {@link NumericRefinement}. * @return a {@link NumericRefinement} describing the current refinement for these parameters, or {@code null} if there is none. */ @SuppressWarnings({"WeakerAccess", "unused"}) // For library users @Nullable public NumericRefinement getNumericRefinement(@NonNull String attribute, int operator) { NumericRefinement.checkOperatorIsValid(operator); final SparseArray<NumericRefinement> attributeRefinements = numericRefinements.get(attribute); return attributeRefinements == null ? null : attributeRefinements.get(operator); }
@Test public void getOperatorSymbolValid() { Assert.assertEquals("<", NumericRefinement.getOperatorSymbol(NumericRefinement.OPERATOR_LT)); Assert.assertEquals("<=", NumericRefinement.getOperatorSymbol(NumericRefinement.OPERATOR_LE)); Assert.assertEquals("=", NumericRefinement.getOperatorSymbol(NumericRefinement.OPERATOR_EQ)); Assert.assertEquals("!=", NumericRefinement.getOperatorSymbol(NumericRefinement.OPERATOR_NE)); Assert.assertEquals(">=", NumericRefinement.getOperatorSymbol(NumericRefinement.OPERATOR_GE)); Assert.assertEquals(">", NumericRefinement.getOperatorSymbol(NumericRefinement.OPERATOR_GT)); }
private void onUpdate(final SeekBar seekBar) { int newProgressValue = seekBar.getProgress(); // avoid double search on ProgressChanged + StopTrackingTouch if (newProgressValue != lastProgressValue[0]) { final double actualValue = updateSeekBarText(tv, seekBar, name, minValue, maxValue, steps); if (newProgressValue == 0) { searcher.removeNumericRefinement(new NumericRefinement(attribute, NumericRefinement.OPERATOR_GT, actualValue)) .search(); } else { searcher.addNumericRefinement(new NumericRefinement(attribute, NumericRefinement.OPERATOR_GT, actualValue)) .search(); } } lastProgressValue[0] = newProgressValue; } });
@Test public void checkOperatorIsValid() { int operator = NumericRefinement.OPERATOR_LT; try { NumericRefinement.checkOperatorIsValid(operator); operator = NumericRefinement.OPERATOR_LE; NumericRefinement.checkOperatorIsValid(operator); operator = NumericRefinement.OPERATOR_EQ; NumericRefinement.checkOperatorIsValid(operator); operator = NumericRefinement.OPERATOR_NE; NumericRefinement.checkOperatorIsValid(operator); operator = NumericRefinement.OPERATOR_GE; NumericRefinement.checkOperatorIsValid(operator); operator = NumericRefinement.OPERATOR_GT; NumericRefinement.checkOperatorIsValid(operator); } catch (IllegalStateException e) { fail("Operator " + operator + "should be considered valid"); } }
@Test(expected = IllegalStateException.class) public void getOperatorSymbolInvalid() { NumericRefinement.getOperatorSymbol(-1); }
final double actualValue = updateSeekBarText(tv, seekBar, name, minValue, maxValue, steps); if (newProgressValue == 0) { searcher.removeNumericRefinement(new NumericRefinement(attribute, NumericRefinement.OPERATOR_GT, actualValue)) .search(); } else { searcher.addNumericRefinement(new NumericRefinement(attribute, NumericRefinement.OPERATOR_GT, actualValue)) .search(); updateSeekBarText(tv, currentFilter != null ? currentFilter : new NumericRefinement(name, NumericRefinement.OPERATOR_GT, minValue), name, minValue); filterViews.put(description.position, seekBarLayout);
/** * Removes the given numeric refinement for the next queries. * * @param refinement a description of the refinement to remove. * @return this {@link Searcher} for chaining. */ @SuppressWarnings({"WeakerAccess", "unused"}) // For library users public Searcher removeNumericRefinement(@NonNull NumericRefinement refinement) { if (refinement.operator == NumericRefinement.OPERATOR_UNKNOWN) { numericRefinements.remove(refinement.attribute); } else { NumericRefinement.checkOperatorIsValid(refinement.operator); final SparseArray<NumericRefinement> attributeRefinements = numericRefinements.get(refinement.attribute); if (attributeRefinements != null) { attributeRefinements.remove(refinement.operator); } } rebuildQueryNumericFilters(); EventBus.getDefault().post(new NumericRefinementEvent(this, Operation.REMOVE, refinement)); return this; } //endregion
@Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { final Double selectedValue = values.get(position); if (currentRefinement != null) { searcher.removeNumericRefinement(currentRefinement); } if (selectedValue != null) { // don't refine if user selected the default value currentRefinement = new NumericRefinement(attribute, operator, selectedValue); searcher.addNumericRefinement(currentRefinement); } searcher.search(); //TODO: Conditional if refineNow (window) or not (dialog) }
@Test(expected = IllegalStateException.class) public void checkOperatorIsInvalid() { int operator = -1; NumericRefinement.checkOperatorIsValid(operator); } }
private void updateRefinement(String attribute, int operator) { if (currentRefinement != null) { searcher.removeNumericRefinement(currentRefinement); currentRefinement = new NumericRefinement(attribute, operator, currentRefinement.value); searcher.addNumericRefinement(currentRefinement); searcher.search(); } }
@Test public void numericRefinements() { Searcher searcher = initSearcher(); final NumericRefinement r = new NumericRefinement("attribute", NumericRefinement.OPERATOR_EQ, 42); final NumericRefinement r2 = new NumericRefinement("attribute", NumericRefinement.OPERATOR_NE, 42); final String formattedValue = String.format(Locale.US, "%f", 42f); searcher.addNumericRefinement(r); Assert.assertEquals("There should be a numeric refinement for attribute", r, searcher.getNumericRefinement(r.attribute, r.operator)); Assert.assertEquals("Query numericFilters should represent the refinement", "[\"attribute=" + formattedValue + "\"]", searcher.getQuery().getNumericFilters().toString()); searcher.removeNumericRefinement(r); Assert.assertEquals("This numeric refinement should have been removed.", null, searcher.getNumericRefinement(r.attribute, r.operator)); Assert.assertEquals("Query numericFilters should be empty after removal", "[]", searcher.getQuery().getNumericFilters().toString()); searcher.addNumericRefinement(r); searcher.addNumericRefinement(r2); Assert.assertEquals("Query numericFilters should represent both refinements", "[\"attribute=" + formattedValue + "\",\"attribute!=" + formattedValue + "\"]", searcher.getQuery().getNumericFilters().toString()); searcher.removeNumericRefinement(r.attribute); Assert.assertEquals("Both numeric refinements for this attribute should have been removed", null, searcher.getNumericRefinement(r.attribute, r.operator)); Assert.assertEquals("Query numericFilters should be empty after removal", "[]", searcher.getQuery().getNumericFilters().toString()); searcher.addNumericRefinement(r); searcher.addNumericRefinement(r2); searcher.removeNumericRefinement(r.attribute, r.operator); Assert.assertEquals("The numeric refinement for this attribute/operator pair should have been removed", null, searcher.getNumericRefinement(r.attribute, r.operator)); Assert.assertEquals("The numeric refinement for this attribute but other operator should have been kept", r2, searcher.getNumericRefinement(r2.attribute, r2.operator)); }