MCPcopy Create free account
hub / github.com/BaseXdb/basex / countRange

Method countRange

basex-core/src/main/java/org/basex/query/expr/Cmp.java:384–412  ·  view source on GitHub ↗

Analyzes the comparison and returns its optimization type. @param op operator @param count count to compare against @return comparison type, min/max range or null

(final CmpOp op, final double count)

Source from the content-addressed store, hash-verified

382 * @return comparison type, min/max range or {@code null}
383 */
384 private static long[] countRange(final CmpOp op, final double count) {
385 // skip special cases
386 if(!Double.isFinite(count)) return null;
387
388 // > (v<0), != (v<0), >= (v<=0), != integer(v)
389 final long cnt = (long) count;
390 if(op.oneOf(CmpOp.GT, CmpOp.NE) && count < 0 ||
391 op == CmpOp.GE && count <= 0 ||
392 op == CmpOp.NE && count != cnt) return COUNT_TRUE;
393 // < (v<=0), <= (v<0), = (v<0), != integer(v)
394 if(op == CmpOp.LT && count <= 0 ||
395 op.oneOf(CmpOp.LE, CmpOp.EQ) && count < 0 ||
396 op == CmpOp.EQ && count != cnt) return COUNT_FALSE;
397 // < (v<=1), <= (v<1), = (v=0)
398 if(op == CmpOp.LT && count <= 1 ||
399 op == CmpOp.LE && count < 1 ||
400 op == CmpOp.EQ && count == 0) return COUNT_EMPTY;
401 // > (v<1), >= (v<=1), != (v=0)
402 if(op == CmpOp.GT && count < 1 ||
403 op == CmpOp.GE && count <= 1 ||
404 op == CmpOp.NE && count == 0) return COUNT_EXISTS;
405 // range queries
406 if(op == CmpOp.GT) return new long[] { (long) Math.floor(count) + 1 };
407 if(op == CmpOp.GE) return new long[] { (long) Math.ceil(count) };
408 if(op == CmpOp.LT) return new long[] { 0, (long) Math.ceil(count) - 1 };
409 if(op == CmpOp.LE) return new long[] { 0, (long) Math.floor(count) };
410 if(op == CmpOp.EQ) return new long[] { cnt, cnt };
411 return null;
412 }
413}

Callers 2

optCountMethod · 0.95
optStringLengthMethod · 0.95

Calls 2

oneOfMethod · 0.65
floorMethod · 0.45

Tested by

no test coverage detected