@Override
 public Row next() {
   if (TAP_NEXT_ENABLED) {
     TAP_NEXT.in();
   }
   try {
     if (CURSOR_LIFECYCLE_ENABLED) {
       CursorLifecycle.checkIdleOrActive(this);
     }
     Row row;
     do {
       row = inputCursor.next();
       if (row == null) {
         close();
       } else if (!filter.maybePresent(hashProjectedRow(row)) || !rowReallyHasMatch(row)) {
         row = null;
       }
     } while (!idle && row == null);
     if (LOG_EXECUTION) {
       LOG.debug("Select_BloomFilter: yield {}", row);
     }
     return row;
   } finally {
     if (TAP_NEXT_ENABLED) {
       TAP_NEXT.out();
     }
   }
 }
 @Override
 public Row next() {
   if (TAP_NEXT_ENABLED) {
     TAP_NEXT.in();
   }
   try {
     if (CURSOR_LIFECYCLE_ENABLED) {
       CursorLifecycle.checkIdleOrActive(this);
     }
     checkQueryCancelation();
     Row row;
     while (skipLeft > 0) {
       if ((row = input.next()) == null) {
         skipLeft = 0;
         limitLeft = -1;
         setIdle();
         if (LOG_EXECUTION) {
           LOG.debug("Limit_Default: skipLeft until complete yield null");
         }
         return null;
       }
       skipLeft--;
     }
     if (limitLeft < 0) {
       setIdle();
       if (LOG_EXECUTION) {
         LOG.debug("Limit_Default: limitLeft < 0, yield null");
       }
       return null;
     }
     if (limitLeft == 0) {
       setIdle();
       if (LOG_EXECUTION) {
         LOG.debug("Limit_Default: limitLeft == 0, yield null");
       }
       return null;
     }
     if ((row = input.next()) == null) {
       limitLeft = -1;
       setIdle();
       if (LOG_EXECUTION) {
         LOG.debug("Limit_Default: yield null");
       }
       return null;
     }
     --limitLeft;
     if (LOG_EXECUTION) {
       LOG.debug("Limit_Default: yield {}", row);
     }
     return row;
   } finally {
     if (TAP_NEXT_ENABLED) {
       TAP_NEXT.out();
     }
   }
 }