Backend support for Inverting Text search facets

This commit is contained in:
Owen Stephens 2017-11-14 14:24:50 +00:00
parent ae6e8bed86
commit 135052d033
2 changed files with 16 additions and 11 deletions

View File

@ -60,6 +60,7 @@ public class TextSearchFacet implements Facet {
protected String _query; protected String _query;
protected String _mode; protected String _mode;
protected boolean _caseSensitive; protected boolean _caseSensitive;
protected boolean _invert;
/* /*
* Derived configuration * Derived configuration
@ -80,6 +81,7 @@ public class TextSearchFacet implements Facet {
writer.key("query"); writer.value(_query); writer.key("query"); writer.value(_query);
writer.key("mode"); writer.value(_mode); writer.key("mode"); writer.value(_mode);
writer.key("caseSensitive"); writer.value(_caseSensitive); writer.key("caseSensitive"); writer.value(_caseSensitive);
writer.key("invert"); writer.value(_invert);
writer.endObject(); writer.endObject();
} }
@ -110,6 +112,7 @@ public class TextSearchFacet implements Facet {
_query = _query.toLowerCase(); _query = _query.toLowerCase();
} }
} }
_invert = o.has("invert") && o.getBoolean("invert");
} }
@Override @Override
@ -123,14 +126,14 @@ public class TextSearchFacet implements Facet {
Evaluable eval = new VariableExpr("value"); Evaluable eval = new VariableExpr("value");
if ("regex".equals(_mode)) { if ("regex".equals(_mode)) {
return new ExpressionStringComparisonRowFilter(eval, _columnName, _cellIndex) { return new ExpressionStringComparisonRowFilter(eval, _invert, _columnName, _cellIndex) {
@Override @Override
protected boolean checkValue(String s) { protected boolean checkValue(String s) {
return _pattern.matcher(s).find(); return _pattern.matcher(s).find();
}; };
}; };
} else { } else {
return new ExpressionStringComparisonRowFilter(eval, _columnName, _cellIndex) { return new ExpressionStringComparisonRowFilter(eval, _invert, _columnName, _cellIndex) {
@Override @Override
protected boolean checkValue(String s) { protected boolean checkValue(String s) {
return (_caseSensitive ? s : s.toLowerCase()).contains(_query); return (_caseSensitive ? s : s.toLowerCase()).contains(_query);

View File

@ -52,11 +52,13 @@ import com.google.refine.model.Row;
*/ */
abstract public class ExpressionStringComparisonRowFilter implements RowFilter { abstract public class ExpressionStringComparisonRowFilter implements RowFilter {
final protected Evaluable _evaluable; final protected Evaluable _evaluable;
final protected Boolean _invert;
final protected String _columnName; final protected String _columnName;
final protected int _cellIndex; final protected int _cellIndex;
public ExpressionStringComparisonRowFilter(Evaluable evaluable, String columnName, int cellIndex) { public ExpressionStringComparisonRowFilter(Evaluable evaluable, Boolean invert, String columnName, int cellIndex) {
_evaluable = evaluable; _evaluable = evaluable;
_invert = invert;
_columnName = columnName; _columnName = columnName;
_cellIndex = cellIndex; _cellIndex = cellIndex;
} }
@ -67,23 +69,23 @@ abstract public class ExpressionStringComparisonRowFilter implements RowFilter {
Properties bindings = ExpressionUtils.createBindings(project); Properties bindings = ExpressionUtils.createBindings(project);
ExpressionUtils.bind(bindings, row, rowIndex, _columnName, cell); ExpressionUtils.bind(bindings, row, rowIndex, _columnName, cell);
Boolean invert = _invert;
Object value = _evaluable.evaluate(bindings); Object value = _evaluable.evaluate(bindings);
if (value != null) { if (value != null) {
if (value.getClass().isArray()) { if (value.getClass().isArray()) {
Object[] a = (Object[]) value; Object[] a = (Object[]) value;
for (Object v : a) { for (Object v : a) {
if (checkValue(v instanceof String ? ((String) v) : v.toString())) { if (checkValue(v instanceof String ? ((String) v) : v.toString())) {
return true; return (invert) ? false : true;
} }
} }
} else if (value instanceof Collection<?>) { } else if (value instanceof Collection<?>) {
for (Object v : ExpressionUtils.toObjectCollection(value)) { for (Object v : ExpressionUtils.toObjectCollection(value)) {
if (checkValue(v.toString())) { if (checkValue(v.toString())) {
return true; return (invert) ? false : true;
} }
} }
return false; return (invert) ? true : false;
} else if (value instanceof JSONArray) { } else if (value instanceof JSONArray) {
JSONArray a = (JSONArray) value; JSONArray a = (JSONArray) value;
int l = a.length(); int l = a.length();
@ -91,20 +93,20 @@ abstract public class ExpressionStringComparisonRowFilter implements RowFilter {
for (int i = 0; i < l; i++) { for (int i = 0; i < l; i++) {
try { try {
if (checkValue(a.get(i).toString())) { if (checkValue(a.get(i).toString())) {
return true; return (invert) ? false : true;
} }
} catch (JSONException e) { } catch (JSONException e) {
// ignore // ignore
} }
} }
return false; return (invert) ? true : false;
} else { } else {
if (checkValue(value instanceof String ? ((String) value) : value.toString())) { if (checkValue(value instanceof String ? ((String) value) : value.toString())) {
return true; return (invert) ? false : true;
} }
} }
} }
return false; return (invert) ? true : false;
} }
abstract protected boolean checkValue(String s); abstract protected boolean checkValue(String s);