public QsolParser(QsolConfiguration config, boolean inherit) { if (inherit) { this.dateFields.addAll(config.dateFields); this.findReplace.putAll(config.findReplace); this.findReplaceRegEx.addAll(config.findReplaceRegEx); this.buildQueryVisitor.setDateParser(config.dateParser); this.setParagraphMarker(config.paragraphMarker); this.setSentenceMarker(config.sentenceMarker); this.setFieldBreakMarker(config.fieldBreakMarker); this.buildQueryVisitor.addFieldMappings(config.fieldMapping); if (config.zeroPadFields != null) { preProcessVisitor.setZeroPadFields(config.zeroPadFields); } } this.opsList.addAll(config.opsList); this.orderOfOpsMap.putAll(config.orderOfOpsMap); }
/** * Set the default space ' ' operator to be an | (OR) instead of & (AND). * * @since 1.0 */ public void setOrAsDefaultOp() { preProcessVisitor.setOrAsDefaultOp(); }
/** * Converts Qsol query syntax into a Lucene Query object. * * @param field default search field * @param query Qsol syntax query * @param analyzer lucene analyzer to use on terms * @return * @throws QsolSyntaxException * @throws EmptyQueryException * @since 1.0 */ public Query parse(String field, String query, Analyzer analyzer) throws QsolSyntaxException, EmptyQueryException { Node root = null; // System.out.println("query:" + query); preProcessVisitor.setAnalyzer(analyzer); buildQueryVisitor.setOrderOfOps(opsList); preProcessVisitor.setDateFields(dateFields); buildQueryVisitor.setDateFields(dateFields); // Two passes over the tree--the first handles the default space // operator, // performs find/replace expansion, and preps the suggested search if // enabled. // The second builds the lucene query from the Qsol syntax parse tree. QueryParser parser = new QueryParser(new StringReader(query)); if (useHide) { parser.setHideOps(hideOr, hideAnd, hideAndNot, hideProximity); } parser.setOrderOfOps(orderOfOpsMap); assert (parser != null); // build parse tree try { root = parser.Search(); } catch (com.mhs.qsol.queryparser.ParseException e) { throw new QsolParseException(e); // e.printStackTrace(); // query = escape(query).toString(); // System.out.println("new query:" + query); // return parse(field, query, analyzer); } // run over parse tree // this could be done more efficiently I'm sure preProcessVisitor.setFindReplace(findReplace); preProcessVisitor.setFindReplaceRegEx(findReplaceRegEx); String processedQuery = root.accept(preProcessVisitor, null); try { parser = new QueryParser(new StringReader(processedQuery)); parser.setOrderOfOps(orderOfOpsMap); // buildQueryVisitor.setQsolParser(parser); // build 2nd parse tree from the pre-processed query root = parser.Search(); } catch (Exception e) { throw new QsolSyntaxException(e); } buildQueryVisitor.setAnalyzer(analyzer); buildQueryVisitor.setField(field); // run over parse tree Query luceneQuery = root.accept(buildQueryVisitor, null); if (luceneQuery == null) { throw new EmptyQueryException("Expanded query is empty"); } return luceneQuery; }