Package org.kiji.schema.impl.cassandra

Source Code of org.kiji.schema.impl.cassandra.TestCassandraKijiResult

/**
* (c) Copyright 2014 WibiData, Inc.
*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* 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 org.kiji.schema.impl.cassandra;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.NavigableMap;
import java.util.SortedMap;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSortedMap;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.avro.util.Utf8;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import org.kiji.schema.EntityId;
import org.kiji.schema.KijiCell;
import org.kiji.schema.KijiColumnName;
import org.kiji.schema.KijiDataRequest;
import org.kiji.schema.KijiDataRequestBuilder;
import org.kiji.schema.KijiDataRequestBuilder.ColumnsDef;
import org.kiji.schema.KijiResult;
import org.kiji.schema.KijiResult.Helpers;
import org.kiji.schema.cassandra.CassandraKijiClientTest;
import org.kiji.schema.filter.KijiColumnRangeFilter;
import org.kiji.schema.layout.KijiTableLayouts;
import org.kiji.schema.util.InstanceBuilder;
import org.kiji.schema.util.InstanceBuilder.FamilyBuilder;
import org.kiji.schema.util.InstanceBuilder.QualifierBuilder;
import org.kiji.schema.util.InstanceBuilder.RowBuilder;
import org.kiji.schema.util.InstanceBuilder.TableBuilder;

public class TestCassandraKijiResult extends CassandraKijiClientTest {

  private static final String PRIMITIVE_FAMILY = "primitive";
  private static final String STRING_MAP_FAMILY = "string_map";

  private static final KijiColumnName PRIMITIVE_STRING =
      KijiColumnName.create(PRIMITIVE_FAMILY, "string_column");
  private static final KijiColumnName PRIMITIVE_DOUBLE =
      KijiColumnName.create(PRIMITIVE_FAMILY, "double_column");
  private static final KijiColumnName PRIMITIVE_LONG =
      KijiColumnName.create(PRIMITIVE_FAMILY, "long_column");
  private static final KijiColumnName STRING_MAP_1 =
      KijiColumnName.create(STRING_MAP_FAMILY, "smap_1");
  private static final KijiColumnName STRING_MAP_2 =
      KijiColumnName.create(STRING_MAP_FAMILY, "smap_2");

  private static final Integer ROW = 1;

  private static final NavigableMap<KijiColumnName, NavigableMap<Long, ?>>
      ROW_DATA = ImmutableSortedMap.<KijiColumnName, NavigableMap<Long, ?>>naturalOrder()
      .put(PRIMITIVE_STRING, ImmutableSortedMap.<Long, Utf8>reverseOrder()
              .put(10L, new Utf8("ten"))
              .put(5L, new Utf8("five"))
              .put(4L, new Utf8("four"))
              .put(3L, new Utf8("three"))
              .put(2L, new Utf8("two"))
              .put(1L, new Utf8("one"))
              .build())
      .put(PRIMITIVE_DOUBLE, ImmutableSortedMap.<Long, Double>reverseOrder()
              .put(10L, 10.0)
              .put(5L, 5.0)
              .put(4L, 4.0)
              .put(3L, 3.0)
              .put(2L, 2.0)
              .put(1L, 1.0)
              .build())
      .put(KijiColumnName.create(PRIMITIVE_FAMILY, "long_column"),
          ImmutableSortedMap.<Long, Double>reverseOrder()
              .build())
      .put(STRING_MAP_1, ImmutableSortedMap.<Long, Utf8>reverseOrder()
              .put(10L, new Utf8("sm1-ten"))
              .put(5L, new Utf8("sm1-five"))
              .put(4L, new Utf8("sm1-four"))
              .put(3L, new Utf8("sm1-three"))
              .put(2L, new Utf8("sm1-two"))
              .put(1L, new Utf8("sm1-one"))
              .build())
      .put(STRING_MAP_2, ImmutableSortedMap.<Long, Utf8>reverseOrder()
              .put(10L, new Utf8("sm2-ten"))
              .put(5L, new Utf8("sm2-five"))
              .put(4L, new Utf8("sm2-four"))
              .put(3L, new Utf8("sm2-three"))
              .put(2L, new Utf8("sm2-two"))
              .put(1L, new Utf8("sm2-one"))
              .build())
      .build();

  private CassandraKijiTable mTable;
  private CassandraKijiTableReader mReader;

  @Before
  public void setupTestCassandraKijiResult() throws IOException {

    // Deconstruct map of column name => version => value
    // to family => qualifier => versions => value
    NavigableMap<String, NavigableMap<String, NavigableMap<Long, Object>>> families =
        Maps.newTreeMap();
    for (Entry<KijiColumnName, NavigableMap<Long, ?>> columnEntry : ROW_DATA.entrySet()) {
      final KijiColumnName column = columnEntry.getKey();
      NavigableMap<String, NavigableMap<Long, Object>> qualifiers =
          families.get(column.getFamily());
      if (qualifiers == null) {
        qualifiers = Maps.newTreeMap();
        families.put(column.getFamily(), qualifiers);
      }
      NavigableMap<Long, Object> cells = qualifiers.get(column.getQualifier());
      if (cells == null) {
        cells = Maps.newTreeMap();
        qualifiers.put(column.getQualifier(), cells);
      }
      for (Entry<Long, ?> cellEntry : columnEntry.getValue().entrySet()) {
        cells.put(cellEntry.getKey(), cellEntry.getValue());
      }
    }

    final TableBuilder tableBuilder =
        new InstanceBuilder(getKiji())
            .withTable(KijiTableLayouts
                    .getLayout("org/kiji/schema/layout/all-types-no-counters-schema.json"));

    final RowBuilder rowBuilder = tableBuilder.withRow(ROW);

    for (Entry<String, NavigableMap<String, NavigableMap<Long, Object>>> familyEntry
        : families.entrySet()) {
      final FamilyBuilder familyBuilder = rowBuilder.withFamily(familyEntry.getKey());

      for (Entry<String, NavigableMap<Long, Object>> columnEntry
          : familyEntry.getValue().entrySet()) {
        final QualifierBuilder qualifierBuilder =
            familyBuilder.withQualifier(columnEntry.getKey());

        for (Entry<Long, Object> cellEntry : columnEntry.getValue().entrySet()) {
          qualifierBuilder.withValue(cellEntry.getKey(), cellEntry.getValue());
        }
      }
    }
    tableBuilder.build();


    mTable = getKiji().openTable("all_types_table");
    mReader = mTable.openTableReader();
  }

  @After
  public void cleanupTestCassandraKijiRowView() throws IOException {
    mTable.release();
    mReader.close();
  }

  public void testViewGet(
      final KijiResult<?> view,
      final Iterable<? extends Entry<Long, ?>> expected
  ) {
    final List<Long> versions = Lists.newArrayList();
    final List<Object> values = Lists.newArrayList();

    for (Entry<Long, ?> cell : expected) {
      versions.add(cell.getKey());
      values.add(cell.getValue());
    }

    assertEquals(versions, ImmutableList.copyOf(Helpers.getVersions(view)));
    assertEquals(values, ImmutableList.copyOf(Helpers.getValues(view)));
  }

  public void testViewGet(
      final KijiDataRequest request,
      final Iterable<? extends Entry<Long, ?>> expected
  ) throws Exception {
    final EntityId eid = mTable.getEntityId(ROW);
    final KijiResult<Object> view = mReader.getResult(eid, request);
    try {
      testViewGet(view, expected);
    } finally {
      view.close();
    }
  }

  @Test
  public void testGetFullyQualifiedColumn() throws Exception {
    for (KijiColumnName column : ImmutableList.of(PRIMITIVE_STRING, STRING_MAP_1)) {
      for (int pageSize : ImmutableList.of(0, 1, 2, 10)) {
        { // Single version | no timerange
          final KijiDataRequest request = KijiDataRequest
              .builder()
              .addColumns(
                  ColumnsDef.create()
                      .withPageSize(pageSize)
                      .add(column.getFamily(), column.getQualifier()))
              .build();

          testViewGet(request, Iterables.limit(ROW_DATA.get(column).entrySet(), 1));
        }

        { // Single version | timerange
          final KijiDataRequest request = KijiDataRequest
              .builder()
              .addColumns(
                  ColumnsDef.create()
                      .withPageSize(pageSize)
                      .add(column.getFamily(), column.getQualifier()))
              .withTimeRange(4, 6)
              .build();

          testViewGet(
              request,
              Iterables.limit(ROW_DATA.get(column).subMap(6L, false, 4L, true).entrySet(), 1));
        }

        { // Multiple versions | no timerange
          final KijiDataRequest request = KijiDataRequest
              .builder()
              .addColumns(
                  ColumnsDef.create()
                      .withPageSize(pageSize)
                      .withMaxVersions(100)
                      .add(column.getFamily(), column.getQualifier()))
              .build();

          testViewGet(
              request,
              ROW_DATA.get(column).entrySet());
        }

        { // Multiple versions | timerange
          final KijiDataRequest request = KijiDataRequest
              .builder()
              .addColumns(
                  ColumnsDef.create()
                      .withPageSize(pageSize)
                      .withMaxVersions(100)
                      .add(column.getFamily(), column.getQualifier()))
              .withTimeRange(4, 6)
              .build();

          testViewGet(
              request,
              ROW_DATA.get(column).subMap(6L, false, 4L, true).entrySet());
        }
      }
    }
  }

  @Test
  public void testGetMultipleFullyQualifiedColumns() throws Exception {
    final KijiColumnName column1 = PRIMITIVE_STRING;
    final KijiColumnName column2 = STRING_MAP_1;

    for (int pageSize : ImmutableList.of(0, 1, 2, 10)) {

      { // Single version | no timerange
        final KijiDataRequest request = KijiDataRequest
            .builder()
            .addColumns(
                ColumnsDef.create()
                    .withPageSize(pageSize)
                    .add(column1.getFamily(), column1.getQualifier())
                    .add(column2.getFamily(), column2.getQualifier()))
            .build();

        final Iterable<? extends Entry<Long, ?>> column1Entries =
            Iterables.limit(ROW_DATA.get(column1).entrySet(), 1);
        final Iterable<? extends Entry<Long, ?>> column2Entries =
            Iterables.limit(ROW_DATA.get(column2).entrySet(), 1);

        testViewGet(request, Iterables.concat(column1Entries, column2Entries));
      }

      { // Single version | timerange
        final KijiDataRequest request = KijiDataRequest
            .builder()
            .addColumns(
                ColumnsDef.create()
                    .withPageSize(pageSize)
                    .add(column1.getFamily(), column1.getQualifier())
                    .add(column2.getFamily(), column2.getQualifier()))
            .withTimeRange(4, 6)
            .build();

        final Iterable<? extends Entry<Long, ?>> column1Entries =
            Iterables.limit(ROW_DATA.get(column1).subMap(6L, false, 4L, true).entrySet(), 1);
        final Iterable<? extends Entry<Long, ?>> column2Entries =
            Iterables.limit(ROW_DATA.get(column2).subMap(6L, false, 4L, true).entrySet(), 1);

        testViewGet(request, Iterables.concat(column1Entries, column2Entries));
      }

      { // Multiple versions | no timerange
        final KijiDataRequest request = KijiDataRequest
            .builder()
            .addColumns(
                ColumnsDef.create()
                    .withPageSize(pageSize)
                    .withMaxVersions(100)
                    .add(column1.getFamily(), column1.getQualifier())
                    .add(column2.getFamily(), column2.getQualifier()))
            .build();

        final Iterable<? extends Entry<Long, ?>> column1Entries = ROW_DATA.get(column1).entrySet();
        final Iterable<? extends Entry<Long, ?>> column2Entries = ROW_DATA.get(column2).entrySet();

        testViewGet(request, Iterables.concat(column1Entries, column2Entries));
      }

      { // Multiple versions | timerange
        final KijiDataRequest request = KijiDataRequest
            .builder()
            .addColumns(
                ColumnsDef.create()
                    .withPageSize(pageSize)
                    .withMaxVersions(100)
                    .add(column1.getFamily(), column1.getQualifier())
                    .add(column2.getFamily(), column2.getQualifier()))
            .withTimeRange(4, 6)
            .build();

        final Iterable<? extends Entry<Long, ?>> column1Entries =
            ROW_DATA.get(column1).subMap(6L, false, 4L, true).entrySet();
        final Iterable<? extends Entry<Long, ?>> column2Entries =
            ROW_DATA.get(column2).subMap(6L, false, 4L, true).entrySet();

        testViewGet(request, Iterables.concat(column1Entries, column2Entries));
      }

      { // Mixed versions | timerange
        final KijiDataRequest request = KijiDataRequest
            .builder()
            .addColumns(
                ColumnsDef.create()
                    .withPageSize(pageSize)
                    .withMaxVersions(100)
                    .add(column1.getFamily(), column1.getQualifier()))
            .addColumns(
                ColumnsDef.create()
                    .withPageSize(pageSize)
                    .withMaxVersions(1)
                    .add(column2.getFamily(), column2.getQualifier()))
            .withTimeRange(4, 6)
            .build();

        final Iterable<? extends Entry<Long, ?>> column1Entries =
            ROW_DATA.get(column1).subMap(6L, false, 4L, true).entrySet();
        final Iterable<? extends Entry<Long, ?>> column2Entries =
            Iterables.limit(ROW_DATA.get(column2).subMap(6L, false, 4L, true).entrySet(), 1);

        testViewGet(request, Iterables.concat(column1Entries, column2Entries));
      }

      { // Mixed versions | no timerange
        final KijiDataRequest request = KijiDataRequest
            .builder()
            .addColumns(
                ColumnsDef.create()
                    .withPageSize(pageSize)
                    .withMaxVersions(1)
                    .add(column1.getFamily(), column1.getQualifier()))
            .addColumns(
                ColumnsDef.create()
                    .withPageSize(pageSize)
                    .withMaxVersions(100)
                    .add(column2.getFamily(), column2.getQualifier()))
            .build();

        final Iterable<? extends Entry<Long, ?>> column1Entries =
            Iterables.limit(ROW_DATA.get(column1).entrySet(), 1);
        final Iterable<? extends Entry<Long, ?>> column2Entries =
            ROW_DATA.get(column2).entrySet();

        testViewGet(request, Iterables.concat(column1Entries, column2Entries));
      }
    }
  }

  @Test
  public void testGetFamilyColumn() throws Exception {
    final Map<String, ? extends List<KijiColumnName>> families =
        ImmutableMap.of(
            PRIMITIVE_FAMILY, ImmutableList.of(PRIMITIVE_DOUBLE, PRIMITIVE_STRING),
            STRING_MAP_FAMILY, ImmutableList.of(STRING_MAP_1, STRING_MAP_2));

    for (Entry<String, ? extends List<KijiColumnName>> family : families.entrySet()) {
      for (int pageSize : ImmutableList.of(0, 1, 2, 10)) {

        final KijiColumnName familyColumn = KijiColumnName.create(family.getKey(), null);
        final KijiColumnName column1 = family.getValue().get(0);
        final KijiColumnName column2 = family.getValue().get(1);

        { // Single version | no timerange
          final KijiDataRequest request = KijiDataRequest
              .builder()
              .addColumns(ColumnsDef.create().withPageSize(pageSize).add(familyColumn))
              .build();

          final Iterable<? extends Entry<Long, ?>> column1Entries =
              Iterables.limit(ROW_DATA.get(column1).entrySet(), 1);
          final Iterable<? extends Entry<Long, ?>> column2Entries =
              Iterables.limit(ROW_DATA.get(column2).entrySet(), 1);

          testViewGet(request, Iterables.concat(column1Entries, column2Entries));
        }

        { // Single version | timerange
          final KijiDataRequest request = KijiDataRequest
              .builder()
              .addColumns(ColumnsDef.create().withPageSize(pageSize).add(familyColumn))
              .withTimeRange(4, 6)
              .build();

          final Iterable<? extends Entry<Long, ?>> column1Entries =
              Iterables.limit(ROW_DATA.get(column1).subMap(6L, false, 4L, true).entrySet(), 1);
          final Iterable<? extends Entry<Long, ?>> column2Entries =
              Iterables.limit(ROW_DATA.get(column2).subMap(6L, false, 4L, true).entrySet(), 1);

          testViewGet(request, Iterables.concat(column1Entries, column2Entries));
        }

        { // Multiple versions | no timerange
          final KijiDataRequest request = KijiDataRequest
              .builder()
              .addColumns(
                  ColumnsDef
                      .create()
                      .withPageSize(pageSize)
                      .withMaxVersions(100)
                      .add(familyColumn))
              .build();

          final Iterable<? extends Entry<Long, ?>> column1Entries =
              ROW_DATA.get(column1).entrySet();
          final Iterable<? extends Entry<Long, ?>> column2Entries =
              ROW_DATA.get(column2).entrySet();

          testViewGet(request, Iterables.concat(column1Entries, column2Entries));
        }

        { // Multiple versions | timerange
          final KijiDataRequest request = KijiDataRequest
              .builder()
              .addColumns(
                  ColumnsDef
                      .create()
                      .withPageSize(pageSize)
                      .withMaxVersions(100)
                      .add(familyColumn))
              .withTimeRange(4, 6)
              .build();

          final Iterable<? extends Entry<Long, ?>> column1Entries =
              ROW_DATA.get(column1).subMap(6L, false, 4L, true).entrySet();
          final Iterable<? extends Entry<Long, ?>> column2Entries =
              ROW_DATA.get(column2).subMap(6L, false, 4L, true).entrySet();

          testViewGet(request, Iterables.concat(column1Entries, column2Entries));
        }
      }
    }
  }

  @Test
  public void testGetMultipleFamilyColumns() throws Exception {
    final KijiColumnName familyColumn1 = KijiColumnName.create(PRIMITIVE_FAMILY, null);
    final KijiColumnName familyColumn2 = KijiColumnName.create(STRING_MAP_FAMILY, null);

    final KijiColumnName column1 = PRIMITIVE_DOUBLE;
    final KijiColumnName column2 = PRIMITIVE_STRING;
    final KijiColumnName column3 = STRING_MAP_1;
    final KijiColumnName column4 = STRING_MAP_2;

    for (int pageSize : ImmutableList.of(0, 1, 2, 10)) {

      { // Single version | no timerange
        final KijiDataRequest request = KijiDataRequest
            .builder()
            .addColumns(ColumnsDef.create().add(familyColumn1))
            .addColumns(ColumnsDef.create().add(familyColumn2))
            .build();

        final Iterable<? extends Entry<Long, ?>> column1Entries =
            Iterables.limit(ROW_DATA.get(column1).entrySet(), 1);
        final Iterable<? extends Entry<Long, ?>> column2Entries =
            Iterables.limit(ROW_DATA.get(column2).entrySet(), 1);
        final Iterable<? extends Entry<Long, ?>> column3Entries =
            Iterables.limit(ROW_DATA.get(column3).entrySet(), 1);
        final Iterable<? extends Entry<Long, ?>> column4Entries =
            Iterables.limit(ROW_DATA.get(column4).entrySet(), 1);

        testViewGet(
            request,
            Iterables.concat(column1Entries, column2Entries, column3Entries, column4Entries));
      }

      { // Single version | timerange
        final KijiDataRequest request = KijiDataRequest
            .builder()
            .addColumns(ColumnsDef.create().withPageSize(pageSize).add(familyColumn1))
            .addColumns(ColumnsDef.create().withPageSize(pageSize).add(familyColumn2))
            .withTimeRange(4, 6)
            .build();

        final Iterable<? extends Entry<Long, ?>> column1Entries =
            Iterables.limit(ROW_DATA.get(column1).subMap(6L, false, 4L, true).entrySet(), 1);
        final Iterable<? extends Entry<Long, ?>> column2Entries =
            Iterables.limit(ROW_DATA.get(column2).subMap(6L, false, 4L, true).entrySet(), 1);
        final Iterable<? extends Entry<Long, ?>> column3Entries =
            Iterables.limit(ROW_DATA.get(column3).subMap(6L, false, 4L, true).entrySet(), 1);
        final Iterable<? extends Entry<Long, ?>> column4Entries =
            Iterables.limit(ROW_DATA.get(column4).subMap(6L, false, 4L, true).entrySet(), 1);

        testViewGet(
            request,
            Iterables.concat(column1Entries, column2Entries, column3Entries, column4Entries));
      }

      { // Multiple versions | no timerange
        final KijiDataRequest request = KijiDataRequest
            .builder()
            .addColumns(
                ColumnsDef.create().withPageSize(pageSize).withMaxVersions(100).add(familyColumn1))
            .addColumns(
                ColumnsDef.create().withPageSize(pageSize).withMaxVersions(100).add(familyColumn2))
            .build();

        final Iterable<? extends Entry<Long, ?>> column1Entries = ROW_DATA.get(column1).entrySet();
        final Iterable<? extends Entry<Long, ?>> column2Entries = ROW_DATA.get(column2).entrySet();
        final Iterable<? extends Entry<Long, ?>> column3Entries = ROW_DATA.get(column3).entrySet();
        final Iterable<? extends Entry<Long, ?>> column4Entries = ROW_DATA.get(column4).entrySet();

        testViewGet(
            request,
            Iterables.concat(column1Entries, column2Entries, column3Entries, column4Entries));
      }

      { // Multiple versions | timerange
        final KijiDataRequest request = KijiDataRequest
            .builder()
            .addColumns(
                ColumnsDef.create().withPageSize(pageSize).withMaxVersions(100).add(familyColumn1))
            .addColumns(
                ColumnsDef.create().withPageSize(pageSize).withMaxVersions(100).add(familyColumn2))
            .withTimeRange(4, 6)
            .build();

        final Iterable<? extends Entry<Long, ?>> column1Entries =
            ROW_DATA.get(column1).subMap(6L, false, 4L, true).entrySet();
        final Iterable<? extends Entry<Long, ?>> column2Entries =
            ROW_DATA.get(column2).subMap(6L, false, 4L, true).entrySet();
        final Iterable<? extends Entry<Long, ?>> column3Entries =
            ROW_DATA.get(column3).subMap(6L, false, 4L, true).entrySet();
        final Iterable<? extends Entry<Long, ?>> column4Entries =
            ROW_DATA.get(column4).subMap(6L, false, 4L, true).entrySet();

        testViewGet(
            request,
            Iterables.concat(column1Entries, column2Entries, column3Entries, column4Entries));
      }

      { // Mixed versions | no timerange
        final KijiDataRequest request = KijiDataRequest
            .builder()
            .addColumns(
                ColumnsDef.create().withPageSize(pageSize).withMaxVersions(2).add(familyColumn1))
            .addColumns(
                ColumnsDef.create().withPageSize(pageSize).withMaxVersions(100).add(familyColumn2))
            .build();

        final Iterable<? extends Entry<Long, ?>> column1Entries =
            Iterables.limit(ROW_DATA.get(column1).entrySet(), 2);
        final Iterable<? extends Entry<Long, ?>> column2Entries =
            Iterables.limit(ROW_DATA.get(column2).entrySet(), 2);
        final Iterable<? extends Entry<Long, ?>> column3Entries = ROW_DATA.get(column3).entrySet();
        final Iterable<? extends Entry<Long, ?>> column4Entries = ROW_DATA.get(column4).entrySet();

        testViewGet(
            request,
            Iterables.concat(column1Entries, column2Entries, column3Entries, column4Entries));
      }

      { // Multiple versions | timerange
        final KijiDataRequest request = KijiDataRequest
            .builder()
            .addColumns(
                ColumnsDef.create().withPageSize(pageSize).withMaxVersions(100).add(familyColumn1))
            .addColumns(
                ColumnsDef.create().withPageSize(pageSize).withMaxVersions(1).add(familyColumn2))
            .withTimeRange(4, 6)
            .build();

        final Iterable<? extends Entry<Long, ?>> column1Entries =
            ROW_DATA.get(column1).subMap(6L, false, 4L, true).entrySet();
        final Iterable<? extends Entry<Long, ?>> column2Entries =
            ROW_DATA.get(column2).subMap(6L, false, 4L, true).entrySet();
        final Iterable<? extends Entry<Long, ?>> column3Entries =
            Iterables.limit(ROW_DATA.get(column3).subMap(6L, false, 4L, true).entrySet(), 1);
        final Iterable<? extends Entry<Long, ?>> column4Entries =
            Iterables.limit(ROW_DATA.get(column4).subMap(6L, false, 4L, true).entrySet(), 1);

        testViewGet(
            request,
            Iterables.concat(column1Entries, column2Entries, column3Entries, column4Entries));
      }
    }
  }

  @Test
  public void testNarrowView() throws Exception {
    final KijiColumnName familyColumn1 = KijiColumnName.create(PRIMITIVE_FAMILY, null);
    final KijiColumnName familyColumn2 = KijiColumnName.create(STRING_MAP_FAMILY, null);

    final KijiColumnName column1 = PRIMITIVE_DOUBLE;
    final KijiColumnName column2 = PRIMITIVE_STRING;
    final KijiColumnName column3 = STRING_MAP_1;
    final KijiColumnName column4 = STRING_MAP_2;

    for (int pageSize : ImmutableList.of(0)) {

      final KijiDataRequest request = KijiDataRequest
          .builder()
          .addColumns(
              ColumnsDef.create().withPageSize(pageSize).withMaxVersions(100).add(familyColumn1))
          .addColumns(
              ColumnsDef.create().withPageSize(pageSize).withMaxVersions(100).add(column3))
          .addColumns(ColumnsDef.create().withPageSize(pageSize).add(column4))
          .withTimeRange(2, 10)
          .build();

      final KijiResult<Object> view = mReader.getResult(mTable.getEntityId(ROW), request);
      try {
        testViewGet(view.narrowView(PRIMITIVE_LONG), ImmutableList.<Entry<Long, ?>>of());

        final Iterable<? extends Entry<Long, ?>> column1Entries =
            ROW_DATA.get(column1).subMap(10L, false, 2L, true).entrySet();
        testViewGet(view.narrowView(column1), column1Entries);

        final Iterable<? extends Entry<Long, ?>> column2Entries =
            ROW_DATA.get(column2).subMap(10L, false, 2L, true).entrySet();
        testViewGet(view.narrowView(column2), column2Entries);

        testViewGet(view.narrowView(familyColumn1),
            Iterables.concat(column1Entries, column2Entries));

        final Iterable<? extends Entry<Long, ?>> column3Entries =
            ROW_DATA.get(column3).subMap(10L, false, 2L, true).entrySet();
        testViewGet(view.narrowView(column3), column3Entries);

        final Iterable<? extends Entry<Long, ?>> column4Entries =
            Iterables.limit(ROW_DATA.get(column4).subMap(10L, false, 2L, true).entrySet(), 1);
        testViewGet(view.narrowView(column4), column4Entries);

        testViewGet(view.narrowView(familyColumn2),
            Iterables.concat(column3Entries, column4Entries));
      } finally {
        view.close();
      }
    }
  }

  @Test(expected = UnsupportedOperationException.class)
  public void testGetWithFilters() throws Exception {
    final KijiColumnName column2 = STRING_MAP_1;

    final KijiDataRequest request = KijiDataRequest
        .builder()
        .addColumns(
            ColumnsDef.create()
                .withFilter(
                    new KijiColumnRangeFilter(
                        STRING_MAP_1.getQualifier(), true,
                        STRING_MAP_2.getQualifier(), false))
                .withMaxVersions(10)
                .add(column2.getFamily(), null))
        .build();

    final Iterable<? extends Entry<Long, ?>> column1Entries = ROW_DATA.get(column2).entrySet();

    testViewGet(request, column1Entries);
  }

  @Test
  public void testGetMatContents() throws Exception {
    KijiDataRequestBuilder builder = KijiDataRequest.builder().addColumns(ColumnsDef.create()
            .withMaxVersions(10)
            .add(PRIMITIVE_STRING, null)
            .add(STRING_MAP_1, null));
    KijiDataRequest request = builder.build();
    final EntityId eid = mTable.getEntityId(ROW);
    KijiResult<Object> view = mReader.getResult(eid, request);
    SortedMap<KijiColumnName, List<KijiCell<Object>>> map =
        KijiResult.Helpers.getMaterializedContents(view);
    for (KijiColumnName col: map.keySet()) {
      KijiResult<Object> newResult = view.narrowView(col);
      Iterator<KijiCell<Object>> it = newResult.iterator();
      for (KijiCell<Object> cell: map.get(col)) {
        assertEquals(cell, it.next());
      }
      assertTrue(!it.hasNext());
    }
  }
}
TOP

Related Classes of org.kiji.schema.impl.cassandra.TestCassandraKijiResult

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.