package lux.query.parser; import org.apache.commons.lang.StringUtils; import org.apache.lucene.queryparser.ext.ExtensionQuery; import org.apache.lucene.queryparser.ext.ParserExtension; import org.apache.lucene.queryparser.xml.ParserException; import org.apache.lucene.queryparser.classic.ParseException; class NodeParser extends ParserExtension { private final String textFieldName; private final String elementTextFieldName; private final String attributeTextFieldName; NodeQueryBuilder queryBuilder; NodeParser (String textFieldName, String elementTextFieldName, String attributeTextFieldName, NodeQueryBuilder queryBuilder) { this.queryBuilder = queryBuilder; this.textFieldName = textFieldName; this.elementTextFieldName = elementTextFieldName; this.attributeTextFieldName = attributeTextFieldName; } @Override public org.apache.lucene.search.Query parse(ExtensionQuery query) throws ParseException { String field = query.getField(); String term = query.getRawQueryString(); // create either a term query or a phrase query (or a span?) try { if (StringUtils.isEmpty(field)) { return queryBuilder.parseQueryTerm(textFieldName, field, term, 1.0f); } else if (field.charAt(0) == '@') { return queryBuilder.parseQueryTerm(attributeTextFieldName, field.substring(1), term, 1.0f); } else { return queryBuilder.parseQueryTerm(elementTextFieldName, field, term, 1.0f); } } catch (ParserException e) { throw new ParseException (e.getMessage()); } } }