Java tutorial
/* * AdvancedSearchPeople.java * * Developed by The Medici Archive Project Inc. (2010-2012) * * This file is part of DocSources. * * DocSources is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * DocSources is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package org.medici.bia.common.search; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.StringTokenizer; import org.apache.commons.httpclient.URIException; import org.apache.commons.httpclient.util.URIUtil; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; import org.apache.log4j.Logger; import org.apache.lucene.index.Term; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.NumericRangeQuery; import org.apache.lucene.search.PrefixQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; import org.medici.bia.command.search.AdvancedSearchCommand; import org.medici.bia.command.search.SimpleSearchCommand; import org.medici.bia.common.util.DateUtils; /** * * @author Lorenzo Pasquinelli (<a href=mailto:l.pasquinelli@gmail.com>l.pasquinelli@gmail.com</a>) * @author Matteo Doni (<a href=mailto:donimatteo@gmail.com>donimatteo@gmail.com</a>) * */ public class AdvancedSearchPeople extends AdvancedSearchAbstract { /** * */ private static final long serialVersionUID = -5135090884608784944L; private List<Integer> datesDay; private List<Integer> datesDayBetween; private List<Integer> datesMonth; private List<Integer> datesMonthBetween; private List<String> datesTypes; private List<Integer> datesYear; private List<Integer> datesYearBetween; private List<Date> datesLastUpdate; private List<Date> datesLastUpdateBetween; private List<DateType> datesLastUpdateTypes; private List<Date> datesCreated; private List<Date> datesCreatedBetween; private List<DateType> datesCreatedTypes; private List<Gender> gender; private Boolean logicalDelete; private List<String> names; private List<NameType> namesTypes; private List<String> peopleId; private List<String> place; private List<Integer> placeId; private List<String> placeType; private List<String> researchNotes; private List<String> roleCategories; private List<String> titleOccWord; private List<String> titlesOcc; private List<Integer> titlesOccId; private List<String> exactName; private List<Integer> personId; private List<String> words; private List<WordType> wordsTypes; private static Logger logger = Logger.getLogger(AdvancedSearchPeople.class); /** * Default constructor. */ public AdvancedSearchPeople() { super(); names = new ArrayList<String>(0); namesTypes = new ArrayList<AdvancedSearchAbstract.NameType>(0); exactName = new ArrayList<String>(0); words = new ArrayList<String>(0); wordsTypes = new ArrayList<AdvancedSearchDocument.WordType>(0); datesTypes = new ArrayList<String>(0); datesYear = new ArrayList<Integer>(0); datesMonth = new ArrayList<Integer>(0); datesDay = new ArrayList<Integer>(0); datesYearBetween = new ArrayList<Integer>(0); datesMonthBetween = new ArrayList<Integer>(0); datesDayBetween = new ArrayList<Integer>(0); datesLastUpdate = new ArrayList<Date>(0); datesLastUpdateBetween = new ArrayList<Date>(0); datesLastUpdateTypes = new ArrayList<DateType>(0); datesCreated = new ArrayList<Date>(0); datesCreatedBetween = new ArrayList<Date>(0); datesCreatedTypes = new ArrayList<DateType>(0); peopleId = new ArrayList<String>(0); personId = new ArrayList<Integer>(0); placeId = new ArrayList<Integer>(0); place = new ArrayList<String>(0); placeType = new ArrayList<String>(0); roleCategories = new ArrayList<String>(0); titlesOcc = new ArrayList<String>(0); titlesOccId = new ArrayList<Integer>(0); titleOccWord = new ArrayList<String>(0); logicalDelete = null; researchNotes = new ArrayList<String>(0); gender = new ArrayList<AdvancedSearchAbstract.Gender>(0); } /** * {@inheritDoc} */ @Override public void initFromAdvancedSearchCommand(AdvancedSearchCommand command) { //Names if ((command.getNameParts() != null) && (command.getNameParts().size() > 0)) { namesTypes = new ArrayList<NameType>(command.getNameParts().size()); names = new ArrayList<String>(command.getNameParts().size()); for (String singleWord : command.getNameParts()) { //MD: This is for refine search when the URLencoder change the space in "+" and the special character "\u00E7" in "%E7" singleWord = singleWord.replace("+", "%20"); singleWord = singleWord.replace("%E7", "\u00E7"); StringTokenizer stringTokenizer = new StringTokenizer(singleWord, "|"); try { if (stringTokenizer.countTokens() == 2) { namesTypes.add(NameType.valueOf(stringTokenizer.nextToken().replace(" ", ""))); names.add(URIUtil.decode(stringTokenizer.nextToken(), "UTF-8")); } else { continue; } } catch (URIException uriException) { logger.debug(uriException); namesTypes.remove(namesTypes.size() - 1); } } } else { namesTypes = new ArrayList<AdvancedSearchAbstract.NameType>(0); names = new ArrayList<String>(0); } //Exact Name if ((command.getPerson() != null) && (command.getPerson().size() > 0)) { personId = new ArrayList<Integer>(command.getPerson().size()); exactName = new ArrayList<String>(command.getPerson().size()); for (String singleWord : command.getPerson()) { //MD: This is for refine search when the URLencoder change the space in "+" and the special character "\u00E7" in "%E7" singleWord = singleWord.replace("+", "%20"); singleWord = singleWord.replace("%E7", "\u00E7"); StringTokenizer stringTokenizer = new StringTokenizer(singleWord, "|"); try { if (stringTokenizer.countTokens() == 0) { continue; } else if (stringTokenizer.countTokens() == 1) { personId.add(new Integer(0)); exactName.add(URIUtil.decode(stringTokenizer.nextToken(), "UTF-8")); } else if (stringTokenizer.countTokens() == 2) { String singleId = stringTokenizer.nextToken(); String singleText = stringTokenizer.nextToken(); if (NumberUtils.isNumber(singleId)) { personId.add(NumberUtils.createInteger(singleId)); } else { personId.add(new Integer(0)); } exactName.add(URIUtil.decode(singleText, "UTF-8")); } } catch (NumberFormatException numberFormatException) { logger.debug(numberFormatException); } catch (URIException uriException) { logger.debug(uriException); personId.remove(personId.size() - 1); } } } else { exactName = new ArrayList<String>(0); personId = new ArrayList<Integer>(0); } //Words if ((command.getWord() != null) && (command.getWord().size() > 0)) { //wordsTypes = new ArrayList<WordType>(command.getWord().size()); words = new ArrayList<String>(command.getWord().size()); for (String singleWord : command.getWord()) { //StringTokenizer stringTokenizer = new StringTokenizer(singleWord, "|"); try { //if (stringTokenizer.countTokens() == 2) { //wordsTypes.add(WordType.valueOf(stringTokenizer.nextToken())); //words.add(URIUtil.decode(stringTokenizer.nextToken(), "UTF-8")); words.add(URIUtil.decode(singleWord, "UTF-8")); //} else { // continue; //} } catch (URIException uriException) { logger.debug(uriException); //wordsTypes.remove(wordsTypes.size()-1); words.remove(words.size() - 1); } } } else { wordsTypes = new ArrayList<WordType>(0); words = new ArrayList<String>(0); } //Date if ((command.getDate() != null) && (command.getDate().size() > 0)) { datesTypes = new ArrayList<String>(command.getDate().size()); datesYear = new ArrayList<Integer>(command.getDate().size()); datesMonth = new ArrayList<Integer>(command.getDate().size()); datesDay = new ArrayList<Integer>(command.getDate().size()); datesYearBetween = new ArrayList<Integer>(command.getDate().size()); datesMonthBetween = new ArrayList<Integer>(command.getDate().size()); datesDayBetween = new ArrayList<Integer>(command.getDate().size()); for (String singleWord : command.getDate()) { //e.g. After|1222|01|12|1223|12|12 String[] fields = StringUtils.splitPreserveAllTokens(singleWord, "|"); try { datesTypes.add(URIUtil.decode(fields[0], "UTF-8")); } catch (URIException uriException) { logger.debug(uriException); } datesYear.add(DateUtils.getDateYearFromString(fields[1])); datesMonth.add(DateUtils.getDateMonthFromString(fields[2])); datesDay.add(DateUtils.getDateDayFromString(fields[3])); datesYearBetween.add(DateUtils.getDateYearFromString(fields[4])); datesMonthBetween.add(DateUtils.getDateMonthFromString(fields[5])); datesDayBetween.add(DateUtils.getDateDayFromString(fields[6])); } } else { datesTypes = new ArrayList<String>(0); datesYear = new ArrayList<Integer>(0); datesMonth = new ArrayList<Integer>(0); datesDay = new ArrayList<Integer>(0); datesYearBetween = new ArrayList<Integer>(0); datesMonthBetween = new ArrayList<Integer>(0); datesDayBetween = new ArrayList<Integer>(0); } //Date lastUpdate if ((command.getDateLastUpdate() != null) && (command.getDateLastUpdate().size() > 0)) { datesLastUpdateTypes = new ArrayList<DateType>(command.getDateLastUpdate().size()); datesLastUpdate = new ArrayList<Date>(command.getDateLastUpdate().size()); datesLastUpdateBetween = new ArrayList<Date>(command.getDateLastUpdate().size()); for (String singleWord : command.getDateLastUpdate()) { //e.g. After|20120112|20120112 String[] fields = StringUtils.splitPreserveAllTokens(singleWord, "|"); datesLastUpdateTypes.add(DateType.valueOf(fields[0])); datesLastUpdate.add(DateUtils.getDateFromString(fields[1])); datesLastUpdateBetween.add(DateUtils.getDateFromString(fields[2])); } } else { datesLastUpdateTypes = new ArrayList<DateType>(0); datesLastUpdate = new ArrayList<Date>(0); datesLastUpdateBetween = new ArrayList<Date>(0); } //Date Created if ((command.getDateCreated() != null) && (command.getDateCreated().size() > 0)) { datesCreatedTypes = new ArrayList<DateType>(command.getDateCreated().size()); datesCreated = new ArrayList<Date>(command.getDateCreated().size()); datesCreatedBetween = new ArrayList<Date>(command.getDateCreated().size()); for (String singleWord : command.getDateCreated()) { //e.g. After|20120112|20120112 String[] fields = StringUtils.splitPreserveAllTokens(singleWord, "|"); datesCreatedTypes.add(DateType.valueOf(fields[0])); datesCreated.add(DateUtils.getDateFromString(fields[1])); datesCreatedBetween.add(DateUtils.getDateFromString(fields[2])); } } else { datesCreatedTypes = new ArrayList<DateType>(0); datesCreated = new ArrayList<Date>(0); datesCreatedBetween = new ArrayList<Date>(0); } //Role Categories if ((command.getRoleCategory() != null) && (command.getRoleCategory().size() > 0)) { roleCategories = new ArrayList<String>(command.getRoleCategory().size()); for (String singleWord : command.getRoleCategory()) { try { roleCategories.add(URIUtil.decode(singleWord, "UTF-8")); } catch (URIException uriException) { logger.debug(uriException); roleCategories.remove(roleCategories.size() - 1); } } } else { roleCategories = new ArrayList<String>(0); } //OccupationsWords if ((command.getOccupationWord() != null) && (command.getOccupationWord().size() > 0)) { titleOccWord = new ArrayList<String>(command.getOccupationWord().size()); for (String singleWord : command.getOccupationWord()) { //MD: This is for refine search when the URLencoder change the space in "+" and the special character "\u00E7" in "%E7" singleWord = singleWord.replace("+", "%20"); singleWord = singleWord.replace("%E7", "\u00E7"); try { titleOccWord.add(URIUtil.decode(singleWord, "UTF-8")); } catch (URIException uriException) { logger.debug(uriException); } } } else { titleOccWord = new ArrayList<String>(0); } //Occupations if ((command.getOccupation() != null) && (command.getOccupation().size() > 0)) { titlesOccId = new ArrayList<Integer>(command.getOccupation().size()); titlesOcc = new ArrayList<String>(command.getOccupation().size()); for (String singleWord : command.getOccupation()) { //MD: This is for refine search when the URLencoder change the space in "+" and the special character "\u00E7" in "%E7" singleWord = singleWord.replace("+", "%20"); singleWord = singleWord.replace("%E7", "\u00E7"); StringTokenizer stringTokenizer = new StringTokenizer(singleWord, "|"); try { if (stringTokenizer.countTokens() == 0) { continue; } else if (stringTokenizer.countTokens() == 1) { titlesOccId.add(new Integer(0)); titlesOcc.add(URIUtil.decode(stringTokenizer.nextToken(), "UTF-8")); } else if (stringTokenizer.countTokens() == 2) { String singleId = stringTokenizer.nextToken(); String singleText = stringTokenizer.nextToken(); if (NumberUtils.isNumber(singleId)) { titlesOccId.add(NumberUtils.createInteger(singleId)); } else { titlesOccId.add(new Integer(0)); } titlesOcc.add(URIUtil.decode(singleText, "UTF-8")); } } catch (NumberFormatException numberFormatException) { logger.debug(numberFormatException); } catch (URIException uriException) { logger.debug(uriException); titlesOccId.remove(titlesOccId.size() - 1); } } } else { titlesOcc = new ArrayList<String>(0); titlesOccId = new ArrayList<Integer>(0); } //Gender if ((command.getGender() != null) && (command.getGender().size() > 0)) { gender = new ArrayList<AdvancedSearchAbstract.Gender>(command.getGender().size()); for (String singleWord : command.getGender()) { try { gender.add(Gender.valueOf(URIUtil.decode(singleWord, "UTF-8"))); } catch (URIException uriException) { logger.debug(uriException); } } } else { gender = new ArrayList<AdvancedSearchAbstract.Gender>(0); } //Places if ((command.getPlace() != null) && (command.getPlace().size() > 0)) { placeId = new ArrayList<Integer>(command.getPlace().size()); place = new ArrayList<String>(command.getPlace().size()); placeType = new ArrayList<String>(command.getPlace().size()); for (String singleWord : command.getPlace()) { //MD: This is for refine search when the URLencoder change the space in "+" and the special character "\u00E7" in "%E7" singleWord = singleWord.replace("+", "%20"); singleWord = singleWord.replace("%E7", "\u00E7"); StringTokenizer stringTokenizer = new StringTokenizer(singleWord, "|"); try { if (stringTokenizer.countTokens() == 0) { continue; } else if (stringTokenizer.countTokens() == 1) { placeId.add(new Integer(0)); place.add(URIUtil.decode(stringTokenizer.nextToken(), "UTF-8")); } else if (stringTokenizer.countTokens() == 2) { String singleId = stringTokenizer.nextToken(); String singleText = stringTokenizer.nextToken(); if (NumberUtils.isNumber(singleId)) { placeId.add(NumberUtils.createInteger(singleId)); } else { placeId.add(new Integer(0)); } place.add(URIUtil.decode(singleText, "UTF-8")); } else if (stringTokenizer.countTokens() == 3) { placeType.add(stringTokenizer.nextToken()); String singleId = stringTokenizer.nextToken(); String singleText = stringTokenizer.nextToken(); if (NumberUtils.isNumber(singleId)) { placeId.add(NumberUtils.createInteger(singleId)); } else { placeId.add(new Integer(0)); } place.add(URIUtil.decode(singleText, "UTF-8")); } } catch (NumberFormatException numberFormatException) { logger.debug(numberFormatException); } catch (URIException uriException) { logger.debug(uriException); placeId.remove(placeId.size() - 1); } } } else { placeId = new ArrayList<Integer>(0); place = new ArrayList<String>(0); placeType = new ArrayList<String>(0); } //Research Notes if ((command.getResearchNotes() != null) && (command.getResearchNotes().size() > 0)) { researchNotes = new ArrayList<String>(command.getResearchNotes().size()); for (String singleWord : command.getResearchNotes()) { //MD: This is for refine search when the URLencoder change the space in "+" and the special character "\u00E7" in "%E7" singleWord = singleWord.replace("+", "%20"); singleWord = singleWord.replace("%E7", "\u00E7"); try { researchNotes.add(URIUtil.decode(singleWord, "UTF-8")); } catch (URIException uriException) { logger.debug(uriException); researchNotes.remove(researchNotes.size() - 1); } } } else { researchNotes = new ArrayList<String>(0); } //PersonId if ((command.getPersonId() != null) && (command.getPersonId().size() > 0)) { peopleId = new ArrayList<String>(command.getPersonId().size()); for (String singleWord : command.getPersonId()) { try { peopleId.add(URIUtil.decode(singleWord, "UTF-8")); } catch (NumberFormatException numberFormatException) { logger.debug(numberFormatException); } catch (URIException uriException) { logger.debug(uriException); } } } else { peopleId = new ArrayList<String>(0); } //Logical Delete if (command.getLogicalDelete() != null) { if (command.getLogicalDelete().equals("true")) { logicalDelete = Boolean.TRUE; } else { logicalDelete = Boolean.FALSE; } } } /** * {@inheritDoc} */ @Override public void initFromSimpleSearchCommand(SimpleSearchCommand command) { namesTypes.add(NameType.AllNameTypes); names.add(command.getText()); } /** * {@inheritDoc} */ @Override public Boolean empty() { if ((names.size() > 0) || (personId.size() > 0) || (words.size() > 0) || (datesTypes.size() > 0) || (datesLastUpdateTypes.size() > 0) || (roleCategories.size() > 0) || (titleOccWord.size() > 0) || (titlesOccId.size() > 0) || (gender.size() > 0) || (placeId.size() > 0) || (researchNotes.size() > 0) || (peopleId.size() > 0)) { return Boolean.FALSE; } return Boolean.TRUE; } /** * This method return a JPA Query object. */ @Override public String toJPAQuery() { // TODO Auto-generated method stub StringBuilder jpaQuery = new StringBuilder("FROM People WHERE "); //Names if (names.size() > 0) { StringBuilder namesQuery = new StringBuilder("("); for (int i = 0; i < names.size(); i++) { String[] wordsSingleNames = StringUtils.split(names.get(i), " "); if (namesQuery.length() > 1) { namesQuery.append(" AND "); } if (namesTypes.get(i).equals(NameType.AllNameTypes)) { for (int j = 0; j < wordsSingleNames.length; j++) { namesQuery.append("(mapNameLf like '%"); namesQuery.append(wordsSingleNames[j].toLowerCase().replace("'", "''")); namesQuery.append("%' OR "); namesQuery .append("(personId IN (SELECT person.personId FROM AltName WHERE altName like '%"); namesQuery.append(wordsSingleNames[j].toLowerCase().replace("'", "''")); namesQuery.append("%')))"); if (j < (wordsSingleNames.length - 1)) { namesQuery.append(" AND "); } } } else { for (int j = 0; j < wordsSingleNames.length; j++) { namesQuery .append("(personId IN (SELECT person.personId FROM AltName WHERE altName like '%"); namesQuery.append(wordsSingleNames[j].toLowerCase().replace("'", "''")); namesQuery.append("%' AND nameType like '"); namesQuery.append(namesTypes.get(i).toString().toLowerCase()); namesQuery.append("'))"); if (j < (wordsSingleNames.length - 1)) { namesQuery.append(" AND "); } } } } namesQuery.append(')'); if (!namesQuery.toString().equals("")) { if (jpaQuery.length() > 18) { jpaQuery.append(" AND "); } jpaQuery.append(namesQuery); } } //Exact Name if (personId.size() > 0) { StringBuilder personIdQuery = new StringBuilder("("); for (int i = 0; i < personId.size(); i++) { if (personId.get(i) > 0) { if (personIdQuery.length() > 1) { personIdQuery.append(" AND "); } personIdQuery.append("(personId="); personIdQuery.append(personId.get(i).toString()); personIdQuery.append(")"); } } personIdQuery.append(')'); if (!personIdQuery.toString().equals("()")) { if (jpaQuery.length() > 18) { jpaQuery.append(" AND "); } jpaQuery.append(personIdQuery); } } //Words if (words.size() > 0) { StringBuilder wordsQuery = new StringBuilder("("); for (int i = 0; i < words.size(); i++) { if (wordsQuery.length() > 1) { wordsQuery.append(" AND "); } wordsQuery.append("((mapNameLf like '%"); wordsQuery.append(words.get(i).toLowerCase().replace("'", "''")); wordsQuery.append("%') OR "); wordsQuery.append("((bioNotes like '%"); wordsQuery.append(words.get(i).toLowerCase().replace("'", "''")); wordsQuery.append("%') OR "); wordsQuery.append("(staffNotes like '%"); wordsQuery.append(words.get(i).toLowerCase().replace("'", "''")); wordsQuery.append("%') OR "); wordsQuery.append("((mapNameLf like '%"); wordsQuery.append(words.get(i).toLowerCase().replace("'", "''")); wordsQuery.append("%') OR "); wordsQuery.append("(personId IN (SELECT person.personId FROM AltName WHERE altName like '%"); wordsQuery.append(names.get(i).toLowerCase().replace("'", "''")); wordsQuery.append("%'))"); } wordsQuery.append(')'); if (!wordsQuery.toString().equals("")) { if (jpaQuery.length() > 18) { jpaQuery.append(" AND "); } jpaQuery.append(wordsQuery); } } //Dates if (datesTypes.size() > 0) { StringBuilder datesQuery = new StringBuilder("("); for (int i = 0; i < datesTypes.size(); i++) { if (datesTypes.get(i) == null) { continue; } if (datesQuery.length() > 1) { datesQuery.append(" AND "); } if (datesTypes.get(i).equals("Born after")) { //For years that have two numbers datesQuery.append( "((bornYear < 100 AND STR_TO_DATE(CONCAT('00', bornYear, ',' , bornMonth, ',', bornDay),'%Y,%m,%d')>"); datesQuery.append( DateUtils.getDateForSQLQuery(datesYear.get(i), datesMonth.get(i), datesDay.get(i))); datesQuery.append( ") OR (bornYear < 1000 AND bornYear >= 100 AND STR_TO_DATE(CONCAT('0', bornYear, ',' , bornMonth, ',', bornDay),'%Y,%m,%d')>"); datesQuery.append( DateUtils.getDateForSQLQuery(datesYear.get(i), datesMonth.get(i), datesDay.get(i))); datesQuery.append( ") OR (bornYear >= 1000 AND STR_TO_DATE(CONCAT(bornYear, ',' , bornMonth, ',', bornDay),'%Y,%m,%d')>"); datesQuery.append( DateUtils.getDateForSQLQuery(datesYear.get(i), datesMonth.get(i), datesDay.get(i))); datesQuery.append(")) AND bornDateBc = false"); } else if (datesTypes.get(i).equals("Dead by")) { datesQuery.append( "((deathYear < 100 AND STR_TO_DATE(CONCAT('00', deathYear, ',' , deathMonth, ',', deathDay),'%Y, %m ,%d')<="); datesQuery.append( DateUtils.getDateForSQLQuery(datesYear.get(i), datesMonth.get(i), datesDay.get(i))); datesQuery.append( ") OR (deathYear < 1000 AND deathYear >= 100 AND STR_TO_DATE(CONCAT('0', deathYear, ',' , deathMonth, ',', deathDay),'%Y, %m ,%d')<="); datesQuery.append( DateUtils.getDateForSQLQuery(datesYear.get(i), datesMonth.get(i), datesDay.get(i))); datesQuery.append( ") OR (deathYear >= 1000 AND STR_TO_DATE(CONCAT(deathYear, ',' , deathMonth, ',', deathDay),'%Y, %m ,%d')<="); datesQuery.append( DateUtils.getDateForSQLQuery(datesYear.get(i), datesMonth.get(i), datesDay.get(i))); datesQuery.append(")) AND deathDateBc = false"); } else if (datesTypes.get(i).equals("Lived between")) { datesQuery.append( "(((bornYear < 100 AND STR_TO_DATE(CONCAT('00', bornYear, ',' , bornMonth, ',', bornDay),'%Y, %m ,%d')<"); datesQuery.append(DateUtils.getDateForSQLQuery(datesYearBetween.get(i), datesMonthBetween.get(i), datesDayBetween.get(i))); datesQuery.append( ") OR (bornYear < 1000 AND bornYear >= 100 AND STR_TO_DATE(CONCAT('0', bornYear, ',' , bornMonth, ',', bornDay),'%Y, %m ,%d')<"); datesQuery.append(DateUtils.getDateForSQLQuery(datesYearBetween.get(i), datesMonthBetween.get(i), datesDayBetween.get(i))); datesQuery.append( ") OR (bornYear >= 1000 AND STR_TO_DATE(CONCAT(bornYear, ',' , bornMonth, ',', bornDay),'%Y, %m ,%d')<"); datesQuery.append(DateUtils.getDateForSQLQuery(datesYearBetween.get(i), datesMonthBetween.get(i), datesDayBetween.get(i))); datesQuery.append( ")) AND ((deathYear < 100 AND STR_TO_DATE(CONCAT('00', deathYear, ',' , deathMonth, ',', deathDay),'%Y, %m ,%d')>"); datesQuery.append( DateUtils.getDateForSQLQuery(datesYear.get(i), datesMonth.get(i), datesDay.get(i))); datesQuery.append( ") OR (deathYear < 1000 AND deathYear >=100 AND STR_TO_DATE(CONCAT('0', deathYear, ',' , deathMonth, ',', deathDay),'%Y, %m ,%d')>"); datesQuery.append( DateUtils.getDateForSQLQuery(datesYear.get(i), datesMonth.get(i), datesDay.get(i))); datesQuery.append( ") OR (deathYear >= 1000 AND STR_TO_DATE(CONCAT(deathYear, ',' , deathMonth, ',', deathDay),'%Y, %m ,%d')>"); datesQuery.append( DateUtils.getDateForSQLQuery(datesYear.get(i), datesMonth.get(i), datesDay.get(i))); datesQuery.append( ")) AND ((deathYear < 100 AND STR_TO_DATE(CONCAT('00', deathYear, ',' , deathMonth, ',', deathDay),'%Y, %m ,%d')<"); datesQuery.append(DateUtils.getDateForSQLQuery(datesYearBetween.get(i), datesMonthBetween.get(i), datesDayBetween.get(i))); datesQuery.append( ") OR (deathYear < 1000 AND deathYear >= 100 AND STR_TO_DATE(CONCAT('0', deathYear, ',' , deathMonth, ',', deathDay),'%Y, %m ,%d')<"); datesQuery.append(DateUtils.getDateForSQLQuery(datesYearBetween.get(i), datesMonthBetween.get(i), datesDayBetween.get(i))); datesQuery.append( ") OR (deathYear >= 1000 AND STR_TO_DATE(CONCAT(deathYear, ',' , deathMonth, ',', deathDay),'%Y, %m ,%d')<"); datesQuery.append(DateUtils.getDateForSQLQuery(datesYearBetween.get(i), datesMonthBetween.get(i), datesDayBetween.get(i))); datesQuery.append("))) AND bornDateBc = false AND deathDateBc = false"); } else if (datesTypes.get(i).equals("Born/Died on")) { StringBuilder bornQuery = new StringBuilder(0); StringBuilder deathQuery = new StringBuilder(0); if (datesYear.get(i) != null) { bornQuery.append("(bornYear ="); bornQuery.append(datesYear.get(i) + ")"); deathQuery.append("(deathYear ="); deathQuery.append(datesYear.get(i) + ")"); if (datesMonth.get(i) != null || datesDay.get(i) != null) { bornQuery.append(" AND "); deathQuery.append(" AND "); } } if (datesMonth.get(i) != null) { bornQuery.append("(bornMonth ="); bornQuery.append(datesMonth.get(i) + ")"); deathQuery.append("(deathMonth ="); deathQuery.append(datesMonth.get(i) + ")"); if (datesDay.get(i) != null) { bornQuery.append(" AND "); deathQuery.append(" AND "); } } if (datesDay.get(i) != null) { bornQuery.append("(bornDay ="); bornQuery.append(datesDay.get(i) + ")"); deathQuery.append("(deathDay ="); deathQuery.append(datesDay.get(i) + ")"); } datesQuery.append( bornQuery + " OR " + deathQuery + "AND bornDateBc = false AND deathDateBc = false"); } } datesQuery.append(')'); if (!datesQuery.toString().equals("")) { if (jpaQuery.length() > 18) { jpaQuery.append(" AND "); } jpaQuery.append(datesQuery); } } // date created if (datesCreatedTypes.size() > 0) { StringBuilder datesCreatedQuery = new StringBuilder("("); for (int i = 0; i < datesCreatedTypes.size(); i++) { if (datesCreatedTypes.get(i) == null) { continue; } if (datesCreatedQuery.length() > 1) { datesCreatedQuery.append(" AND "); } if (datesCreatedTypes.get(i).equals(DateType.From)) { datesCreatedQuery.append("(dateCreated >= '"); datesCreatedQuery.append(DateUtils.getMYSQLDate(datesCreated.get(i))); datesCreatedQuery.append(')'); } else if (datesCreatedTypes.get(i).equals(DateType.Before)) { datesCreatedQuery.append("(dateCreated <= '"); datesCreatedQuery.append(DateUtils.getMYSQLDate(datesCreated.get(i))); datesCreatedQuery.append(')'); } else if (datesCreatedTypes.get(i).equals(DateType.Between)) { datesCreatedQuery.append("(dateCreated between '"); datesCreatedQuery.append(DateUtils.getMYSQLDate(datesCreated.get(i))); datesCreatedQuery.append("' AND '"); datesCreatedQuery.append(DateUtils.getMYSQLDate(datesCreatedBetween.get(i))); datesCreatedQuery.append("')"); } else if (datesCreatedTypes.get(i).equals(DateType.InOn)) { } } datesCreatedQuery.append(')'); if (!datesCreatedQuery.toString().equals("")) { if (jpaQuery.length() > 20) { jpaQuery.append(" AND "); } jpaQuery.append(datesCreatedQuery); } } // Last update if (datesLastUpdateTypes.size() > 0) { StringBuilder datesLastUpdateQuery = new StringBuilder("("); for (int i = 0; i < datesLastUpdateTypes.size(); i++) { if (datesLastUpdateTypes.get(i) == null) { continue; } if (datesLastUpdateQuery.length() > 1) { datesLastUpdateQuery.append(" AND "); } if (datesLastUpdateTypes.get(i).equals(DateType.From)) { datesLastUpdateQuery.append("(DATE_FORMAT(lastUpdate, '%Y-%m-%d') >= '"); datesLastUpdateQuery.append(DateUtils.getMYSQLDate(datesLastUpdate.get(i))); datesLastUpdateQuery.append(')'); } else if (datesLastUpdateTypes.get(i).equals(DateType.Before)) { datesLastUpdateQuery.append("(DATE_FORMAT(lastUpdate, '%Y-%m-%d') <= '"); datesLastUpdateQuery.append(DateUtils.getMYSQLDate(datesLastUpdate.get(i))); datesLastUpdateQuery.append(')'); } else if (datesLastUpdateTypes.get(i).equals(DateType.Between)) { datesLastUpdateQuery.append("(DATE_FORMAT(lastUpdate, '%Y-%m-%d') between '"); datesLastUpdateQuery.append(DateUtils.getMYSQLDate(datesLastUpdate.get(i))); datesLastUpdateQuery.append("' AND '"); datesLastUpdateQuery.append(DateUtils.getMYSQLDate(datesLastUpdateBetween.get(i))); datesLastUpdateQuery.append("')"); } else if (datesLastUpdateTypes.get(i).equals(DateType.InOn)) { } } datesLastUpdateQuery.append(')'); if (!datesLastUpdateQuery.toString().equals("")) { if (jpaQuery.length() > 20) { jpaQuery.append(" AND "); } jpaQuery.append(datesLastUpdateQuery); } } //Role Categories if (roleCategories.size() > 0) { StringBuilder roleCatQuery = new StringBuilder("("); for (int i = 0; i < roleCategories.size(); i++) { if (roleCatQuery.length() > 1) { roleCatQuery.append(" AND "); } if (roleCategories.get(i).equals("ARTISTS and ARTISANS") || roleCategories.get(i).equals("CORPORATE BODIES") || roleCategories.get(i).equals("ECCLESIASTICS") || roleCategories.get(i).equals("HEADS of STATE") || roleCategories.get(i).equals("MILITARY and NAVAL PERSONNEL") || roleCategories.get(i).equals("NOBLES") || roleCategories.get(i).equals("PROFESSIONS") || roleCategories.get(i).equals("SCHOLARLY and LITERARY") || roleCategories.get(i).equals("STATE and COURT PERSONNEL") || roleCategories.get(i).equals("UNASSIGNED")) { roleCatQuery.append( "(personId IN (SELECT person.personId FROM org.medici.bia.domain.PoLink WHERE titleOccList.roleCat.roleCatMajor like '%"); roleCatQuery.append(roleCategories.get(i)); roleCatQuery.append("%'))"); } else { roleCatQuery.append( "(personId IN (SELECT person.personId FROM org.medici.bia.domain.PoLink WHERE titleOccList.roleCat.roleCatMinor like '%"); roleCatQuery.append(roleCategories.get(i)); roleCatQuery.append("%'))"); } } roleCatQuery.append(')'); if (!roleCatQuery.toString().equals("")) { if (jpaQuery.length() > 18) { jpaQuery.append(" AND "); } jpaQuery.append(roleCatQuery); } } //OccupationsWord if (titleOccWord.size() > 0) { StringBuilder titleOccWordQuery = new StringBuilder("("); for (int i = 0; i < titleOccWord.size(); i++) { String[] wordsOccupation = StringUtils.split(titleOccWord.get(i), " "); if (titleOccWordQuery.length() > 1) { titleOccWordQuery.append(" AND "); } for (int j = 0; j < wordsOccupation.length; j++) { titleOccWordQuery.append( "(personId IN (SELECT person.personId FROM org.medici.bia.domain.PoLink WHERE titleOccList.titleOcc like '%"); titleOccWordQuery.append(wordsOccupation[j].replace("'", "''")); titleOccWordQuery.append("%'))"); if (j < (wordsOccupation.length - 1)) { titleOccWordQuery.append(" AND "); } } } titleOccWordQuery.append(')'); if (!titleOccWordQuery.toString().equals("")) { if (jpaQuery.length() > 18) { jpaQuery.append(" AND "); } jpaQuery.append(titleOccWordQuery); } } //Occupations if (titlesOccId.size() > 0) { StringBuilder titleOccIdQuery = new StringBuilder("("); for (int i = 0; i < titlesOccId.size(); i++) { if (titleOccIdQuery.length() > 1) { titleOccIdQuery.append(" AND "); } if (titlesOccId.get(i) > 0) { titleOccIdQuery.append( "(personId IN (SELECT person.personId FROM org.medici.bia.domain.PoLink WHERE titleOccList.titleOccId="); titleOccIdQuery.append(titlesOccId.get(i)); titleOccIdQuery.append("))"); } else { titleOccIdQuery.append( "(personId IN (SELECT person.personId FROM org.medici.bia.domain.PoLink WHERE titleOccList.titleOcc like '%"); titleOccIdQuery.append(titlesOcc.get(i).replace("'", "''")); titleOccIdQuery.append("%'))"); } } titleOccIdQuery.append(')'); if (!titleOccIdQuery.toString().equals("")) { if (jpaQuery.length() > 18) { jpaQuery.append(" AND "); } jpaQuery.append(titleOccIdQuery); } } //Gender if (gender.size() > 0) { StringBuilder genderQuery = new StringBuilder("("); for (int i = 0; i < gender.size(); i++) { if (genderQuery.length() > 1) { genderQuery.append(" AND "); } genderQuery.append("(gender like '"); genderQuery.append(gender.get(i)); genderQuery.append("' )"); } genderQuery.append(')'); if (!genderQuery.toString().equals("")) { if (jpaQuery.length() > 18) { jpaQuery.append(" AND "); } jpaQuery.append(genderQuery); } } //Places if (placeId.size() > 0) { StringBuilder placeIdQuery = new StringBuilder("("); for (int i = 0; i < placeId.size(); i++) { if (placeIdQuery.length() > 1) { placeIdQuery.append(" AND "); } if (placeType.get(i).equals("Birth/Death Place")) { if (placeId.get(i) > 0) { placeIdQuery.append("(bornPlace.geogKey IN (SELECT geogKey FROM Place WHERE placeAllId="); placeIdQuery.append(placeId.get(i)); placeIdQuery .append(") OR deathPlace.geogKey IN (SELECT geogKey FROM Place WHERE placeAllId="); placeIdQuery.append(placeId.get(i)); placeIdQuery.append("))"); } else { placeIdQuery.append("(bornPlace.placeName like '%"); placeIdQuery.append(place.get(i).replace("'", "''")); placeIdQuery.append("%' OR deathPlace.placeName like '%"); placeIdQuery.append(place.get(i).replace("'", "''")); placeIdQuery.append("%' )"); } } else if (placeType.get(i).equals("Birth Place")) { if (placeId.get(i) > 0) { placeIdQuery.append("(bornPlace.geogKey IN (SELECT geogKey FROM Place WHERE placeAllId="); placeIdQuery.append(placeId.get(i)); placeIdQuery.append("))"); } else { placeIdQuery.append("(bornPlace.placeName like '%"); placeIdQuery.append(place.get(i).replace("'", "''")); placeIdQuery.append("%' )"); } } else if (placeType.get(i).equals("Death Place")) { if (placeId.get(i) > 0) { placeIdQuery.append("(deathPlace.geogKey IN (SELECT geogKey FROM Place WHERE placeAllId="); placeIdQuery.append(placeId.get(i)); placeIdQuery.append("))"); } else { placeIdQuery.append("(deathPlace.placeName like '%"); placeIdQuery.append(place.get(i).replace("'", "''")); placeIdQuery.append("%' )"); } } } placeIdQuery.append(')'); if (!placeIdQuery.toString().equals("")) { if (jpaQuery.length() > 18) { jpaQuery.append(" AND "); } jpaQuery.append(placeIdQuery); } } //ResearchNotes if (researchNotes.size() > 0) { StringBuilder researchNotesQuery = new StringBuilder("("); for (int i = 0; i < researchNotes.size(); i++) { String[] wordsSingleResearchNotes = StringUtils.split(researchNotes.get(i), " "); if (researchNotesQuery.length() > 1) { researchNotesQuery.append(" AND "); } for (int j = 0; j < wordsSingleResearchNotes.length; j++) { researchNotesQuery.append("(bioNotes like '%"); researchNotesQuery.append(wordsSingleResearchNotes[j].toLowerCase().replace("'", "''")); researchNotesQuery.append("%')"); if (j < (wordsSingleResearchNotes.length - 1)) { researchNotesQuery.append(" AND "); } } } researchNotesQuery.append(')'); if (!researchNotesQuery.toString().equals("")) { if (jpaQuery.length() > 18) { jpaQuery.append(" AND "); } jpaQuery.append(researchNotesQuery); } } //PersonId if (peopleId.size() > 0) { StringBuilder peopleIdQuery = new StringBuilder("("); for (int i = 0; i < peopleId.size(); i++) { if (StringUtils.isNumeric(peopleId.get(i))) { if (peopleIdQuery.length() > 1) { peopleIdQuery.append(" OR "); } peopleIdQuery.append("(personId="); peopleIdQuery.append(peopleId.get(i)); peopleIdQuery.append(")"); } else { continue; } } peopleIdQuery.append(")"); if (!peopleIdQuery.toString().equals("")) { if (jpaQuery.length() > 18) { jpaQuery.append(" AND "); } jpaQuery.append(peopleIdQuery); } } //LogicalDelete if (!ObjectUtils.toString(logicalDelete).equals("")) { StringBuilder logicalDeleteQuery = new StringBuilder("("); if (logicalDelete.equals(Boolean.TRUE)) { logicalDeleteQuery.append("(logicalDelete = true)"); } else if (logicalDelete.equals(Boolean.FALSE)) { logicalDeleteQuery.append("(logicalDelete = false)"); } logicalDeleteQuery.append(')'); if (!logicalDeleteQuery.toString().equals("")) { if (jpaQuery.length() > 20) { jpaQuery.append(" AND "); } jpaQuery.append(logicalDeleteQuery); } } else { if (jpaQuery.length() > 20) { jpaQuery.append(" AND "); } jpaQuery.append(" logicalDelete = false"); } return jpaQuery.toString(); } /** * {@inheritDoc} */ @Override public Query toLuceneQuery() { BooleanQuery luceneQuery = new BooleanQuery(); //Names if (names.size() > 0) { BooleanQuery namesQuery = new BooleanQuery(); for (int i = 0; i < names.size(); i++) { if (namesTypes.get(i).equals(NameType.AllNameTypes)) { BooleanQuery subQuery = new BooleanQuery(); subQuery.add(new PrefixQuery(new Term("mapNameLf", names.get(i).toString().toLowerCase())), Occur.SHOULD); subQuery.add(new PrefixQuery(new Term("altName.altName", names.get(i).toLowerCase())), Occur.SHOULD); namesQuery.add(subQuery, Occur.SHOULD); } else { BooleanQuery subQuery = new BooleanQuery(); // try{ // //MultiFieldQueryParser multiField = new MultiFieldQueryParser(Version.LUCENE_31, new String[]{"altName.nameType","altName.altName"}, new StandardAnalyzer(Version.LUCENE_31)); // //Query test = multiField.parse(namesTypes.get(i).toString().toLowerCase()); // Query test = MultiFieldQueryParser.parse(Version.LUCENE_31, new String[]{namesTypes.get(i).toString().toLowerCase(), names.get(i).toLowerCase() + '*'}, new String[]{"altName.nameType","altName.altName"}, new StandardAnalyzer(Version.LUCENE_31)); // // namesQuery.add(test, Occur.MUST); // }catch(Exception e){ // // } subQuery.add( new TermQuery(new Term("altName.nameType", namesTypes.get(i).toString().toLowerCase())), Occur.MUST); subQuery.add(new TermQuery(new Term("altName.altName", names.get(i).toLowerCase())), Occur.MUST); namesQuery.add(subQuery, Occur.MUST); } } if (!namesQuery.toString().equals("")) { luceneQuery.add(namesQuery, Occur.MUST); } } //Words if (words.size() > 0) { BooleanQuery wordsQuery = new BooleanQuery(); for (int i = 0; i < words.size(); i++) { BooleanQuery subQuery = new BooleanQuery(); subQuery.add(new PrefixQuery(new Term("mapNameLf", words.get(i).toLowerCase())), Occur.SHOULD); subQuery.add(new PrefixQuery(new Term("bioNotes", words.get(i).toLowerCase())), Occur.SHOULD); subQuery.add(new PrefixQuery(new Term("staffNotes", words.get(i).toLowerCase())), Occur.SHOULD); subQuery.add(new PrefixQuery(new Term("altName.altName", words.get(i).toLowerCase())), Occur.SHOULD); wordsQuery.add(subQuery, Occur.MUST); } if (!wordsQuery.toString().equals("")) { luceneQuery.add(wordsQuery, Occur.MUST); } } //Dates if (datesTypes.size() > 0) { BooleanQuery datesQuery = new BooleanQuery(); for (int i = 0; i < datesTypes.size(); i++) { if (datesTypes.get(i) == null) { continue; } else if (datesTypes.get(i).equals("Born after")) { NumericRangeQuery<Integer> dateRangeQuery = NumericRangeQuery.newIntRange("bornDate_Sort", 4, DateUtils.getLuceneDate(datesYear.get(i), datesMonth.get(i), datesDay.get(i)), DateUtils.MAX_DATE, true, true); datesQuery.add(dateRangeQuery, Occur.MUST); } else if (datesTypes.get(i).equals("Died by")) { NumericRangeQuery<Integer> dateRangeQuery = NumericRangeQuery.newIntRange("deathDate_Sort", 4, DateUtils.getLuceneDate(datesYear.get(i), datesMonth.get(i), datesDay.get(i)), DateUtils.MAX_DATE, true, true); datesQuery.add(dateRangeQuery, Occur.MUST); } else if (datesTypes.get(i).equals("Lived between")) { NumericRangeQuery<Integer> startDateRangeQuery = NumericRangeQuery.newIntRange("bornDate_Sort", 4, DateUtils.MIN_DATE, DateUtils.getLuceneDate(datesYearBetween.get(i), datesMonthBetween.get(i), datesDayBetween.get(i)), true, true); datesQuery.add(startDateRangeQuery, Occur.MUST); NumericRangeQuery<Integer> endDateRangeQuery = NumericRangeQuery.newIntRange("deathDate_Sort", 4, DateUtils.getLuceneDate(datesYear.get(i), datesMonth.get(i), datesDay.get(i)), DateUtils.getLuceneDate(datesYearBetween.get(i), datesMonthBetween.get(i), datesDayBetween.get(i)), true, true); datesQuery.add(endDateRangeQuery, Occur.MUST); } else if (datesTypes.get(i).equals("Born/Died on")) { //if the month is null we don't consider the day if (datesMonth.get(i) == null) { NumericRangeQuery<Integer> bornDateRangeQuery = NumericRangeQuery.newIntRange( "bornDate_Sort", 4, DateUtils.getLuceneDate(datesYear.get(i), 1, 1), DateUtils.getLuceneDate(datesYear.get(i), 12, 12), true, true); datesQuery.add(bornDateRangeQuery, Occur.SHOULD); NumericRangeQuery<Integer> deathDateRangeQuery = NumericRangeQuery.newIntRange( "deathDate_Sort", 4, DateUtils.getLuceneDate(datesYear.get(i), 1, 1), DateUtils.getLuceneDate(datesYear.get(i), 12, 12), true, true); datesQuery.add(deathDateRangeQuery, Occur.SHOULD); } else { if (datesDay.get(i) == null) { NumericRangeQuery<Integer> bornDateRangeQuery = NumericRangeQuery.newIntRange( "bornDate_Sort", 4, DateUtils.getLuceneDate(datesYear.get(i), datesMonth.get(i), 1), DateUtils.getLuceneDate(datesYear.get(i), datesMonth.get(i), 31), true, true); datesQuery.add(bornDateRangeQuery, Occur.SHOULD); NumericRangeQuery<Integer> deathDateRangeQuery = NumericRangeQuery.newIntRange( "deathDate_Sort", 4, DateUtils.getLuceneDate(datesYear.get(i), datesMonth.get(i), 1), DateUtils.getLuceneDate(datesYear.get(i), datesMonth.get(i), 31), true, true); datesQuery.add(deathDateRangeQuery, Occur.SHOULD); } else { NumericRangeQuery<Integer> bornDateRangeQuery = NumericRangeQuery.newIntRange( "bornDate_Sort", 4, DateUtils.getLuceneDate(datesYear.get(i), datesMonth.get(i), datesDay.get(i)), DateUtils.getLuceneDate(datesYear.get(i), datesMonth.get(i), datesDay.get(i)), true, true); datesQuery.add(bornDateRangeQuery, Occur.SHOULD); NumericRangeQuery<Integer> deathDateRangeQuery = NumericRangeQuery.newIntRange( "deathDate_Sort", 4, DateUtils.getLuceneDate(datesYear.get(i), datesMonth.get(i), datesDay.get(i)), DateUtils.getLuceneDate(datesYear.get(i), datesMonth.get(i), datesDay.get(i)), true, true); datesQuery.add(deathDateRangeQuery, Occur.SHOULD); } } } } if (!datesQuery.toString().equals("")) { luceneQuery.add(datesQuery, Occur.MUST); } } //Role Categories if (roleCategories.size() > 0) { BooleanQuery roleCatQuery = new BooleanQuery(); for (int i = 0; i < roleCategories.size(); i++) { BooleanQuery singleRoleCatQuery = new BooleanQuery(); if (roleCategories.get(i).equals("ARTISTS and ARTISANS") || roleCategories.get(i).equals("CORPORATE BODIES") || roleCategories.get(i).equals("ECCLESIASTICS") || roleCategories.get(i).equals("HEADS of STATE") || roleCategories.get(i).equals("MILITARY and NAVAL PERSONNEL") || roleCategories.get(i).equals("NOBLES") || roleCategories.get(i).equals("PROFESSIONS") || roleCategories.get(i).equals("SCHOLARLY and LITERARY") || roleCategories.get(i).equals("STATE and COURT PERSONNEL") || roleCategories.get(i).equals("UNASSIGNED")) { String[] wordSingleRoleCat = StringUtils.split(roleCategories.get(i), " "); for (int j = 0; j < wordSingleRoleCat.length; j++) { if (j == 0) { TermQuery termQuery = new TermQuery(new Term("poLink.titleOccList.roleCat.roleCatMajor", wordSingleRoleCat[j].toLowerCase())); singleRoleCatQuery.add(termQuery, Occur.MUST); roleCatQuery.add(singleRoleCatQuery, Occur.MUST); singleRoleCatQuery = new BooleanQuery(); } else { //Discard the words "and" or "of" if (wordSingleRoleCat[j].length() > 3) { if (j != wordSingleRoleCat.length - 1) { TermQuery termQuery = new TermQuery( new Term("poLink.titleOccList.roleCat.roleCatMajor", wordSingleRoleCat[j].toLowerCase())); singleRoleCatQuery.add(termQuery, Occur.MUST); roleCatQuery.add(singleRoleCatQuery, Occur.MUST); singleRoleCatQuery = new BooleanQuery(); } else { PrefixQuery prefixQuery = new PrefixQuery( new Term("poLink.titleOccList.roleCat.roleCatMajor", wordSingleRoleCat[j].toLowerCase())); singleRoleCatQuery.add(prefixQuery, Occur.SHOULD); roleCatQuery.add(singleRoleCatQuery, Occur.MUST); singleRoleCatQuery = new BooleanQuery(); } } } } } else { String[] wordSingleRoleCat = StringUtils.split(roleCategories.get(i), " "); for (int j = 0; j < wordSingleRoleCat.length; j++) { if (j == 0) { TermQuery termQuery = new TermQuery(new Term("poLink.titleOccList.roleCat.roleCatMinor", wordSingleRoleCat[j].toLowerCase())); singleRoleCatQuery.add(termQuery, Occur.MUST); roleCatQuery.add(singleRoleCatQuery, Occur.MUST); singleRoleCatQuery = new BooleanQuery(); } else { //Discard the words "and" or "of" if (wordSingleRoleCat[j].length() > 3) { if (j != wordSingleRoleCat.length - 1) { TermQuery termQuery = new TermQuery( new Term("poLink.titleOccList.roleCat.roleCatMinor", wordSingleRoleCat[j].toLowerCase())); singleRoleCatQuery.add(termQuery, Occur.MUST); roleCatQuery.add(singleRoleCatQuery, Occur.MUST); singleRoleCatQuery = new BooleanQuery(); } else { PrefixQuery prefixQuery = new PrefixQuery( new Term("poLink.titleOccList.roleCat.roleCatMinor", wordSingleRoleCat[j].toLowerCase())); singleRoleCatQuery.add(prefixQuery, Occur.MUST); roleCatQuery.add(singleRoleCatQuery, Occur.MUST); singleRoleCatQuery = new BooleanQuery(); } } } } } } if (!roleCatQuery.toString().equals("")) { luceneQuery.add(roleCatQuery, Occur.MUST); } } //Occupations if (titlesOccId.size() > 0) { BooleanQuery titleOccIdQuery = new BooleanQuery(); BooleanQuery titleOccQuery = new BooleanQuery(); for (int i = 0; i < titlesOccId.size(); i++) { if (titlesOccId.get(i) > 0) { titleOccIdQuery.add(new BooleanClause( new TermQuery( new Term("poLink.titleOccList.titleOccId", titlesOccId.get(i).toString())), Occur.MUST)); } else { titleOccQuery.add(new BooleanClause( new PrefixQuery( new Term("poLink.titleOccList.titleOcc", titlesOcc.get(i).toLowerCase())), Occur.MUST)); } } if (!titleOccIdQuery.toString().equals("")) { luceneQuery.add(titleOccIdQuery, Occur.MUST); } if (!titleOccQuery.toString().equals("")) { luceneQuery.add(titleOccQuery, Occur.MUST); } } //Places if (placeId.size() > 0) { BooleanQuery placeIdQuery = new BooleanQuery(); BooleanQuery placeQuery = new BooleanQuery(); for (int i = 0; i < placeId.size(); i++) { if (placeId.get(i) > 0) { BooleanQuery singlePlaceIdQuery = new BooleanQuery(); BooleanClause booleanClause = new BooleanClause( new TermQuery(new Term("bornPlace.placeAllId", placeId.get(i).toString())), Occur.SHOULD); singlePlaceIdQuery.add(booleanClause); booleanClause = new BooleanClause( new TermQuery(new Term("deathPlace.placeAllId", placeId.get(i).toString())), Occur.SHOULD); singlePlaceIdQuery.add(booleanClause); placeIdQuery.add(singlePlaceIdQuery, Occur.MUST); } else { BooleanQuery singlePlaceQuery = new BooleanQuery(); BooleanClause booleanClause = new BooleanClause( new PrefixQuery(new Term("bornPlace.placeName", place.get(i).toLowerCase())), Occur.SHOULD); singlePlaceQuery.add(booleanClause); booleanClause = new BooleanClause( new PrefixQuery(new Term("deathPlace.placeName", place.get(i).toLowerCase())), Occur.SHOULD); singlePlaceQuery.add(booleanClause); placeQuery.add(singlePlaceQuery, Occur.MUST); } } if (!placeIdQuery.toString().equals("")) { luceneQuery.add(placeIdQuery, Occur.MUST); } if (!placeQuery.toString().equals("")) { luceneQuery.add(placeQuery, Occur.MUST); } } return luceneQuery; } public String toString() { StringBuilder toString = new StringBuilder(0); if (!names.isEmpty()) { if (toString.length() > 0) { toString.append("AND "); } toString.append("Names: "); for (int i = 0; i < names.size(); i++) { if (i > 0) { toString.append("AND "); } toString.append(names.get(i)); toString.append(' '); } } if (!exactName.isEmpty()) { if (toString.length() > 0) { toString.append("AND "); } toString.append("Name: "); for (int i = 0; i < exactName.size(); i++) { if (i > 0) { toString.append("AND "); } toString.append(exactName.get(i) + " "); } } if (!words.isEmpty()) { if (toString.length() > 0) { toString.append("AND "); } toString.append("Words: "); for (int i = 0; i < words.size(); i++) { if (i > 0) { toString.append("AND "); } toString.append(words.get(i) + " "); } } if (!datesYear.isEmpty()) { if (toString.length() > 0) { toString.append("AND "); } toString.append("Date Year: "); for (int i = 0; i < datesYear.size(); i++) { if (i > 0) { toString.append("AND "); } toString.append(datesYear.get(i) + " "); } } if (!datesMonth.isEmpty()) { if (toString.length() > 0) { toString.append("AND "); } toString.append("Date Month: "); for (int i = 0; i < datesMonth.size(); i++) { if (i > 0) { toString.append("AND "); } toString.append(datesMonth.get(i) + " "); } } if (!datesDay.isEmpty()) { if (toString.length() > 0) { toString.append("AND "); } toString.append("Date Day: "); for (int i = 0; i < datesDay.size(); i++) { if (i > 0) { toString.append("AND "); } toString.append(datesDay.get(i) + " "); } } if (!datesYearBetween.isEmpty()) { if (toString.length() > 0) { toString.append("AND "); } toString.append("Between Date Year: "); for (int i = 0; i < datesYearBetween.size(); i++) { if (i > 0) { toString.append("AND "); } toString.append(datesYearBetween.get(i) + " "); } } if (!datesMonthBetween.isEmpty()) { if (toString.length() > 0) { toString.append("AND "); } toString.append("Between Date Month: "); for (int i = 0; i < datesMonthBetween.size(); i++) { if (i > 0) { toString.append("AND "); } toString.append(datesMonthBetween.get(i) + " "); } } if (!datesDayBetween.isEmpty()) { if (toString.length() > 0) { toString.append("AND "); } toString.append("Between Date Day: "); for (int i = 0; i < datesDayBetween.size(); i++) { if (i > 0) { toString.append("AND "); } toString.append(datesDayBetween.get(i) + " "); } } if (!roleCategories.isEmpty()) { if (toString.length() > 0) { toString.append("AND "); } toString.append("Role Categories: "); for (int i = 0; i < roleCategories.size(); i++) { if (i > 0) { toString.append("AND "); } toString.append(roleCategories.get(i) + " "); } } if (!titlesOcc.isEmpty()) { if (toString.length() > 0) { toString.append("AND "); } toString.append("Occupations: "); for (int i = 0; i < titlesOcc.size(); i++) { if (i > 0) { toString.append("AND "); } toString.append(titlesOcc.get(i) + " "); } } if (!place.isEmpty()) { if (toString.length() > 0) { toString.append("AND "); } toString.append("Places: "); for (int i = 0; i < place.size(); i++) { if (i > 0) { toString.append("AND "); } toString.append(place.get(i) + " "); } } if (!peopleId.isEmpty()) { if (toString.length() > 0) { toString.append("AND "); } toString.append("Person ID: "); for (int i = 0; i < peopleId.size(); i++) { if (i > 0) { toString.append("AND "); } toString.append(peopleId.get(i)); toString.append(' '); } } return toString.toString(); } /** * @return the datesDay */ public List<Integer> getDatesDay() { return datesDay; } /** * @return the datesDayBetween */ public List<Integer> getDatesDayBetween() { return datesDayBetween; } /** * @return the datesMonth */ public List<Integer> getDatesMonth() { return datesMonth; } /** * @return the datesMonthBetween */ public List<Integer> getDatesMonthBetween() { return datesMonthBetween; } /** * @return the datesTypes */ public List<String> getDatesTypes() { return datesTypes; } /** * @return the datesYear */ public List<Integer> getDatesYear() { return datesYear; } /** * @return the datesYearBetween */ public List<Integer> getDatesYearBetween() { return datesYearBetween; } /** * @return the exactName */ public List<String> getExactName() { return exactName; } /** * @return the gender */ public List<Gender> getGender() { return gender; } /** * @return the logicalDelete */ public Boolean getLogicalDelete() { return logicalDelete; } /** * @return the names */ public List<String> getNames() { return names; } /** * @return the namesTypes */ public List<NameType> getNamesTypes() { return namesTypes; } /** * @return the peopleId */ public List<String> getPeopleId() { return peopleId; } /** * @return the personId */ public List<Integer> getPersonId() { return personId; } /** * @return the place */ public List<String> getPlace() { return place; } /** * @return the placeId */ public List<Integer> getPlaceId() { return placeId; } /** * @return the placeType */ public List<String> getPlaceType() { return placeType; } /** * @return the researchNotes */ public List<String> getResearchNotes() { return researchNotes; } /** * @return the roleCategories */ public List<String> getRoleCategories() { return roleCategories; } /** * @return the titleOccWord */ public List<String> getTitleOccWord() { return titleOccWord; } /** * @return the occupations */ public List<String> getTitlesOcc() { return titlesOcc; } /** * @return the titleOccId */ public List<Integer> getTitlesOccId() { return titlesOccId; } /** * @return the words */ public List<String> getWords() { return words; } /** * @return the wordsTypes */ public List<WordType> getWordsTypes() { return wordsTypes; } /** * @param datesDay the datesDay to set */ public void setDatesDay(List<Integer> datesDay) { this.datesDay = datesDay; } /** * @param datesDayBetween the datesDayBetween to set */ public void setDatesDayBetween(List<Integer> datesDayBetween) { this.datesDayBetween = datesDayBetween; } /** * @param datesMonth the datesMonth to set */ public void setDatesMonth(List<Integer> datesMonth) { this.datesMonth = datesMonth; } /** * @param datesMonthBetween the datesMonthBetween to set */ public void setDatesMonthBetween(List<Integer> datesMonthBetween) { this.datesMonthBetween = datesMonthBetween; } /** * @param datesTypes the datesTypes to set */ public void setDatesTypes(List<String> datesTypes) { this.datesTypes = datesTypes; } /** * @param datesYear the datesYear to set */ public void setDatesYear(List<Integer> datesYear) { this.datesYear = datesYear; } /** * @param datesYearBetween the datesYearBetween to set */ public void setDatesYearBetween(List<Integer> datesYearBetween) { this.datesYearBetween = datesYearBetween; } /** * @param exactName the exactName to set */ public void setExactName(List<String> exactName) { this.exactName = exactName; } /** * @param gender the gender to set */ public void setGender(List<Gender> gender) { this.gender = gender; } /** * @param logicalDelete the logicalDelete to set */ public void setLogicalDelete(Boolean logicalDelete) { this.logicalDelete = logicalDelete; } /** * @param names the names to set */ public void setNames(List<String> names) { this.names = names; } /** * @param namesTypes the namesTypes to set */ public void setNamesTypes(List<NameType> namesTypes) { this.namesTypes = namesTypes; } /** * @param peopleId the peopleId to set */ public void setPeopleId(List<String> peopleId) { this.peopleId = peopleId; } /** * @param personId the personId to set */ public void setPersonId(List<Integer> personId) { this.personId = personId; } /** * @param place the place to set */ public void setPlace(List<String> place) { this.place = place; } /** * @param placeId the placeId to set */ public void setPlaceId(List<Integer> placeId) { this.placeId = placeId; } /** * @param placeType the placeType to set */ public void setPlaceType(List<String> placeType) { this.placeType = placeType; } /** * @param researchNotes the researchNotes to set */ public void setResearchNotes(List<String> researchNotes) { this.researchNotes = researchNotes; } /** * @param roleCategories the roleCategories to set */ public void setRoleCategories(List<String> roleCategories) { this.roleCategories = roleCategories; } /** * @param titleOccWord the titleOccWord to set */ public void setTitleOccWord(List<String> titleOccWord) { this.titleOccWord = titleOccWord; } /** * @param occupations the occupations to set */ public void setTitlesOcc(List<String> titlesOcc) { this.titlesOcc = titlesOcc; } /** * @param titleOccId the titleOccId to set */ public void setTitlesOccId(List<Integer> titlesOccId) { this.titlesOccId = titlesOccId; } /** * @param words the words to set */ public void setWords(List<String> words) { this.words = words; } /** * @param wordsTypes the wordsTypes to set */ public void setWordsTypes(List<WordType> wordsTypes) { this.wordsTypes = wordsTypes; } /** * @return the datesLastUpdateTypes */ public List<DateType> getDatesLastUpdateTypes() { return datesLastUpdateTypes; } /** * @param datesLastUpdateTypes the datesLastUpdateTypes to set */ public void setDatesLastUpdateTypes(List<DateType> datesLastUpdateTypes) { this.datesLastUpdateTypes = datesLastUpdateTypes; } /** * @return the datesLastUpdate */ public List<Date> getDatesLastUpdate() { return datesLastUpdate; } /** * @param datesLastUpdate the datesLastUpdate to set */ public void setDatesLastUpdate(List<Date> datesLastUpdate) { this.datesLastUpdate = datesLastUpdate; } /** * @return the datesLastUpdateBetween */ public List<Date> getDatesLastUpdateBetween() { return datesLastUpdateBetween; } /** * @param datesLastUpdateBetween the datesLastUpdateBetween to set */ public void setDatesLastUpdateBetween(List<Date> datesLastUpdateBetween) { this.datesLastUpdateBetween = datesLastUpdateBetween; } /** * @return the datesCreated */ public List<Date> getDatesCreated() { return datesCreated; } /** * @param datesCreated the datesCreated to set */ public void setDatesCreated(List<Date> datesCreated) { this.datesCreated = datesCreated; } /** * @return the datesCreatedBetween */ public List<Date> getDatesCreatedBetween() { return datesCreatedBetween; } /** * @param datesCreatedBetween the datesCreatedBetween to set */ public void setDatesCreatedBetween(List<Date> datesCreatedBetween) { this.datesCreatedBetween = datesCreatedBetween; } /** * @return the datesCreatedTypes */ public List<DateType> getDatesCreatedTypes() { return datesCreatedTypes; } /** * @param datesCreatedTypes the datesCreatedTypes to set */ public void setDatesCreatedTypes(List<DateType> datesCreatedTypes) { this.datesCreatedTypes = datesCreatedTypes; } }