private void testDeleteEventOriginalFiltering2() throws Exception {
    boolean filterOn =
        HiveConf.getBoolVar(conf, HiveConf.ConfVars.FILTER_DELETE_EVENTS);

    conf.setBoolean(hive_metastoreConstants.TABLE_IS_TRANSACTIONAL, false);

    // Need to use a bigger row than DummyRow for the writer to flush the stripes
    conf.set(IOConstants.SCHEMA_EVOLUTION_COLUMNS, BigRow.getColumnNamesProperty());
    conf.set(IOConstants.SCHEMA_EVOLUTION_COLUMNS_TYPES, BigRow.getColumnTypesProperty());

    Properties properties = new Properties();

    OrcFile.WriterOptions writerOptions = OrcFile.writerOptions(properties, conf);
    writerOptions.inspector(bigOriginalRowInspector)
        .stripeSize(1)
        .batchSize(1);

    String originalFile = "000000_0";
    Path originalFilePath = new Path(root, originalFile);

    byte[] data = new byte[1000];
    Writer writer = OrcFile.createWriter(originalFilePath, writerOptions);
    writer.addRow(new BigOriginalRow(data));
    writer.addRow(new BigOriginalRow(data));
    writer.addRow(new BigOriginalRow(data));
    writer.close();

    Reader reader = OrcFile.createReader(originalFilePath, OrcFile.readerOptions(conf));

    List<StripeInformation> stripes = reader.getStripes();

    // Make sure 3 stripes are created
    assertEquals(3, stripes.size());

    FileStatus fileStatus = fs.getFileStatus(originalFilePath);
    long fileLength = fileStatus.getLen();

    // Set vector mode to true in the map work so that we can generate the syntheticProps
    MapWork mapWork = new MapWork();
    mapWork.setVectorMode(true);
    VectorizedRowBatchCtx vrbContext = new VectorizedRowBatchCtx();
    mapWork.setVectorizedRowBatchCtx(vrbContext);
    HiveConf.setVar(conf, HiveConf.ConfVars.PLAN, "//tmp");
    Utilities.setMapWork(conf, mapWork);

    OrcSplit.OffsetAndBucketProperty syntheticProps = VectorizedOrcAcidRowBatchReader.computeOffsetAndBucket(
        fileStatus, root, true, true, conf);

    AcidOutputFormat.Options options = new AcidOutputFormat.Options(conf)
        .bucket(0);
    int bucketProperty = BucketCodec.V1.encode(options);

    // 1. Splits within a stripe
    // A split that's completely within the 2nd stripe
    StripeInformation stripe = stripes.get(1);
    OrcSplit split = new OrcSplit(originalFilePath, null,
        stripe.getOffset() + 50,
        stripe.getLength() - 100,
        new String[] {"localhost"}, null, true, true, getDeltaMetaDataWithBucketFile(0),
        fileLength, fileLength, root, syntheticProps);

    validateKeyInterval(split, new RecordIdentifier(0, bucketProperty, 2),
        new RecordIdentifier(0, bucketProperty, 1), filterOn);

    // A split that's completely within the last stripe
    stripe = stripes.get(2);
    split = new OrcSplit(originalFilePath, null,
        stripe.getOffset() + 50,
        stripe.getLength() - 100,
        new String[] {"localhost"}, null, true, true, getDeltaMetaDataWithBucketFile(0),
        fileLength, fileLength, root, syntheticProps);

    validateKeyInterval(split, new RecordIdentifier(0, bucketProperty, 3),
        new RecordIdentifier(0, bucketProperty, 2), filterOn);

    // 2. Splits starting at a stripe boundary
    // A split that starts where the 1st stripe starts and ends before the 1st stripe ends
    stripe = stripes.get(0);
    split = new OrcSplit(originalFilePath, null,
        stripe.getOffset(),
        stripe.getLength() - 50,
        new String[] {"localhost"}, null, true, true, getDeltaMetaDataWithBucketFile(0),
        fileLength, fileLength, root, syntheticProps);

    // The key interval for the 1st stripe
    validateKeyInterval(split, new RecordIdentifier(0, bucketProperty, 0),
        new RecordIdentifier(0, bucketProperty, 0), filterOn);

    // A split that starts where the 2nd stripe starts and ends after the 2nd stripe ends
    stripe = stripes.get(1);
    split = new OrcSplit(originalFilePath, null,
        stripe.getOffset(),
        stripe.getLength() + 50,
        new String[] {"localhost"}, null, true, true, getDeltaMetaDataWithBucketFile(0),
        fileLength, fileLength, root, syntheticProps);

    // The key interval for the last 2 stripes
    validateKeyInterval(split, new RecordIdentifier(0, bucketProperty, 1),
        new RecordIdentifier(0, bucketProperty, 2), filterOn);

    // 3. Splits ending at a stripe boundary
    // A split that starts before the last stripe starts and ends at the last stripe boundary
    stripe = stripes.get(2);
    split = new OrcSplit(originalFilePath, null,
        stripe.getOffset() - 50,
        stripe.getLength() + 50,
        new String[] {"localhost"}, null, true, true, getDeltaMetaDataWithBucketFile(0),
        fileLength, fileLength, root, syntheticProps);

    // The key interval for the last stripe
    validateKeyInterval(split, new RecordIdentifier(0, bucketProperty, 2),
        new RecordIdentifier(0, bucketProperty, 2), filterOn);

    // A split that starts after the 1st stripe starts and ends where the last stripe ends
    split = new OrcSplit(originalFilePath, null,
        stripes.get(0).getOffset() + 50,
        reader.getContentLength() - 50,
        new String[] {"localhost"}, null, true, true, getDeltaMetaDataWithBucketFile(0),
        fileLength, fileLength, root, syntheticProps);

    // The key interval for the last 2 stripes
    validateKeyInterval(split, new RecordIdentifier(0, bucketProperty, 1),
        new RecordIdentifier(0, bucketProperty, 2), filterOn);

    // A split that starts where the 1st stripe starts and ends where the last stripe ends
    split = new OrcSplit(originalFilePath, null,
        stripes.get(0).getOffset(),
        reader.getContentLength(),
        new String[] {"localhost"}, null, true, true, getDeltaMetaDataWithBucketFile(0),
        fileLength, fileLength, root, syntheticProps);

    // The key interval for all 3 stripes
    validateKeyInterval(split, new RecordIdentifier(0, bucketProperty, 0),
        new RecordIdentifier(0, bucketProperty, 2), filterOn);
  }
Tests that we can figure out min/max ROW__ID for each split and then use
that to only load delete events between min/max.
This test doesn't actually check what is read - that is done more E2E
unit tests.
@throws Exception
ql/src/test/org/apache/hadoop/hive/ql/io/orc/TestVectorizedOrcAcidRowBatchReader.java