Skip to content

Commit c91db64

Browse files
committed
edit
1 parent 9fd5498 commit c91db64

File tree

5 files changed

+97
-54
lines changed

5 files changed

+97
-54
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import java.util.Objects;
1111
import java.util.Optional;
12+
import java.util.function.Predicate;
1213
import java.util.function.UnaryOperator;
1314

1415
/**
@@ -173,6 +174,10 @@ static RangeComparator rangeComparator(final String name) {
173174
}
174175

175176
static Optional<TypedComparator> lookupComparator(String op) {
176-
return lookup(Comparator.class, TypedComparator.class, op);
177+
return lookup(Comparator.class, TypedComparator.class, op, null);
178+
}
179+
180+
static Optional<TypedComparator> lookupComparator(String op, Predicate<TypedComparator> pre) {
181+
return lookup(Comparator.class, TypedComparator.class, op, pre);
177182
}
178183
}

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

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,27 @@
22

33
import static java.lang.reflect.Modifier.isPrivate;
44
import static java.lang.reflect.Modifier.isStatic;
5+
import static java.util.Objects.isNull;
56
import static java.util.Optional.empty;
67

78
import java.util.Optional;
9+
import java.util.function.Predicate;
810

911
/**
1012
*
1113
* @author u$f
1214
*
1315
*/
1416
public interface DBProcessor extends DBObject {
15-
16-
static <T,U> Optional<U> lookup(Class<T> clazz, Class<U> ext, String op) {
17+
18+
static <T,U> Optional<U> lookup(Class<T> clazz, Class<U> type, String name, Predicate<? super U> pre) {
1719
try {
18-
var m = clazz.getMethod(op); //no parameter
19-
if(m.getReturnType() == ext && isStatic(m.getModifiers()) && !isPrivate(m.getModifiers())) {
20-
return Optional.of(ext.cast(m.invoke(null)));
20+
var m = clazz.getMethod(name); //no parameter
21+
if(m.getReturnType() == type && m.getParameterCount() == 0 && isStatic(m.getModifiers()) && !isPrivate(m.getModifiers())) {
22+
var o = type.cast(m.invoke(null));
23+
if(isNull(pre) || pre.test(o)) {
24+
return Optional.of(o);
25+
}
2126
}
2227
} catch (Exception e) {/* do not throw exception */}
2328
return empty();

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static org.usf.jquery.core.Validation.requireNArgs;
2121

2222
import java.util.Optional;
23+
import java.util.function.Predicate;
2324

2425
/**
2526
*
@@ -335,6 +336,10 @@ static ConstantOperator constant(String name) {
335336
}
336337

337338
static Optional<TypedOperator> lookupOperator(String op) {
338-
return lookup(Operator.class, TypedOperator.class, op);
339+
return lookup(Operator.class, TypedOperator.class, op, null);
340+
}
341+
342+
static Optional<TypedOperator> lookupOperator(String op, Predicate<TypedOperator> pre) {
343+
return lookup(Operator.class, TypedOperator.class, op, pre);
339344
}
340345
}

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

Lines changed: 37 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,7 @@ private Optional<Partition> evalPartition2(ViewDecorator vd, QueryContext ctx) {
204204

205205
//[view.]column[.operator]*
206206
public DBColumn evalColumn(ViewDecorator td, QueryContext ctx, boolean requireTag) {
207-
var r = chainColumnOperations(td, ctx, false)
208-
.orElseThrow(()-> noSuchViewColumnException(this));
207+
var r = chainColumnOperations(td, ctx, false);
209208
r.entry.requireNoNext(); //check next only if column exists
210209
if(nonNull(r.entry.tag)) {
211210
return r.col.as(r.entry.tag);
@@ -218,8 +217,7 @@ public DBColumn evalColumn(ViewDecorator td, QueryContext ctx, boolean requireTa
218217

219218
//[view.]column[.operator]*[.order]
220219
public DBOrder evalOrder(ViewDecorator td, QueryContext ctx) {
221-
var r = chainColumnOperations(td, ctx, false)
222-
.orElseThrow(()-> noSuchViewColumnException(this));
220+
var r = chainColumnOperations(td, ctx, false);
223221
if(r.entry.isLast()) { // default order
224222
return r.col.order();
225223
}
@@ -237,11 +235,7 @@ public DBFilter evalFilter(ViewDecorator td, QueryContext ctx) {
237235

238236
//[view.]criteria | [view.]column.criteria | [view.]column[.operator]*[.comparator][.and|or(comparator)]*
239237
public DBFilter evalFilter(ViewDecorator vd, QueryContext ctx, List<RequestEntryChain> values) { //use CD.parser
240-
var res = chainColumnOperations(vd, ctx, true);
241-
if(res.isEmpty()) {
242-
throw noSuchViewColumnException(this);
243-
}
244-
var rc = res.get();
238+
var rc = chainColumnOperations(vd, ctx, true);
245239
if(rc.isCriteria()) {
246240
var strArgs = toStringArray(rc.entry.assertOuterParameters(values));
247241
if(nonNull(rc.viewCrt)) { //view criteria
@@ -293,25 +287,24 @@ DBFilter chainComparator(ViewDecorator td, QueryContext ctx, DBFilter f) {
293287
return f;
294288
}
295289

296-
private Optional<ViewResource> chainColumnOperations(ViewDecorator vd, QueryContext ctx, boolean filter) {
297-
return lookupResource(vd, ctx, filter).map(r-> {
298-
if(!r.isFilter()) { // !criteria & !comparator
299-
var e = r.entry.next;
300-
while(nonNull(e)) { //chain until !operator
301-
var res = lookupOperator(e.value);
302-
if(res.isEmpty()) {
303-
break;
304-
}
305-
var fn = res.get();
306-
var o = fn.operation(e.toArgs(vd, ctx, r.col, fn.getParameterSet()));
307-
r.cd = null;
308-
r.entry = e;
309-
r.col = filter && "over".equals(e.value) ? windowColumn(r.vd, ctx, o) : o;
310-
e = e.next;
290+
private ViewResource chainColumnOperations(ViewDecorator vd, QueryContext ctx, boolean filter) {
291+
var r = lookupResource(vd, ctx, filter);
292+
if(!r.isFilter()) { // !criteria & !comparator
293+
var e = r.entry.next;
294+
while(nonNull(e)) { //chain until !operator
295+
var res = lookupOperator(e.value);
296+
if(res.isEmpty()) {
297+
break;
311298
}
312-
} //else filter
313-
return r;
314-
});
299+
var fn = res.get();
300+
var o = fn.operation(e.toArgs(vd, ctx, r.col, fn.getParameterSet()));
301+
r.cd = null;
302+
r.entry = e;
303+
r.col = filter && "over".equals(e.value) ? windowColumn(r.vd, ctx, o) : o;
304+
e = e.next;
305+
}
306+
} //else filter
307+
return r;
315308
}
316309

317310
private static DBColumn windowColumn(ViewDecorator vd, QueryContext ctx, DBColumn col) {
@@ -322,21 +315,22 @@ private static DBColumn windowColumn(ViewDecorator vd, QueryContext ctx, DBColum
322315
}
323316

324317
//view.resource | resource
325-
private Optional<ViewResource> lookupResource(ViewDecorator vd, QueryContext ctx, boolean filter) { //do not change priority
318+
private ViewResource lookupResource(ViewDecorator vd, QueryContext ctx, boolean filter) { //do not change priority
326319
if(hasNext()) {
327320
var rc = currentContext().lookupRegisteredView(value);
328321
if(rc.isPresent()) {
329322
var res = next.lookupQueryResource(rc.get()) //declared query first
330323
.or(()-> next.lookupViewResource(vd, ctx, rc.get(), filter));
331324
if(res.isPresent()) {
332325
requireNoArgs();
333-
return res;
326+
return res.get();
334327
}
335328
}
336329
} //view.id == column.id
337330
return ctx.lookupDeclaredColumn(value)
338331
.map(c-> new ViewResource(requireNoArgs(), null, null, c)) //declared column first
339-
.or(()-> lookupViewResource(vd, ctx, null, filter)); //registered column
332+
.or(()-> lookupViewResource(vd, ctx, null, filter)) //registered column
333+
.orElseThrow(()-> noSuchViewColumnException(this)); //no such resource
340334
}
341335

342336
//query.column
@@ -353,23 +347,19 @@ private Optional<ViewResource> lookupQueryResource(ViewDecorator vd) {
353347
//view[.operator|column[.criteria]|criteria]
354348
private Optional<ViewResource> lookupViewResource(ViewDecorator vd, QueryContext ctx, ViewDecorator current, boolean filter) {
355349
var cur = requireNonNullElse(current, vd);
356-
var res = lookupOperation(vd, ctx, null, current)
350+
var res = lookupViewOperation(vd, ctx, current)
357351
.map(col-> new ViewResource(this, cur, null, col))
358352
.or(()-> lookupColumnResource(cur, filter));
359353
return filter ? res.or(()-> ofNullable(cur.criteria(value)).map(crt-> new ViewResource(this, cur, crt))) : res;
360354
}
361355

362-
private Optional<OperationColumn> lookupOperation(ViewDecorator vd, QueryContext ctx, DBColumn col, ViewDecorator current) {
363-
var res = lookupOperator(value);
364-
if(isNull(col) && nonNull(current)) { //view.[count|rank|rowNumber|danseRank]
365-
res = res.filter(op-> op.isCountFunction() || op.isWindowFunction());
366-
}
367-
return res.map(fn-> {
368-
var c = col;
369-
if(isNull(c) && isEmpty(args) && fn.isCountFunction()) {
370-
c = allColumns(requireNonNullElse(current, vd).view());
371-
}
372-
return fn.operation(toArgs(vd, ctx, c, fn.getParameterSet()));
356+
private Optional<OperationColumn> lookupViewOperation(ViewDecorator vd, QueryContext ctx, ViewDecorator current) {
357+
//view.[count|rank|rowNumber|danseRank] only
358+
return lookupOperator(value, isNull(current) ? null : op-> op.isCountFunction() || op.isWindowFunction()).map(fn-> {
359+
var col = isEmpty(args) && fn.isCountFunction()
360+
? allColumns(requireNonNullElse(current, vd).view())
361+
: null;
362+
return fn.operation(toArgs(vd, ctx, col, fn.getParameterSet()));
373363
});
374364
}
375365

@@ -384,7 +374,7 @@ private Optional<ViewResource> lookupColumnResource(ViewDecorator td, boolean fi
384374
if(cmp.isPresent()) {
385375
return Optional.of(new ViewResource(requireNoArgs().next, td, cd, col, cmp.get()));
386376
}
387-
var crt = cd.criteria(next.value);
377+
var crt = cd.criteria(next.value); //TD !operator
388378
if(nonNull(crt)) {
389379
return Optional.of(new ViewResource(requireNoArgs().next, td, cd, col, crt));
390380
}
@@ -539,19 +529,19 @@ static final class ViewResource {
539529
private TypedComparator cmp;
540530

541531
public ViewResource(RequestEntryChain entry, ViewDecorator vd, ColumnDecorator cd, DBColumn col) {
542-
this(entry, vd, cd, col, null, null, null);
532+
this(entry, vd, cd, col, null, null, null); //[view.]column
543533
}
544534

545535
public ViewResource(RequestEntryChain entry, ViewDecorator vd, ColumnDecorator cd, DBColumn col, CriteriaBuilder<ComparisonExpression> colCrt) {
546-
this(entry, vd, cd, col, null, colCrt, null);
536+
this(entry, vd, cd, col, null, colCrt, null); //[view.]colum.criteria
547537
}
548538

549539
public ViewResource(RequestEntryChain entry, ViewDecorator vd, ColumnDecorator cd, DBColumn col, TypedComparator cmp) {
550-
this(entry, vd, cd, col, null, null, cmp);
540+
this(entry, vd, cd, col, null, null, cmp); //[view.]colum.comparator
551541
}
552542

553543
public ViewResource(RequestEntryChain entry, ViewDecorator vd, CriteriaBuilder<DBFilter> viewCrt) {
554-
this(entry, vd, null, null, viewCrt, null, null);
544+
this(entry, vd, null, null, viewCrt, null, null); //[view.]criteria
555545
}
556546

557547
boolean isFilter() {
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package org.usf.jquery.core;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.usf.jquery.core.QueryParameterBuilder.addWithValue;
5+
6+
import org.junit.jupiter.api.Test;
7+
8+
class FunctionOperatorTest {
9+
10+
@Test
11+
void testSql() {
12+
FunctionOperator fn = ()-> "dummy";
13+
assertEquals("dummy()", fn.sql(addWithValue(), new Object[] {}));
14+
}
15+
16+
@Test
17+
void testSql2() {
18+
FunctionOperator fn = ()-> "dummy";
19+
assertEquals("dummy('toto', 123)", fn.sql(addWithValue(), new Object[] {"toto", 123}));
20+
}
21+
22+
@Test
23+
void testSql3() {
24+
FunctionOperator fn = ()-> "dummy";
25+
DBColumn col = b-> "col1";
26+
assertEquals("dummy(col1, 123)", fn.sql(addWithValue(), new Object[] {col, 123}));
27+
}
28+
29+
@Test
30+
void testSql4() {
31+
FunctionOperator fn = ()-> "dummy";
32+
DBColumn col1 = b-> "col1";
33+
DBColumn col2 = b-> "col2";
34+
DBColumn col3 = b-> "col3";
35+
assertEquals("dummy(col1, col2, col3)", fn.sql(addWithValue(), new Object[] {col1, col2, col3}));
36+
}
37+
38+
}

0 commit comments

Comments
 (0)