/**
*
*/
package querqy.rewrite.commonrules.model;
import java.util.LinkedList;
import java.util.List;
import querqy.ComparableCharSequence;
import querqy.CompoundCharSequence;
/**
* @author rene
*
*/
public class Input {
final List<Term> inputTerms;
final boolean requiresLeftBoundary;
final boolean requiresRightBoundary;
public Input(List<Term> inputTerms) {
this(inputTerms, false, false);
}
public Input(List<Term> inputTerms, boolean requiresLeftBoundary, boolean requiresRightBoundary) {
this.inputTerms = inputTerms;
this.requiresLeftBoundary = requiresLeftBoundary;
this.requiresRightBoundary = requiresRightBoundary;
}
public boolean isEmpty() {
return inputTerms == null || inputTerms.isEmpty();
}
public List<ComparableCharSequence> getInputSequences(boolean lowerCaseValues) {
if (inputTerms.size() == 1) {
return inputTerms.get(0).getCharSequences(lowerCaseValues);
}
LinkedList<List<ComparableCharSequence>> slots = new LinkedList<>();
for (Term inputTerm : inputTerms) {
slots.add(inputTerm.getCharSequences(lowerCaseValues));
}
List<ComparableCharSequence> seqs = new LinkedList<>();
collectTails(new LinkedList<ComparableCharSequence>(), slots, seqs);
return seqs;
}
void collectTails(List<ComparableCharSequence> prefix, List<List<ComparableCharSequence>> tailSlots,
List<ComparableCharSequence> result) {
if (tailSlots.size() == 1) {
for (ComparableCharSequence sequence : tailSlots.get(0)) {
List<ComparableCharSequence> combined = new LinkedList<>(prefix);
combined.add(sequence);
result.add(new CompoundCharSequence(" ", combined));
}
} else {
List<List<ComparableCharSequence>> newTail = tailSlots.subList(1, tailSlots.size());
for (ComparableCharSequence sequence : tailSlots.get(0)) {
List<ComparableCharSequence> newPrefix = new LinkedList<>(prefix);
newPrefix.add(sequence);
collectTails(newPrefix, newTail, result);
}
}
}
public List<Term> getInputTerms() {
return inputTerms;
}
@Override
public String toString() {
return "Input [inputTerms=" + inputTerms + "]";
}
public boolean requiresLeftBoundary() {
return requiresLeftBoundary;
}
public boolean requiresRightBoundary() {
return requiresRightBoundary;
}
}