private void iterate(byte[] input, HSearchQuery query, IHSearchPlugin pluginI, int mode)
      throws IOException, NumberFormatException {

    MapperKVBase plugin = castPlugin(pluginI);
    MapperKVBase.TablePartsCallback callback = plugin.getPart();

    Cell2FilterVisitor cell2Visitor = new Cell2FilterVisitor(query, pluginI, callback, mode);

    query.parseValuesConcurrent(new String[] {"Integer", "Integer"});

    cell2Visitor.matchingCell0 = (query.filterCells[0]) ? (Integer) query.exactValCellsO[0] : null;
    Integer matchingCell1 = (query.filterCells[1]) ? (Integer) query.exactValCellsO[1] : null;

    cell2Visitor.cellMin0 =
        (query.minValCells[0] == HSearchQuery.DOUBLE_MIN_VALUE)
            ? null
            : new Double(query.minValCells[0]).intValue();
    Integer cellMin1 =
        (query.minValCells[1] == HSearchQuery.DOUBLE_MIN_VALUE)
            ? null
            : new Double(query.minValCells[1]).intValue();

    cell2Visitor.cellMax0 =
        (query.maxValCells[0] == HSearchQuery.DOUBLE_MAX_VALUE)
            ? null
            : new Double(query.maxValCells[0]).intValue();
    Integer cellMax1 =
        (query.maxValCells[1] == HSearchQuery.DOUBLE_MAX_VALUE)
            ? null
            : new Double(query.maxValCells[1]).intValue();

    cell2Visitor.inValues0 = (query.inValCells[0]) ? (Integer[]) query.inValuesAO[0] : null;
    Integer[] inValues1 = (query.inValCells[1]) ? (Integer[]) query.inValuesAO[1] : null;

    this.table.data = new BytesSection(input);
    if (query.filterCells[1]) {
      if (query.notValCells[1]) this.table.processNot(matchingCell1, cell2Visitor);
      else if (query.inValCells[1]) this.table.processIn(inValues1, cell2Visitor);
      else this.table.process(matchingCell1, cellMin1, cellMax1, cell2Visitor);
    } else {
      this.table.process(cell2Visitor);
    }

    if (null != callback) {
      callback.onReadComplete();
    }
    if (null != plugin) {
      plugin.onReadComplete();
    }
  }