/** * Copyright (C) 2010 Peter Karich <jetwick_@_pannous_._info> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.jetwick.ui.jschart; import de.jetwick.es.ElasticTweetSearch; import de.jetwick.ui.util.FacetHelper; import de.jetwick.ui.util.LabeledLink; import de.jetwick.util.Helper; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxFallbackLink; import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.Model; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.search.facet.range.RangeFacet; /** * * @author Peter Karich, peat_hal 'at' users 'dot' sourceforge 'dot' net */ public class JSDateFilter extends Panel { private List<FacetHelper> facetList = new ArrayList<FacetHelper>(); private String dtKey = ElasticTweetSearch.DATE; private final float MAX_HEIGHT_IN_PX = 50.0f; private long max = 1; private long totalHits = 0; public JSDateFilter(String id) { super(id); final String dtVal = "Date Filter"; List<String> dateFilterList = new ArrayList<String>(); dateFilterList.add(dtKey); // TODO WICKET update dateFilter even if we call only update(rsp) ListView dateFilter = new ListView("dateFilterParent", dateFilterList) { @Override public void populateItem(final ListItem item) { String filter = getFilterName(dtKey); if (filter != null) { item.add(new LabeledLink("dateFilter", "Click to remove custom date filter") { @Override public void onClick(AjaxRequestTarget target) { onFilterChange(target, dtKey, null); } }.add(new AttributeAppender("title", new Model("Remove all filters from '" + dtVal + "'"), " "))); } else { String str = ""; if (totalHits > 0) str = "Select a date to filter results"; Label label = new Label("dateFilter", str); label.add(new AttributeAppender("class", new Model("gray"), " ")); item.add(label); } } }; add(dateFilter); ListView items = new ListView("items", facetList) { @Override public void populateItem(final ListItem item) { float zoomer = MAX_HEIGHT_IN_PX / max; final FacetHelper entry = (FacetHelper) item.getModelObject(); Label bar = new Label("itemSpan"); String additionalDateInfo = entry.count + " tweets"; String displayName = entry.displayName; try { Date date = Helper.toDate(displayName); int index = displayName.indexOf("T"); if (index > 0) additionalDateInfo += " on " + Helper.getMonthDay(date); displayName = Helper.getWeekDay(date); } catch (Exception ex) { } AttributeAppender app = new AttributeAppender("title", new Model(additionalDateInfo), " "); bar.add(app).add(new AttributeAppender("style", new Model("height:" + (int) (zoomer * entry.count) + "px"), " ")); final boolean selected = isAlreadyFiltered(entry.key, entry.value); Link link = new /*Indicating*/ AjaxFallbackLink("itemLink") { @Override public void onClick(AjaxRequestTarget target) { JSDateFilter.this.onFilterChange(target, entry.getFilter(), !selected); } }; link.add(app); Label label = new Label("itemLabel", displayName); link.add(bar).add(label); if (entry.count == 0) { link.setEnabled(false); link.add(new AttributeAppender("class", new Model("gray"), " ")); } if (selected) link.add(new AttributeAppender("class", new Model("filter-rm"), " ")); else link.add(new AttributeAppender("class", new Model("filter-add"), " ")); item.add(link); } }; add(items); } protected void onFilterChange(AjaxRequestTarget target, String filter, Boolean selected) { } protected boolean isAlreadyFiltered(String key, Object value) { return false; } public String getFilterName(String name) { return name; } public void update(SearchResponse rsp) { facetList.clear(); if (rsp == null) return; if (rsp != null && rsp.facets() != null) { RangeFacet rf = rsp.facets().facet(ElasticTweetSearch.DATE_FACET); if (rf != null) { int counter = 0; for (RangeFacet.Entry e : rf.entries()) { String display = e.getFromAsString(); String fromStr = e.getFromAsString(); String toStr = e.getToAsString(); counter++; if (counter == rf.entries().size()) { display = "Older"; fromStr = "*"; } else if (counter == 1) { display = "Last 8h"; toStr = "*"; } else if (counter == 2) { display = "Today"; } String filter = "[" + fromStr + " TO " + toStr + "]"; // System.out.println(display + " " + filter + " " + e.getCount()); facetList.add(new FacetHelper(dtKey, filter, display, e.getCount())); } } } max = 1; for (FacetHelper h : facetList) { if (h.count > max) max = h.count; } totalHits = rsp.hits().getTotalHits(); } public List<FacetHelper> getFacetList() { return facetList; } public static Integer getFacetQueryCount(Map<String, Integer> facetQueries, String entry) { if (facetQueries != null) return facetQueries.get(entry); return null; } }