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)
| 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 | } |
no test coverage detected