/**
* FreeDesktopSearch - A Search Engine for your Desktop
* Copyright (C) 2013 Mirko Sertic
*
* This program 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 3 of the License, or (at your option) any later
* version.
*
* This program 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 program; if not, see
* <http://www.gnu.org/licenses/>.
*/
package de.mirkosertic.desktopsearch;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class QueryTokenizer {
private final List<String> requiredTerms;
private final List<String> notRequiredTerms;
QueryTokenizer(String aQuery) {
requiredTerms = new ArrayList<>();
notRequiredTerms = new ArrayList<>();
boolean isFirstChar = true;
boolean isNegated = false;
StringBuilder theCurrentTerm = new StringBuilder();
for (int i = 0; i < aQuery.length(); i++) {
char theCurrentChar = Character.toLowerCase(aQuery.charAt(i));
switch (theCurrentChar) {
case '-': {
if (isFirstChar) {
isFirstChar = false;
isNegated = true;
} else {
theCurrentTerm.append(theCurrentChar);
}
break;
}
case '+':
if (isFirstChar) {
isNegated = false;
isFirstChar = false;
} else {
theCurrentTerm.append(theCurrentChar);
}
break;
case ' ': {
if (isValid(theCurrentTerm.toString())) {
if (isNegated) {
notRequiredTerms.add(theCurrentTerm.toString());
} else {
requiredTerms.add(theCurrentTerm.toString());
}
}
theCurrentTerm = new StringBuilder();
isNegated = false;
isFirstChar = true;
break;
}
default: {
theCurrentTerm.append(theCurrentChar);
isFirstChar = false;
break;
}
}
}
if (isValid(theCurrentTerm.toString())) {
if (isNegated) {
notRequiredTerms.add(theCurrentTerm.toString());
} else {
requiredTerms.add(theCurrentTerm.toString());
}
}
}
static boolean isValid(String aTerm) {
return !StringUtils.isEmpty(aTerm) && !"*".equals(aTerm) && !"?".equals(aTerm);
}
public List<String> getRequiredTerms() {
return Collections.unmodifiableList(requiredTerms);
}
public List<String> getNotRequiredTerms() {
return Collections.unmodifiableList(notRequiredTerms);
}
}