Mercurial Hosting > luan
annotate src/goodjava/lucene/queryparser/GoodQueryParser.java @ 2023:544ccce564f6 default tip
minor
| author | Franklin Schmidt <fschmidt@gmail.com> | 
|---|---|
| date | Mon, 20 Oct 2025 17:34:14 -0600 | 
| parents | d1e7564a9ce5 | 
| children | 
| rev | line source | 
|---|---|
| 1458 | 1 package goodjava.lucene.queryparser; | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 2 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 3 import java.util.List; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 4 import java.util.ArrayList; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 5 import java.util.regex.Pattern; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 6 import org.apache.lucene.search.Query; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 7 import org.apache.lucene.search.MatchAllDocsQuery; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 8 import org.apache.lucene.search.BooleanClause; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 9 import org.apache.lucene.search.BooleanQuery; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 10 import org.apache.lucene.search.Sort; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 11 import org.apache.lucene.search.SortField; | 
| 1402 
27efb1fcbcb5
move luan.lib to goodjava
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1362diff
changeset | 12 import goodjava.parser.Parser; | 
| 
27efb1fcbcb5
move luan.lib to goodjava
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1362diff
changeset | 13 import goodjava.parser.ParseException; | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 14 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 15 | 
| 1459 | 16 public class GoodQueryParser { | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 17 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 18 public static Query parseQuery(FieldParser fieldParser,String query) throws ParseException { | 
| 1459 | 19 return new GoodQueryParser(fieldParser,query).parseQuery(); | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 20 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 21 | 
| 1622 | 22 public static String quote(String s) { | 
| 23 s = s.replace("\\","\\\\"); | |
| 24 s = s.replace("\b","\\b"); | |
| 25 s = s.replace("\f","\\f"); | |
| 26 s = s.replace("\n","\\n"); | |
| 27 s = s.replace("\r","\\r"); | |
| 28 s = s.replace("\t","\\t"); | |
| 29 s = s.replace("\"","\\\""); | |
| 30 return '"'+s+'"'; | |
| 31 } | |
| 32 | |
| 1619 | 33 public static String escape(String s) { | 
| 1458 | 34 s = s.replace("\\","\\\\"); | 
| 35 s = s.replace("\b","\\b"); | |
| 36 s = s.replace("\f","\\f"); | |
| 37 s = s.replace("\n","\\n"); | |
| 38 s = s.replace("\r","\\r"); | |
| 39 s = s.replace("\t","\\t"); | |
| 40 s = s.replace("\"","\\\""); | |
| 1621 | 41 s = s.replace("-","\\-"); | 
| 1619 | 42 return s; | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 43 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 44 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 45 public static Sort parseSort(FieldParser fieldParser,String sort) throws ParseException { | 
| 1459 | 46 return new GoodQueryParser(fieldParser,sort).parseSort(); | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 47 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 48 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 49 | 
| 1749 
d1e7564a9ce5
improve query parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1622diff
changeset | 50 private static final String NOT_IN_RANGE = " \t\r\n\":[]{}^()"; | 
| 
d1e7564a9ce5
improve query parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1622diff
changeset | 51 private static final String NOT_IN_TERM = NOT_IN_RANGE; | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 52 private static final String NOT_IN_FIELD = NOT_IN_TERM + ","; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 53 private final FieldParser fieldParser; | 
| 1110 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 54 private final Parser parser; | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 55 | 
| 1459 | 56 private GoodQueryParser(FieldParser fieldParser,String query) { | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 57 this.fieldParser = fieldParser; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 58 this.parser = new Parser(query); | 
| 1110 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 59 parser.begin(); | 
| 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 60 } | 
| 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 61 | 
| 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 62 ParseException exception(String msg) { | 
| 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 63 parser.failure(); | 
| 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 64 return new ParseException(parser,msg); | 
| 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 65 } | 
| 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 66 | 
| 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 67 ParseException exception(Exception cause) { | 
| 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 68 parser.failure(); | 
| 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 69 return new ParseException(parser,cause); | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 70 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 71 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 72 private Query parseQuery() throws ParseException { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 73 Spaces(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 74 BooleanQuery bq = new BooleanQuery(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 75 while( !parser.endOfInput() ) { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 76 bq.add( Term(null) ); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 77 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 78 BooleanClause[] clauses = bq.getClauses(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 79 switch( clauses.length ) { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 80 case 0: | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 81 return new MatchAllDocsQuery(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 82 case 1: | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 83 { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 84 BooleanClause bc = clauses[0]; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 85 if( bc.getOccur() != BooleanClause.Occur.MUST_NOT ) | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 86 return bc.getQuery(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 87 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 88 default: | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 89 return bq; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 90 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 91 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 92 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 93 private BooleanClause Term(String defaultField) throws ParseException { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 94 BooleanClause.Occur occur; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 95 if( parser.match('+') ) { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 96 occur = BooleanClause.Occur.MUST; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 97 Spaces(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 98 } else if( parser.match('-') ) { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 99 occur = BooleanClause.Occur.MUST_NOT; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 100 Spaces(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 101 } else { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 102 occur = BooleanClause.Occur.SHOULD; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 103 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 104 String field = QueryField(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 105 if( field == null ) | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 106 field = defaultField; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 107 Query query = NestedTerm(field); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 108 if( query == null ) | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 109 query = RangeTerm(field); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 110 if( query == null ) { | 
| 1572 
45e42f403fb3
minor - lucene query parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1564diff
changeset | 111 //parser.begin(); | 
| 1362 
77f2d091f17f
minor - SaneQueryParser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1344diff
changeset | 112 String match = SimpleTerm(NOT_IN_TERM); | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 113 query = fieldParser.getQuery(this,field,match); | 
| 1572 
45e42f403fb3
minor - lucene query parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1564diff
changeset | 114 //parser.success(); | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 115 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 116 if( parser.match('^') ) { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 117 Spaces(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 118 int start = parser.begin(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 119 try { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 120 while( parser.anyOf("0123456789.") ); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 121 String match = parser.textFrom(start); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 122 float boost = Float.parseFloat(match); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 123 query.setBoost(boost); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 124 } catch(NumberFormatException e) { | 
| 1110 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 125 throw exception(e); | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 126 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 127 parser.success(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 128 Spaces(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 129 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 130 BooleanClause bc = new BooleanClause(query,occur); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 131 return bc; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 132 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 133 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 134 private Query NestedTerm(String field) throws ParseException { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 135 parser.begin(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 136 if( !parser.match('(') ) | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 137 return parser.failure(null); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 138 BooleanQuery bq = new BooleanQuery(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 139 while( !parser.match(')') ) { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 140 if( parser.endOfInput() ) | 
| 1110 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 141 throw exception("unclosed parentheses"); | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 142 bq.add( Term(field) ); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 143 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 144 Spaces(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 145 BooleanClause[] clauses = bq.getClauses(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 146 switch( clauses.length ) { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 147 case 0: | 
| 1110 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 148 throw exception("empty parentheses"); | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 149 case 1: | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 150 { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 151 BooleanClause bc = clauses[0]; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 152 if( bc.getOccur() != BooleanClause.Occur.MUST_NOT ) | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 153 return parser.success(bc.getQuery()); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 154 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 155 default: | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 156 return parser.success(bq); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 157 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 158 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 159 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 160 private Query RangeTerm(String field) throws ParseException { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 161 parser.begin(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 162 if( !parser.anyOf("[{") ) | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 163 return parser.failure(null); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 164 boolean includeMin = parser.lastChar() == '['; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 165 Spaces(); | 
| 1362 
77f2d091f17f
minor - SaneQueryParser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1344diff
changeset | 166 String minQuery = SimpleTerm(NOT_IN_RANGE); | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 167 TO(); | 
| 1362 
77f2d091f17f
minor - SaneQueryParser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1344diff
changeset | 168 String maxQuery = SimpleTerm(NOT_IN_RANGE); | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 169 if( !parser.anyOf("]}") ) | 
| 1110 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 170 throw exception("unclosed range"); | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 171 boolean includeMax = parser.lastChar() == ']'; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 172 Spaces(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 173 Query query = fieldParser.getRangeQuery(this,field,minQuery,maxQuery,includeMin,includeMax); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 174 return parser.success(query); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 175 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 176 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 177 private void TO() throws ParseException { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 178 parser.begin(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 179 if( !(parser.match("TO") && Space()) ) | 
| 1110 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 180 throw exception("'TO' expected"); | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 181 Spaces(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 182 parser.success(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 183 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 184 | 
| 1362 
77f2d091f17f
minor - SaneQueryParser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1344diff
changeset | 185 private String SimpleTerm(String exclude) throws ParseException { | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 186 parser.begin(); | 
| 1422 | 187 String match = Quoted(); | 
| 188 if( match==null ) | |
| 1362 
77f2d091f17f
minor - SaneQueryParser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1344diff
changeset | 189 match = Unquoted(exclude); | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 190 if( match.length() == 0 ) | 
| 1110 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 191 throw exception("invalid input"); | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 192 return parser.success(match); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 193 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 194 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 195 private String QueryField() throws ParseException { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 196 parser.begin(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 197 String match = Field(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 198 if( match==null || !parser.match(':') ) | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 199 return parser.failure((String)null); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 200 Spaces(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 201 return parser.success(match); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 202 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 203 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 204 private String Field() throws ParseException { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 205 parser.begin(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 206 String match = Unquoted(NOT_IN_FIELD); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 207 if( match.length()==0 ) | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 208 return parser.failure((String)null); | 
| 1619 | 209 match = StringFieldParser.unescape(this,match); | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 210 return parser.success(match); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 211 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 212 | 
| 1422 | 213 private String Quoted() throws ParseException { | 
| 214 parser.begin(); | |
| 215 if( !parser.match('"') ) | |
| 216 return parser.failure(null); | |
| 217 StringBuilder sb = new StringBuilder(); | |
| 218 while( parser.anyChar() ) { | |
| 219 char c = parser.lastChar(); | |
| 220 switch(c) { | |
| 221 case '"': | |
| 1564 
b1195cfe8712
lucene/queryparser fix
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1459diff
changeset | 222 Spaces(); | 
| 1422 | 223 return parser.success(sb.toString()); | 
| 224 case '\\': | |
| 225 if( parser.anyChar() ) { | |
| 226 c = parser.lastChar(); | |
| 227 switch(c) { | |
| 228 case '"': | |
| 229 case '\\': | |
| 230 sb.append(c); | |
| 231 continue; | |
| 232 case 'b': | |
| 233 sb.append('\b'); | |
| 234 continue; | |
| 235 case 'f': | |
| 236 sb.append('\f'); | |
| 237 continue; | |
| 238 case 'n': | |
| 239 sb.append('\n'); | |
| 240 continue; | |
| 241 case 'r': | |
| 242 sb.append('\r'); | |
| 243 continue; | |
| 244 case 't': | |
| 245 sb.append('\t'); | |
| 246 continue; | |
| 247 case 'u': | |
| 248 int n = 0; | |
| 249 for( int i=0; i<4; i++ ) { | |
| 250 int d; | |
| 251 if( parser.inCharRange('0','9') ) { | |
| 252 d = parser.lastChar() - '0'; | |
| 253 } else if( parser.inCharRange('a','f') ) { | |
| 254 d = parser.lastChar() - 'a' + 10; | |
| 255 } else if( parser.inCharRange('A','F') ) { | |
| 256 d = parser.lastChar() - 'A' + 10; | |
| 257 } else { | |
| 258 throw exception("invalid hex digit"); | |
| 259 } | |
| 260 n = 16*n + d; | |
| 261 } | |
| 262 sb.append((char)n); | |
| 263 continue; | |
| 264 } | |
| 265 } | |
| 266 throw exception("invalid escape char"); | |
| 267 default: | |
| 268 sb.append(c); | |
| 269 } | |
| 270 } | |
| 271 parser.failure(); | |
| 272 throw exception("unclosed string"); | |
| 273 } | |
| 274 | |
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 275 private String Unquoted(String exclude) throws ParseException { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 276 int start = parser.begin(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 277 while( parser.noneOf(exclude) ) { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 278 checkEscape(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 279 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 280 String match = parser.textFrom(start); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 281 Spaces(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 282 return parser.success(match); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 283 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 284 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 285 private void checkEscape() { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 286 if( parser.lastChar() == '\\' ) | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 287 parser.anyChar(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 288 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 289 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 290 private void Spaces() { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 291 while( Space() ); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 292 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 293 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 294 private boolean Space() { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 295 return parser.anyOf(" \t\r\n"); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 296 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 297 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 298 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 299 // sort | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 300 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 301 private Sort parseSort() throws ParseException { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 302 Spaces(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 303 if( parser.endOfInput() ) | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 304 return null; | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 305 List<SortField> list = new ArrayList<SortField>(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 306 list.add( SortField() ); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 307 while( !parser.endOfInput() ) { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 308 parser.begin(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 309 if( !parser.match(',') ) | 
| 1110 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 310 throw exception("',' expected"); | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 311 Spaces(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 312 parser.success(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 313 list.add( SortField() ); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 314 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 315 return new Sort(list.toArray(new SortField[0])); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 316 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 317 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 318 private SortField SortField() throws ParseException { | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 319 parser.begin(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 320 String field = Field(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 321 if( field==null ) | 
| 1110 
38a42f437fd2
queryparser now uses parsers.Parser
 Franklin Schmidt <fschmidt@gmail.com> parents: 
775diff
changeset | 322 throw exception("invalid input"); | 
| 730 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 323 boolean reverse = !parser.matchIgnoreCase("asc") && parser.matchIgnoreCase("desc"); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 324 Spaces(); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 325 SortField sf = fieldParser.getSortField(this,field,reverse); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 326 return parser.success(sf); | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 327 } | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 328 | 
| 
01e68da6983b
add sane-lucene-queryparser source to luan
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 329 } | 
