package me.osm.gazetteer.web.api.query; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; public class Query { private String original; private List<QToken> tokens; private Collection<String> originalVariants; public Query(List<QToken> tokens, String original, Collection<String> originalVariants) { this.tokens = tokens; this.original = original; this.originalVariants = (originalVariants == null ? new ArrayList<String>() : originalVariants); } public Query head() { if(this.tokens.size() > 1) { return new Query(this.tokens.subList(0, this.tokens.size() - 1), original, originalVariants); } return null; } public Query tail() { if(tokens.size() > 0) { return new Query(Collections.singletonList(tokens.get(tokens.size() - 1)), original, originalVariants); } return null; } public String toString() { StringBuilder sb = new StringBuilder(); if(tokens == null || tokens.isEmpty()) { return ""; } for(QToken t : tokens) { sb.append(" ").append(t.toString()); } return sb.substring(1); } public int countTokens() { return tokens.size(); } public int countNumeric() { int r = 0; for(QToken token : tokens) { if(token.isHasNumbers()) { r++; } } return r; } public int countOptional() { int r = 0; for(QToken token : tokens) { if(token.isOptional()) { r++; } } return r; } public List<QToken> listToken() { return tokens; } public Query filter(Collection<String> remove) { List<QToken> r = new ArrayList<QToken>(); for(QToken t : this.tokens) { if(!remove.contains(t.toString())) { r.add(t); } } return new Query(r, original, originalVariants); } public Query required() { List<QToken> r = new ArrayList<QToken>(); for(QToken t : this.tokens) { if(!t.isOptional()) { r.add(t); } } return new Query(r, original, originalVariants); } public Query woFuzzy() { List<QToken> r = new ArrayList<QToken>(); for(QToken t : this.tokens) { if(!t.isFuzzied()) { r.add(t); } } return new Query(r, original, originalVariants); } public Query woNumbers() { List<QToken> r = new ArrayList<QToken>(); for(QToken t : this.tokens) { if(!t.isHasNumbers()) { r.add(t); } } return new Query(r, original, originalVariants); } public String print() { StringBuilder sb = new StringBuilder(); if(tokens == null || tokens.isEmpty()) { return ""; } for(QToken t : tokens) { sb.append(" ").append(t.print()); } return sb.substring(1); } public String getOriginal() { return original; } public Collection<String> getOriginalVarians() { return originalVariants; } }