package org.podcastpedia.web.searching; import java.io.Serializable; import java.util.List; import org.podcastpedia.common.types.LanguageCode; import org.podcastpedia.common.types.MediaType; import org.podcastpedia.common.types.OrderByOption; /** * Encapsulates search criteria. * Currently strongly tied to MySQL natural and boolean search. * */ public class SearchData implements Serializable { private static final long serialVersionUID = 4682314801277970962L; /** id of the search to be identified in the database */ private long searchId; /** holds query text in natural mode search - what the user typically inputs in the search bar*/ private String queryText; /** query text in natural mode */ private String queryTextInNaturalMode; /** any of these words */ private String anyOfTheseWords; /** all of these words **/ private String allTheseWords; /** exact pharse **/ private String exactPhrase; /** none of these words */ private String noneOfTheseWords; /** Language code the podcasts should be in */ private LanguageCode languageCode; /** search mode type - at the moment either natural or boolean */ private String searchMode; /** number of results per page */ private Integer numberResultsPerPage; private Integer currentPage; private Integer firstItemOnPage; //=(currentPage - 1)*numberResultsPerPage private boolean isOrderByPopularity; /** where to look for the given search criteria - at the moment podcast and episodes is availabel */ private String searchTarget; /** List of selected categories id to be looked for */ private List<Integer> categId; /** look for videos or audio files, or both (identified by "all") */ private MediaType mediaType; /** contains the target where to search the terms/words in **/ private String termsSearchTarget; /** order by criteria **/ private OrderByOption orderBy; /**flag to mark that the model attribute is for feed generation */ private boolean isForFeed; /** id of the tag that is being looked for */ private Integer tagId; /** placeholder for the query string to be passed to the next request */ private StringBuffer queryString; /** number of result pages - transmitted via the url */ private Integer nrResultPages; /** number of results found for the search criteria - transmitted also via the url */ private Integer nrOfResults; public static class Builder { String queryText; String searchTarget; MediaType mediaType; OrderByOption orderBy; String searchMode; Integer numberResultsPerPage; Integer currentPage; List<Integer> categId; String anyOfTheseWords; String allTheseWords; String exactPhrase; String noneOfTheseWords; Integer tagId; public SearchData build(){ return new SearchData(this); } public Builder queryText(String val){ queryText = val; return this; } public Builder tagId(Integer val){ tagId = val; return this; } public Builder exactPhrase(String val){ exactPhrase = val; return this; } public Builder noneOfTheseWords(String val){ noneOfTheseWords = val; return this; } public Builder anyOfTheseWords(String val){ anyOfTheseWords = val; return this; } public Builder allTheseWords(String val){ allTheseWords = val; return this; } public Builder categId(List<Integer> val){ categId = val; if(isAllNulls(val)) categId=null; return this; } private boolean isAllNulls(Iterable<?> array) { for (Object element : array) if (element != null) return false; return true; } public Builder searchTarget(String val){ searchTarget = val; return this; } public Builder mediaType(MediaType val){ mediaType = val; return this; } public Builder orderBy(OrderByOption val){ orderBy = val; return this; } public Builder searchMode(String val){ searchMode = val; return this; } public Builder numberResultsPerPage(Integer val){ numberResultsPerPage = val; return this; } public Builder currentPage(Integer val){ currentPage = val; return this; } } public Integer getNrResultPages() { return nrResultPages; } public void setNrResultPages(Integer nrResultPages) { this.nrResultPages = nrResultPages; } public Integer getNrOfResults() { return nrOfResults; } public void setNrOfResults(Integer nrOfResults) { this.nrOfResults = nrOfResults; } /** * default constructor */ public SearchData(){}; public SearchData(Builder builder) { queryText = builder.queryText; searchTarget = builder.searchTarget; mediaType = builder.mediaType; orderBy = builder.orderBy; searchMode = builder.searchMode; numberResultsPerPage = builder.numberResultsPerPage; currentPage = builder.currentPage; tagId = builder.tagId; categId = builder.categId; anyOfTheseWords = builder.anyOfTheseWords; allTheseWords = builder.allTheseWords; noneOfTheseWords = builder.noneOfTheseWords; exactPhrase = builder.exactPhrase; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((allTheseWords == null) ? 0 : allTheseWords.hashCode()); result = prime * result + ((anyOfTheseWords == null) ? 0 : anyOfTheseWords.hashCode()); result = prime * result + ((categId == null) ? 0 : categId.hashCode()); result = prime * result + ((currentPage == null) ? 0 : currentPage.hashCode()); result = prime * result + ((exactPhrase == null) ? 0 : exactPhrase.hashCode()); result = prime * result + ((firstItemOnPage == null) ? 0 : firstItemOnPage.hashCode()); result = prime * result + (isForFeed ? 1231 : 1237); result = prime * result + (isOrderByPopularity ? 1231 : 1237); result = prime * result + ((languageCode == null) ? 0 : languageCode.hashCode()); result = prime * result + ((mediaType == null) ? 0 : mediaType.hashCode()); result = prime * result + ((noneOfTheseWords == null) ? 0 : noneOfTheseWords.hashCode()); result = prime * result + ((numberResultsPerPage == null) ? 0 : numberResultsPerPage .hashCode()); result = prime * result + ((orderBy == null) ? 0 : orderBy.hashCode()); result = prime * result + ((queryText == null) ? 0 : queryText.hashCode()); result = prime * result + ((queryTextInNaturalMode == null) ? 0 : queryTextInNaturalMode.hashCode()); result = prime * result + (int) (searchId ^ (searchId >>> 32)); result = prime * result + ((searchMode == null) ? 0 : searchMode.hashCode()); result = prime * result + ((searchTarget == null) ? 0 : searchTarget.hashCode()); result = prime * result + ((tagId == null) ? 0 : tagId.hashCode()); result = prime * result + ((termsSearchTarget == null) ? 0 : termsSearchTarget .hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; SearchData other = (SearchData) obj; return this.hashCode() == other.hashCode(); } public StringBuffer getQueryString() { return queryString; } public void setQueryString(StringBuffer queryString) { this.queryString = queryString; } public Integer getTagId() { return tagId; } public void setTagId(Integer tagId) { this.tagId = tagId; } public boolean isForFeed() { return isForFeed; } public void setForFeed(boolean isForFeed) { this.isForFeed = isForFeed; } public OrderByOption getOrderBy() { return orderBy; } public void setOrderBy(OrderByOption orderBy) { this.orderBy = orderBy; } public String getTermsSearchTarget() { return termsSearchTarget; } public void setTermsSearchTarget(String termsSearchTarget) { this.termsSearchTarget = termsSearchTarget; } public String getExactPhrase() { return exactPhrase; } public void setExactPhrase(String exactPhrase) { this.exactPhrase = exactPhrase; } public String getQueryTextInNaturalMode() { return queryTextInNaturalMode; } public void setQueryTextInNaturalMode(String queryTextInNaturalMode) { this.queryTextInNaturalMode = queryTextInNaturalMode; } public String getAnyOfTheseWords() { return anyOfTheseWords; } public void setAnyOfTheseWords(String anyOfTheseWords) { this.anyOfTheseWords = anyOfTheseWords; } public String getAllTheseWords() { return allTheseWords; } public void setAllTheseWords(String allTheseWords) { this.allTheseWords = allTheseWords; } public String getNoneOfTheseWords() { return noneOfTheseWords; } public void setNoneOfTheseWords(String noneOfTheseWords) { this.noneOfTheseWords = noneOfTheseWords; } public String getQueryText() { return queryText; } public void setQueryText(String queryText) { this.queryText = queryText; } public long getSearchId() { return searchId; } public void setSearchId(long searchId) { this.searchId = searchId; } public MediaType getMediaType() { return mediaType; } public void setMediaType(MediaType mediaType) { this.mediaType = mediaType; } public String getSearchTarget() { return searchTarget; } public void setSearchTarget(String searchTarget) { this.searchTarget = searchTarget; } public List<Integer> getCategId() { return categId; } public void setCategId(List<Integer> categId) { this.categId = categId; } public Integer getFirstItemOnPage() { return firstItemOnPage; } public void setFirstItemOnPage(Integer firstItemOnPage) { this.firstItemOnPage = firstItemOnPage; } public Integer getCurrentPage() { return currentPage; } public void setCurrentPage(Integer currentPage) { this.currentPage = currentPage; } public Integer getNumberResultsPerPage() { return numberResultsPerPage; } public void setNumberResultsPerPage(Integer numberResultsPerPage) { this.numberResultsPerPage = numberResultsPerPage; } public LanguageCode getLanguageCode() { return languageCode; } public void setLanguageCode(LanguageCode languageCode) { this.languageCode = languageCode; } public boolean isOrderByPopularity() { return isOrderByPopularity; } public void setOrderByPopularity(boolean isOrderByPopularity) { this.isOrderByPopularity = isOrderByPopularity; } public void setSearchMode(String searchMode) { this.searchMode = searchMode; } public String getSearchMode() { return searchMode; } }