comparison src/luan/lib/queryparser/SaneQueryParser.java @ 1362:77f2d091f17f

minor - SaneQueryParser
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 26 May 2019 12:42:08 -0600
parents dc2af9d5463b
children
comparison
equal deleted inserted replaced
1361:9eba6bf0163b 1362:77f2d091f17f
28 public static Sort parseSort(FieldParser fieldParser,String sort) throws ParseException { 28 public static Sort parseSort(FieldParser fieldParser,String sort) throws ParseException {
29 return new SaneQueryParser(fieldParser,sort).parseSort(); 29 return new SaneQueryParser(fieldParser,sort).parseSort();
30 } 30 }
31 31
32 32
33 private static final String NOT_IN_TERM = " \t\r\n\":[]{}^+-()"; 33 private static final String NOT_IN_RANGE = " \t\r\n\":[]{}^+()";
34 private static final String NOT_IN_TERM = NOT_IN_RANGE + "-";
34 private static final String NOT_IN_FIELD = NOT_IN_TERM + ","; 35 private static final String NOT_IN_FIELD = NOT_IN_TERM + ",";
35 private final FieldParser fieldParser; 36 private final FieldParser fieldParser;
36 private final Parser parser; 37 private final Parser parser;
37 38
38 private SaneQueryParser(FieldParser fieldParser,String query) { 39 private SaneQueryParser(FieldParser fieldParser,String query) {
89 Query query = NestedTerm(field); 90 Query query = NestedTerm(field);
90 if( query == null ) 91 if( query == null )
91 query = RangeTerm(field); 92 query = RangeTerm(field);
92 if( query == null ) { 93 if( query == null ) {
93 parser.begin(); 94 parser.begin();
94 String match = SimpleTerm(); 95 String match = SimpleTerm(NOT_IN_TERM);
95 query = fieldParser.getQuery(this,field,match); 96 query = fieldParser.getQuery(this,field,match);
96 parser.success(); 97 parser.success();
97 } 98 }
98 if( parser.match('^') ) { 99 if( parser.match('^') ) {
99 Spaces(); 100 Spaces();
143 parser.begin(); 144 parser.begin();
144 if( !parser.anyOf("[{") ) 145 if( !parser.anyOf("[{") )
145 return parser.failure(null); 146 return parser.failure(null);
146 boolean includeMin = parser.lastChar() == '['; 147 boolean includeMin = parser.lastChar() == '[';
147 Spaces(); 148 Spaces();
148 String minQuery = SimpleTerm(); 149 String minQuery = SimpleTerm(NOT_IN_RANGE);
149 TO(); 150 TO();
150 String maxQuery = SimpleTerm(); 151 String maxQuery = SimpleTerm(NOT_IN_RANGE);
151 if( !parser.anyOf("]}") ) 152 if( !parser.anyOf("]}") )
152 throw exception("unclosed range"); 153 throw exception("unclosed range");
153 boolean includeMax = parser.lastChar() == ']'; 154 boolean includeMax = parser.lastChar() == ']';
154 Spaces(); 155 Spaces();
155 Query query = fieldParser.getRangeQuery(this,field,minQuery,maxQuery,includeMin,includeMax); 156 Query query = fieldParser.getRangeQuery(this,field,minQuery,maxQuery,includeMin,includeMax);
162 throw exception("'TO' expected"); 163 throw exception("'TO' expected");
163 Spaces(); 164 Spaces();
164 parser.success(); 165 parser.success();
165 } 166 }
166 167
167 private String SimpleTerm() throws ParseException { 168 private String SimpleTerm(String exclude) throws ParseException {
168 parser.begin(); 169 parser.begin();
169 String match; 170 String match;
170 if( parser.match('"') ) { 171 if( parser.match('"') ) {
171 int start = parser.currentIndex() - 1; 172 int start = parser.currentIndex() - 1;
172 while( !parser.match('"') ) { 173 while( !parser.match('"') ) {
176 checkEscape(); 177 checkEscape();
177 } 178 }
178 match = parser.textFrom(start); 179 match = parser.textFrom(start);
179 Spaces(); 180 Spaces();
180 } else { 181 } else {
181 match = Unquoted(NOT_IN_TERM); 182 match = Unquoted(exclude);
182 } 183 }
183 if( match.length() == 0 ) 184 if( match.length() == 0 )
184 throw exception("invalid input"); 185 throw exception("invalid input");
185 return parser.success(match); 186 return parser.success(match);
186 } 187 }