(final Item item1, final Item item2, final InputInfo info)
| 22 | /** Addition. */ |
| 23 | ADD("+") { |
| 24 | @Override |
| 25 | public Item eval(final Item item1, final Item item2, final InputInfo info) |
| 26 | throws QueryException { |
| 27 | final Type type1 = item1.type, type2 = item2.type; |
| 28 | final boolean num1 = type1.isNumberOrUntyped(), num2 = type2.isNumberOrUntyped(); |
| 29 | if(num1 && num2) { |
| 30 | return switch(numType(type1, type2)) { |
| 31 | case INTEGER -> addInt(item1, item2, info); |
| 32 | case DOUBLE -> addDbl(item1, item2, info); |
| 33 | case FLOAT -> addFlt(item1, item2, info); |
| 34 | default -> addDec(item1, item2, info); |
| 35 | }; |
| 36 | } else if(type1 == type2) { |
| 37 | if(type1 == YEAR_MONTH_DURATION) return new YMDur((YMDur) item1, (YMDur) item2, true, info); |
| 38 | if(type1 == DAY_TIME_DURATION) return new DTDur((DTDur) item1, (DTDur) item2, true, info); |
| 39 | } else { |
| 40 | if(type1.instanceOf(DATE_TIME)) return new Dtm((Dtm) item1, dur(info, item2), true, info); |
| 41 | if(type2.instanceOf(DATE_TIME)) return new Dtm((Dtm) item2, dur(info, item1), true, info); |
| 42 | if(type1 == DATE) return new Dat((Dat) item1, dur(info, item2), true, info); |
| 43 | if(type2 == DATE) return new Dat((Dat) item2, dur(info, item1), true, info); |
| 44 | if(type1 == TIME && type2 == DAY_TIME_DURATION) |
| 45 | return new Tim((Tim) item1, (DTDur) item2, true); |
| 46 | if(type2 == TIME && type1 == DAY_TIME_DURATION) |
| 47 | return new Tim((Tim) item2, (DTDur) item1, true); |
| 48 | } |
| 49 | throw typeError(info, item1, item2); |
| 50 | } |
| 51 | |
| 52 | @Override |
| 53 | public Expr optimize(final Expr expr1, final Expr expr2, final InputInfo info, |
nothing calls this directly
no test coverage detected