Skip to content

Commit f31e811

Browse files
committed
edit
1 parent 8e98a8b commit f31e811

File tree

2 files changed

+41
-44
lines changed

2 files changed

+41
-44
lines changed

src/main/java/org/usf/jquery/core/TypedOperator.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,15 @@ public OperationColumn operation(Object... args) {
3737
throw badArgumentsException(toString(), operator.id() + joinAndDelemitArray(SCOMA, "(", ")", args), e);
3838
}
3939
}
40+
41+
public boolean isCountFunction() {
42+
return "COUNT".equals(operator.id());
43+
}
4044

41-
public Operator unwrap() {
42-
return operator;
45+
public boolean isWindowFunction() {
46+
return operator instanceof WindowFunction;
4347
}
44-
48+
4549
@Override
4650
public String toString() {
4751
return operator.id() + parameterSet.toString();

src/main/java/org/usf/jquery/web/RequestEntryChain.java

Lines changed: 34 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,8 @@
4444
import java.util.List;
4545
import java.util.Optional;
4646
import java.util.function.IntFunction;
47-
import java.util.function.Predicate;
4847
import java.util.stream.Stream;
4948

50-
import org.usf.jquery.core.AggregateFunction;
5149
import org.usf.jquery.core.ComparisonExpression;
5250
import org.usf.jquery.core.DBColumn;
5351
import org.usf.jquery.core.DBFilter;
@@ -68,7 +66,6 @@
6866
import org.usf.jquery.core.TypedOperator;
6967
import org.usf.jquery.core.ViewColumn;
7068
import org.usf.jquery.core.ViewJoin;
71-
import org.usf.jquery.core.WindowFunction;
7269

7370
import lombok.AccessLevel;
7471
import lombok.AllArgsConstructor;
@@ -242,10 +239,10 @@ public DBFilter evalFilter(ViewDecorator td, QueryContext ctx) {
242239
return evalFilter(td, ctx, emptyList());
243240
}
244241

245-
//[view.]criteria | [view.]column.criteria | [view.]column[.operator]*[.comparator]
246-
public DBFilter evalFilter(ViewDecorator vd, QueryContext ctx, List<RequestEntryChain> values) { //supply values
242+
//[view.]criteria | [view.]column.criteria | [view.]column[.operator]*[.comparator][.and|or(comparator)]*
243+
public DBFilter evalFilter(ViewDecorator vd, QueryContext ctx, List<RequestEntryChain> values) { //use CD.parser
247244
var res = chainColumnOperations(vd, ctx, true);
248-
if(res.isEmpty()) { //not a column
245+
if(res.isEmpty()) {
249246
throw noSuchViewColumnException(this);
250247
}
251248
var rc = res.get();
@@ -307,7 +304,7 @@ private Optional<ViewResource> chainColumnOperations(ViewDecorator td, QueryCont
307304
if(nonNull(r.col)) {
308305
var e = r.entry.next;
309306
while(nonNull(e)) { //chain until !operator
310-
var o = e.lookupOperation(td, ctx, r.col, null, fn-> true); //accept all
307+
var o = e.lookupOperation(td, ctx, r.col, null); //accept all
311308
if(o.isEmpty()) {
312309
break;
313310
}
@@ -318,7 +315,6 @@ private Optional<ViewResource> chainColumnOperations(ViewDecorator td, QueryCont
318315
: o.get();
319316
e = e.next;
320317
}
321-
322318
} //else view criteria
323319
return r;
324320
});
@@ -331,23 +327,25 @@ private static DBColumn windowColumn(ViewDecorator vd, QueryContext ctx, DBColum
331327
return new ViewColumn(v, doubleQuote(tag), null, col.getType());
332328
}
333329

330+
//view.resource | resource
334331
private Optional<ViewResource> lookupResource(ViewDecorator vd, QueryContext ctx) { //do not change priority
335-
if(hasNext()) { //view.id == column.id
332+
if(hasNext()) {
336333
var rc = currentContext().lookupRegisteredView(value);
337334
if(rc.isPresent()) {
338335
var res = next.lookupQueryResource(rc.get()) //declared query first
339-
.or(()-> next.lookupViewResource(vd, ctx, rc.get(), RequestEntryChain::isWindowFunction));
336+
.or(()-> next.lookupViewResource(vd, ctx, rc.get()));
340337
if(res.isPresent()) {
341338
requireNoArgs();
342339
return res;
343340
}
344341
}
345-
}
342+
} //view.id == column.id
346343
return ctx.lookupDeclaredColumn(value)
347344
.map(c-> new ViewResource(requireNoArgs(), null, null, c)) //declared column first
348-
.or(()-> lookupViewResource(vd, ctx, null, fn-> true)); //registered column
345+
.or(()-> lookupViewResource(vd, ctx, null)); //registered column
349346
}
350347

348+
//query.column
351349
private Optional<ViewResource> lookupQueryResource(ViewDecorator vd) {
352350
if(vd instanceof QueryDecorator qd) {
353351
try {
@@ -358,41 +356,45 @@ private Optional<ViewResource> lookupQueryResource(ViewDecorator vd) {
358356
return empty();
359357
}
360358

361-
//view[.operator|column|criteria]
362-
private Optional<ViewResource> lookupViewResource(ViewDecorator vd, QueryContext ctx, ViewDecorator current, Predicate<TypedOperator> pre) {
359+
//view[.operator|column[.criteria]|criteria]
360+
private Optional<ViewResource> lookupViewResource(ViewDecorator vd, QueryContext ctx, ViewDecorator current) {
363361
var cur = requireNonNullElse(current, vd);
364-
return lookupOperation(vd, ctx, null, current, pre)
362+
return lookupOperation(vd, ctx, null, current)
365363
.map(col-> new ViewResource(this, cur, null, col))
366364
.or(()-> lookupColumnResource(cur))
367365
.or(()-> ofNullable(cur.criteria(value)).map(crt-> new ViewResource(this, cur, crt)));
368366
}
369367

370-
private Optional<OperationColumn> lookupOperation(ViewDecorator vd, QueryContext ctx, DBColumn col, ViewDecorator current, Predicate<TypedOperator> opr) {
371-
return lookupOperator(value).filter(opr).map(fn-> {
368+
private Optional<OperationColumn> lookupOperation(ViewDecorator vd, QueryContext ctx, DBColumn col, ViewDecorator current) {
369+
var res = lookupOperator(value);
370+
if(isNull(col) && nonNull(current)) { //view.[count|rank|rowNumber|danseRank]
371+
res = res.filter(op-> op.isCountFunction() || op.isWindowFunction());
372+
}
373+
return res.map(fn-> {
372374
var c = col;
373-
if(isNull(c) && isEmpty(args) && isCountFunction(fn)) {
375+
if(isNull(c) && isEmpty(args) && fn.isCountFunction()) {
374376
c = allColumns(requireNonNullElse(current, vd).view());
375377
}
376378
return fn.operation(toArgs(vd, ctx, c, fn.getParameterSet()));
377379
});
378380
}
379381

380-
Optional<ViewResource> lookupColumnResource(ViewDecorator td) {
381-
try {
382-
var res = currentContext().lookupRegisteredColumn(value);
383-
if(res.isPresent()) {
384-
var cd = res.get();
382+
private Optional<ViewResource> lookupColumnResource(ViewDecorator td) {
383+
var res = currentContext().lookupRegisteredColumn(value);
384+
if(res.isPresent()) {
385+
var cd = res.get();
386+
try {
385387
var col = td.column(cd); //throw exception
386-
if(hasNext()) {
387-
var crt = res.get().criteria(next.value);
388+
if(hasNext() && lookupComparator(next.value).isEmpty()) { //!comparator
389+
var crt = cd.criteria(next.value);
388390
if(nonNull(crt)) {
389-
return Optional.of(new ViewResource(next, td, cd, col, crt));
391+
return Optional.of(new ViewResource(requireNoArgs().next, td, cd, col, crt));
390392
}
391393
}
392-
return Optional.of(new ViewResource(this, td, cd, col));
394+
return Optional.of(new ViewResource(requireNoArgs(), td, cd, col));
393395
}
396+
catch(Exception e) {/*do not throw exception*/} //TD specific exception
394397
}
395-
catch(Exception e) {/*do not throw exception*/}
396398
return empty();
397399
}
398400

@@ -495,16 +497,7 @@ public String toString() {
495497
}
496498
return isNull(tag) ? s : s + ":" + tag;
497499
}
498-
499-
private static boolean isWindowFunction(TypedOperator op) {
500-
var fn = op.unwrap();
501-
return fn instanceof WindowFunction || fn instanceof AggregateFunction; //rank() | sum(col)
502-
}
503-
504-
private static boolean isCountFunction(TypedOperator fn) {
505-
return "COUNT".equals(fn.unwrap().id());
506-
}
507-
500+
508501
private static String[] toStringArray(List<RequestEntryChain> entries) {
509502
if(!isEmpty(entries)) {
510503
return entries.stream()
@@ -540,8 +533,8 @@ static EntrySyntaxException expectedEntryTagException(RequestEntryChain e) {
540533
static final class ViewResource {
541534

542535
private RequestEntryChain entry;
543-
private ViewDecorator vd; //optional
544-
private ColumnDecorator cd; //optional
536+
private ViewDecorator vd;
537+
private ColumnDecorator cd;
545538
private DBColumn col;
546539
private CriteriaBuilder<DBFilter> viewCrt;
547540
private CriteriaBuilder<ComparisonExpression> colCrt;
@@ -564,7 +557,7 @@ private boolean isCriteria() {
564557

565558
@Override
566559
public String toString() {
567-
return vd + "." + cd + " => " + entry.toString();
560+
return entry.toString();
568561
}
569562
}
570563
}

0 commit comments

Comments
 (0)