2010-02-03 03:29:47 +01:00
|
|
|
package com.metaweb.gridworks.browsing.facets;
|
2010-01-27 08:52:05 +01:00
|
|
|
|
2010-01-27 23:27:22 +01:00
|
|
|
import java.util.LinkedList;
|
|
|
|
import java.util.List;
|
2010-01-27 08:52:05 +01:00
|
|
|
import java.util.Properties;
|
|
|
|
|
2010-01-27 23:27:22 +01:00
|
|
|
import org.json.JSONArray;
|
2010-01-27 08:52:05 +01:00
|
|
|
import org.json.JSONException;
|
|
|
|
import org.json.JSONObject;
|
2010-02-01 20:16:09 +01:00
|
|
|
import org.json.JSONWriter;
|
2010-01-27 08:52:05 +01:00
|
|
|
|
2010-02-03 03:29:47 +01:00
|
|
|
import com.metaweb.gridworks.browsing.DecoratedValue;
|
|
|
|
import com.metaweb.gridworks.browsing.FilteredRows;
|
|
|
|
import com.metaweb.gridworks.browsing.filters.ExpressionEqualRowFilter;
|
|
|
|
import com.metaweb.gridworks.browsing.filters.RowFilter;
|
|
|
|
import com.metaweb.gridworks.expr.Evaluable;
|
|
|
|
import com.metaweb.gridworks.expr.Parser;
|
|
|
|
import com.metaweb.gridworks.model.Project;
|
2010-01-27 08:52:05 +01:00
|
|
|
|
|
|
|
public class ListFacet implements Facet {
|
2010-01-28 02:43:09 +01:00
|
|
|
protected List<NominalFacetChoice> _selection = new LinkedList<NominalFacetChoice>();
|
|
|
|
protected List<NominalFacetChoice> _choices = new LinkedList<NominalFacetChoice>();
|
|
|
|
|
|
|
|
protected String _name;
|
|
|
|
protected String _expression;
|
2010-02-19 00:27:40 +01:00
|
|
|
protected String _columnName;
|
2010-01-28 02:43:09 +01:00
|
|
|
protected int _cellIndex;
|
|
|
|
protected Evaluable _eval;
|
|
|
|
|
|
|
|
public ListFacet() {
|
|
|
|
}
|
2010-01-27 08:52:05 +01:00
|
|
|
|
2010-02-01 20:16:09 +01:00
|
|
|
public void write(JSONWriter writer, Properties options)
|
|
|
|
throws JSONException {
|
2010-01-28 02:43:09 +01:00
|
|
|
|
2010-02-01 20:16:09 +01:00
|
|
|
writer.object();
|
|
|
|
writer.key("name"); writer.value(_name);
|
|
|
|
writer.key("expression"); writer.value(_expression);
|
2010-02-19 00:27:40 +01:00
|
|
|
writer.key("columnName"); writer.value(_columnName);
|
2010-01-28 02:43:09 +01:00
|
|
|
|
2010-02-01 20:16:09 +01:00
|
|
|
writer.key("choices"); writer.array();
|
2010-01-28 02:43:09 +01:00
|
|
|
for (NominalFacetChoice choice : _choices) {
|
2010-02-01 20:16:09 +01:00
|
|
|
choice.write(writer, options);
|
2010-01-28 02:43:09 +01:00
|
|
|
}
|
2010-02-01 20:16:09 +01:00
|
|
|
writer.endArray();
|
|
|
|
writer.endObject();
|
2010-01-27 08:52:05 +01:00
|
|
|
}
|
|
|
|
|
2010-02-19 00:27:40 +01:00
|
|
|
public void initializeFromJSON(Project project, JSONObject o) throws Exception {
|
2010-01-28 02:43:09 +01:00
|
|
|
_name = o.getString("name");
|
|
|
|
_expression = o.getString("expression");
|
2010-02-19 00:27:40 +01:00
|
|
|
_columnName = o.getString("columnName");
|
|
|
|
_cellIndex = project.columnModel.getColumnByName(_columnName).getCellIndex();
|
2010-01-28 02:43:09 +01:00
|
|
|
|
|
|
|
_eval = new Parser(_expression).getExpression();
|
|
|
|
_selection.clear();
|
|
|
|
|
|
|
|
JSONArray a = o.getJSONArray("selection");
|
2010-01-27 23:27:22 +01:00
|
|
|
int length = a.length();
|
|
|
|
|
|
|
|
for (int i = 0; i < length; i++) {
|
2010-01-28 02:43:09 +01:00
|
|
|
JSONObject oc = a.getJSONObject(i);
|
|
|
|
JSONObject ocv = oc.getJSONObject("v");
|
2010-01-27 23:27:22 +01:00
|
|
|
|
2010-01-28 02:43:09 +01:00
|
|
|
DecoratedValue decoratedValue = new DecoratedValue(
|
|
|
|
ocv.get("v"), ocv.getString("l"));
|
|
|
|
|
|
|
|
NominalFacetChoice nominalFacetChoice = new NominalFacetChoice(decoratedValue);
|
2010-02-19 00:27:40 +01:00
|
|
|
nominalFacetChoice.selected = true;
|
2010-01-28 02:43:09 +01:00
|
|
|
|
|
|
|
_selection.add(nominalFacetChoice);
|
2010-01-27 23:27:22 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-01-27 08:52:05 +01:00
|
|
|
public RowFilter getRowFilter() {
|
2010-01-30 02:05:30 +01:00
|
|
|
return _selection.size() == 0 ? null :
|
|
|
|
new ExpressionEqualRowFilter(_eval, _cellIndex, createMatches());
|
2010-01-27 08:52:05 +01:00
|
|
|
}
|
|
|
|
|
2010-01-28 02:43:09 +01:00
|
|
|
public void computeChoices(Project project, FilteredRows filteredRows) {
|
|
|
|
ExpressionNominalRowGrouper grouper =
|
|
|
|
new ExpressionNominalRowGrouper(_eval, _cellIndex);
|
|
|
|
|
|
|
|
filteredRows.accept(project, grouper);
|
2010-01-27 23:27:22 +01:00
|
|
|
|
2010-01-28 02:43:09 +01:00
|
|
|
_choices.clear();
|
|
|
|
_choices.addAll(grouper.choices.values());
|
2010-01-30 02:05:30 +01:00
|
|
|
|
|
|
|
for (NominalFacetChoice choice : _selection) {
|
|
|
|
if (grouper.choices.containsKey(choice.decoratedValue.value)) {
|
|
|
|
grouper.choices.get(choice.decoratedValue.value).selected = true;
|
|
|
|
} else {
|
|
|
|
choice.count = 0;
|
|
|
|
_choices.add(choice);
|
|
|
|
}
|
|
|
|
}
|
2010-01-28 02:43:09 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
protected Object[] createMatches() {
|
2010-01-30 02:05:30 +01:00
|
|
|
Object[] a = new Object[_selection.size()];
|
2010-01-28 02:43:09 +01:00
|
|
|
for (int i = 0; i < a.length; i++) {
|
2010-01-30 02:05:30 +01:00
|
|
|
a[i] = _selection.get(i).decoratedValue.value;
|
2010-01-28 02:43:09 +01:00
|
|
|
}
|
|
|
|
return a;
|
2010-01-27 08:52:05 +01:00
|
|
|
}
|
|
|
|
}
|