Package com.cloudera.cdk.data.filesystem

Source Code of com.cloudera.cdk.data.filesystem.TestFileSystemPartitionIteratorTolerance

/*
* Copyright "2013" Cloudera.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.cloudera.cdk.data.filesystem;

import com.cloudera.cdk.data.spi.Marker;
import com.cloudera.cdk.data.MiniDFSTest;
import com.cloudera.cdk.data.PartitionStrategy;
import com.cloudera.cdk.data.spi.StorageKey;
import com.cloudera.cdk.data.spi.MarkerComparator;
import com.cloudera.cdk.data.spi.MarkerRange;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.common.io.Files;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Set;

@RunWith(Parameterized.class)
public class TestFileSystemPartitionIteratorTolerance extends MiniDFSTest {
  public FileSystem fileSystem;
  public Path testDirectory;
  public static PartitionStrategy strategy;
  public static MarkerRange unbounded;
  public static List<StorageKey> keys;

  @BeforeClass
  public static void createExpectedKeys() {
    strategy = new PartitionStrategy.Builder()
        .year("timestamp")
        .month("timestamp")
        .day("timestamp")
        .build();

    unbounded = new MarkerRange(new MarkerComparator(strategy));

    keys = Lists.newArrayList();
    for (Object year : Arrays.asList(2012, 2013)) {
      for (Object month : Arrays.asList(9, 10, 11, 12)) {
        for (Object day : Arrays.asList(22, 24, 25)) {
          StorageKey k = new StorageKey.Builder(strategy)
              .add("year", year).add("month", month).add("day", day).build();
          keys.add(k);
        }
      }
    }
  }

  @Parameterized.Parameters
  public static Collection<Object[]> data() throws IOException {
    MiniDFSTest.setupFS();
    Object[][] data = new Object[][] {
        { getDFS() },
        { getFS() } };
    return Arrays.asList(data);
  }

  public TestFileSystemPartitionIteratorTolerance(FileSystem fileSystem) {
    this.fileSystem = fileSystem;
  }

  @Before
  public void createDirectoryLayout() throws Exception {
    testDirectory = fileSystem.makeQualified(
        new Path(Files.createTempDir().getAbsolutePath()));

    // 2012 had no names in the directory layout
    for (String year : Arrays.asList("2012")) {
      final Path yearPath = new Path(testDirectory, year);
      for (String month : Arrays.asList("09", "10", "11", "12")) {
        final Path monthPath = new Path(yearPath, month);
        for (String day : Arrays.asList("22", "24", "25")) {
          final Path dayPath = new Path(monthPath, day);
          fileSystem.mkdirs(dayPath);
        }
      }
    }
    // 2013-09 is mixed
    for (String year : Arrays.asList("2013")) {
      final Path yearPath = new Path(testDirectory, year);
      for (String month : Arrays.asList("09")) {
        final Path monthPath = new Path(yearPath, month);
        for (String day : Arrays.asList("22", "24")) {
          final Path dayPath = new Path(monthPath, day);
          fileSystem.mkdirs(dayPath);
        }
      }
    }
    for (String year : Arrays.asList("year=2013")) {
      final Path yearPath = new Path(testDirectory, year);
      for (String month : Arrays.asList("month=09")) {
        final Path monthPath = new Path(yearPath, month);
        for (String day : Arrays.asList("day=25")) {
          final Path dayPath = new Path(monthPath, day);
          fileSystem.mkdirs(dayPath);
        }
      }
    }
    // the rest of 2013 has names in the layout
    for (String year : Arrays.asList("year=2013")) {
      final Path yearPath = new Path(testDirectory, year);
      for (String month : Arrays.asList("month=10", "month=11", "month=12")) {
        final Path monthPath = new Path(yearPath, month);
        for (String day : Arrays.asList("day=22", "day=24", "day=25")) {
          final Path dayPath = new Path(monthPath, day);
          fileSystem.mkdirs(dayPath);
        }
      }
    }
  }

  @After
  public void cleanDirectoryLayout() throws Exception {
    fileSystem.delete(testDirectory, true);
  }

  @Test
  public void testUnbounded() throws Exception {
    Iterable<StorageKey> partitions = new FileSystemPartitionIterator(
        fileSystem, testDirectory, strategy, unbounded);

    assertIterableEquals(keys, partitions);
  }

  @Test
  public void testFromKey() throws Exception {
    Marker october_24_2013 = new Marker.Builder().add("year", 2013).add("month", 10).add("day", 24).build();
    Iterable<StorageKey> partitions = new FileSystemPartitionIterator(
        fileSystem, testDirectory, strategy, unbounded.from(october_24_2013));
    assertIterableEquals(keys.subList(16, 24), partitions);
  }

  @Test
  public void testAfterKey() throws Exception {
    Marker october_24_2013 = new Marker.Builder().add("year", 2013).add("month", 10).add("day", 24).build();
    Iterable<StorageKey> partitions = new FileSystemPartitionIterator(
        fileSystem, testDirectory, strategy, unbounded.fromAfter(october_24_2013));
    assertIterableEquals(keys.subList(17, 24), partitions);
  }

  @Test
  public void testToKey() throws Exception {
    Marker october_25_2012 = new Marker.Builder().add("year", 2012).add("month", 10).add("day", 25).build();
    Iterable<StorageKey> partitions = new FileSystemPartitionIterator(
        fileSystem, testDirectory, strategy, unbounded.to(october_25_2012));
    assertIterableEquals(keys.subList(0, 6), partitions);
  }

  @Test
  public void testBeforeKey() throws Exception {
    Marker october_25_2012 = new Marker.Builder().add("year", 2012).add("month", 10).add("day", 25).build();
    Iterable <StorageKey> partitions = new FileSystemPartitionIterator(
        fileSystem, testDirectory, strategy, unbounded.toBefore(october_25_2012));
    assertIterableEquals(keys.subList(0, 5), partitions);
  }

  @Test
  public void testInKey() throws Exception {
    Marker october_24_2013 = new Marker.Builder().add("year", 2013).add("month", 10).add("day", 24).build();
    Iterable<StorageKey> partitions = new FileSystemPartitionIterator(
        fileSystem, testDirectory, strategy, unbounded.of(october_24_2013));
    assertIterableEquals(keys.subList(16, 17), partitions);
  }

  @Test
  public void testKeyRange() throws Exception {
    Marker october_25_2012 = new Marker.Builder().add("year", 2012).add("month", 10).add("day", 25).build();
    Marker october_24_2013 = new Marker.Builder().add("year", 2013).add("month", 10).add("day", 24).build();
    Iterable <StorageKey> partitions = new FileSystemPartitionIterator(
        fileSystem, testDirectory, strategy, unbounded.from(october_25_2012).to(october_24_2013));
    assertIterableEquals(keys.subList(5, 17), partitions);
  }

  @Test
  public void testFromMarker() throws Exception {
    Marker october_2013 = new Marker.Builder().add("year", 2013).add("month", 10).build();
    Iterable <StorageKey> partitions = new FileSystemPartitionIterator(
        fileSystem, testDirectory, strategy, unbounded.from(october_2013));
    assertIterableEquals(keys.subList(15, 24), partitions);
  }

  @Test
  public void testAfterMarker() throws Exception {
    Marker october_2013 = new Marker.Builder().add("year", 2013).add("month", 10).build();
    Iterable<StorageKey> partitions = new FileSystemPartitionIterator(
        fileSystem, testDirectory, strategy, unbounded.fromAfter(october_2013));
    assertIterableEquals(keys.subList(18, 24), partitions);
  }

  @Test
  public void testToMarker() throws Exception {
    Marker october_2012 = new Marker.Builder().add("year", 2012).add("month", 10).build();
    Iterable <StorageKey> partitions = new FileSystemPartitionIterator(
        fileSystem, testDirectory, strategy, unbounded.to(october_2012));
    assertIterableEquals(keys.subList(0, 6), partitions);
  }

  @Test
  public void testBeforeMarker() throws Exception {
    Marker october_2012 = new Marker.Builder().add("year", 2012).add("month", 10).build();
    Iterable<StorageKey> partitions = new FileSystemPartitionIterator(
        fileSystem, testDirectory, strategy, unbounded.toBefore(october_2012));
    assertIterableEquals(keys.subList(0, 3), partitions);
  }

  @Test
  public void testInMarker() throws Exception {
    Marker october_2012 = new Marker.Builder().add("year", 2012).add("month", 10).build();
    Iterable<StorageKey> partitions = new FileSystemPartitionIterator(
        fileSystem, testDirectory, strategy, unbounded.of(october_2012));
    assertIterableEquals(keys.subList(3, 6), partitions);
  }

  @Test
  public void testMarkerRange() throws Exception {
    Marker october_2012 = new Marker.Builder().add("year", 2012).add("month", 10).build();
    Marker october_2013 = new Marker.Builder().add("year", 2013).add("month", 10).build();
    Iterable<StorageKey> partitions = new FileSystemPartitionIterator(
        fileSystem, testDirectory, strategy, unbounded.from(october_2012).toBefore(october_2013));
    assertIterableEquals(keys.subList(3, 15), partitions);
  }

  public static <T> void assertIterableEquals(
      Iterable<T> expected, Iterable<T> actualIterable) {
    Set<T> expectedSet = Sets.newHashSet(expected);
    for (T actual : actualIterable) {
      Assert.assertTrue("Unexpected record: " + actual,
          expectedSet.remove(actual));
    }
    Assert.assertEquals("Not all expected records were present: " + expectedSet,
        0, expectedSet.size());
  }
}
TOP

Related Classes of com.cloudera.cdk.data.filesystem.TestFileSystemPartitionIteratorTolerance

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.