Java tutorial
/* * Copyright 2014 Studentmediene i Trondheim AS * * 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 no.dusken.momus.service.search; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class ArticleQueryBuilder { private Logger logger = LoggerFactory.getLogger(getClass()); private ArticleSearchParams search; private String fullQuery; private Map<String, Object> queryParams = new HashMap<>(); private final String baseQuery = "select a from Article a left join fetch a.status left join fetch a.publication"; private final String baseOrder = "order by a.publication.releaseDate DESC"; public ArticleQueryBuilder(ArticleSearchParams search) { this.search = search; buildQuery(); } private void buildQuery() { List<String> conditions = new ArrayList<>(); if (search.getFree() != null && search.getFree().length() > 0) { String[] words = search.getFree().split(" "); for (int i = 0; i < words.length; i++) { conditions.add("a.rawcontent like :free" + i); queryParams.put("free" + i, "%" + words[i].toLowerCase() + "%"); } } if (search.getStatus() != null) { conditions.add("a.status.id = :statusid"); queryParams.put("statusid", search.getStatus()); } if (search.getPersons() != null && search.getPersons().size() > 0) { int personCount = 0; for (Long person : search.getPersons()) { conditions.add("( :personid" + personCount + " member of a.journalists or " + ":personid" + personCount + " member of a.photographers )"); queryParams.put("personid" + personCount++, person); } } if (search.getSection() != null) { conditions.add("a.section.id = :secid"); // TODO fix to use section!! queryParams.put("secid", search.getSection()); } if (search.getPublication() != null) { conditions.add("a.publication.id = :pubid"); queryParams.put("pubid", search.getPublication()); } conditions.add("a.archived = :arch"); queryParams.put("arch", search.getArchived()); String allConditions = StringUtils.collectionToDelimitedString(conditions, " AND "); if (allConditions.equals("")) { fullQuery = baseQuery; } else { fullQuery = baseQuery + " WHERE " + allConditions; } fullQuery += " " + baseOrder; logger.debug("Search query: {}", fullQuery); } public String getBaseQuery() { return baseQuery; } public String getBaseOrder() { return baseOrder; } public String getFullQuery() { return fullQuery; } public Map<String, Object> getQueryParams() { return queryParams; } }