package org.jai.search.analytics; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.UUID; import org.apache.commons.lang.builder.ToStringBuilder; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; @SuppressWarnings("serial") public class SearchQueryInstruction implements Serializable { @JsonIgnore @JsonProperty(value = "eventidsuffix") private String _eventIdSuffix; @JsonProperty(value = "eventid", required = true) private String eventId; @JsonProperty(value = "hostedmachinename") private String hostedMachineName; @JsonProperty(value = "pageurl") private String pageUrl; @JsonProperty(value = "customerid") private Long customerId; @JsonProperty(value = "sessionid") private String sessionId; @JsonProperty(value = "querystring") private String queryString; @JsonProperty(value = "sortorder") private String sortOrder; @JsonProperty(value = "pagenumber") private Long pageNumber; @JsonProperty(value = "totalhits") private Long totalHits; @JsonProperty(value = "hitsshown") private Long hitsShown; @JsonProperty(value = "createdtimestampinmillis") private final Long createdTimeStampInMillis; @JsonProperty(value = "clickeddocid") private String clickedDocId; private Boolean favourite; public SearchQueryInstruction() { _eventIdSuffix = UUID.randomUUID().toString(); createdTimeStampInMillis = new Date().getTime(); } @JsonIgnore private Map<String, Set<String>> filters; @JsonProperty(value = "filters") private List<FacetFilter> _filters; public String getEventId() { return eventId; } public String getEventIdSuffix() { return _eventIdSuffix; } public void setEventIdSuffix(String eventIdSuffix) { this._eventIdSuffix = eventIdSuffix; } public Long getCreatedTimeStampInMillis() { return createdTimeStampInMillis; } public void setEventId(final String eventId) { this.eventId = eventId; } public String getHostedMachineName() { return hostedMachineName; } public void setHostedMachineName(final String hostedMachineName) { this.hostedMachineName = hostedMachineName; } public String getPageUrl() { return pageUrl; } public void setPageUrl(final String pageUrl) { this.pageUrl = pageUrl; } public Long getCustomerId() { return customerId; } public void setCustomerId(final Long customerId) { this.customerId = customerId; } public String getSessionId() { return sessionId; } public void setSessionId(final String sessionId) { this.sessionId = sessionId; } public String getQueryString() { return queryString; } public void setQueryString(final String queryString) { this.queryString = queryString; } public String getSortOrder() { return sortOrder; } public void setSortOrder(final String sortOrder) { this.sortOrder = sortOrder; } public Long getPageNumber() { return pageNumber; } public void setPageNumber(final Long pageNumber) { this.pageNumber = pageNumber; } public Long getTotalHits() { return totalHits; } public void setTotalHits(final Long totalHits) { this.totalHits = totalHits; } public Long getHitsShown() { return hitsShown; } public void setHitsShown(final Long hitsShown) { this.hitsShown = hitsShown; } public String getClickedDocId() { return clickedDocId; } public void setClickedDocId(final String clickedDocId) { this.clickedDocId = clickedDocId; } public Boolean getFavourite() { return favourite; } public void setFavourite(final Boolean favourite) { this.favourite = favourite; } public Map<String, Set<String>> getFilters() { return filters; } @JsonIgnore public List<FacetFilter> getFacetFilters() { return _filters; } public void setFilters(final Map<String, Set<String>> newFilters) { if (filters == null) { filters = new HashMap<>(); } else { filters.clear(); } if (_filters == null) { _filters = new ArrayList<SearchQueryInstruction.FacetFilter>(); } else { _filters.clear(); } for (final Entry<String, Set<String>> entry : newFilters.entrySet()) { Set<String> filter = filters.get(entry.getKey()); if (filter == null) { filter = new HashSet<>(); } for (final String filterValue : entry.getValue()) { _filters.add(new FacetFilter(entry.getKey(), filterValue)); filter.add(filterValue); } filters.put(entry.getKey(), filter); } // this.filters = newFilters; } @Override public String toString() { return new ToStringBuilder(this).append(hostedMachineName) .append(pageUrl).append(customerId).append(sessionId) .append(queryString).append(sortOrder).append(pageNumber) .append(totalHits).append(hitsShown) .append(createdTimeStampInMillis).append(clickedDocId) .append(filters).append(eventId).append(_filters) .append(_eventIdSuffix).toString(); } public static class FacetFilter implements Serializable { private String code; private String value; public FacetFilter() { } public FacetFilter(String code, String value) { this.code = code; this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } @Override public String toString() { return new ToStringBuilder(this).append(code).append(value) .toString(); } } }