Package org.kiji.schema.layout.impl.cassandra

Source Code of org.kiji.schema.layout.impl.cassandra.ShortColumnNameTranslator

/**
* (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.layout.impl.cassandra;

import org.apache.hadoop.hbase.util.Bytes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.kiji.annotations.ApiAudience;
import org.kiji.schema.KijiColumnName;
import org.kiji.schema.NoSuchColumnException;
import org.kiji.schema.cassandra.CassandraColumnName;
import org.kiji.schema.cassandra.CassandraTableName;
import org.kiji.schema.layout.CassandraColumnNameTranslator;
import org.kiji.schema.layout.KijiTableLayout;
import org.kiji.schema.layout.KijiTableLayout.LocalityGroupLayout;
import org.kiji.schema.layout.KijiTableLayout.LocalityGroupLayout.FamilyLayout;
import org.kiji.schema.layout.KijiTableLayout.LocalityGroupLayout.FamilyLayout.ColumnLayout;
import org.kiji.schema.layout.impl.ColumnId;

/**
* Translates {@link KijiColumnName}s into {@link CassandraColumnName}s.
*/
@ApiAudience.Private
public final class ShortColumnNameTranslator extends CassandraColumnNameTranslator {
  private static final Logger LOG = LoggerFactory.getLogger(ShortColumnNameTranslator.class);

  private final KijiTableLayout mLayout;

  /**
   * Creates a new {@link org.kiji.schema.layout.impl.cassandra.ShortColumnNameTranslator} instance.
   *
   * @param layout of the table to translate column names for.
   */
  public ShortColumnNameTranslator(final KijiTableLayout layout) {
    mLayout = layout;
  }

  /** {@inheritDoc} */
  @Override
  public KijiColumnName toKijiColumnName(
      final CassandraTableName localityGroupTable,
      final CassandraColumnName cassandraColumnName
  ) throws NoSuchColumnException {

    final String localityGroupName =
        mLayout.getLocalityGroupIdNameMap().get(localityGroupTable.getLocalityGroupId());
    final LocalityGroupLayout localityGroup = mLayout.getLocalityGroupMap().get(localityGroupName);
        mLayout.getLocalityGroupIdNameMap().get(localityGroupTable.getLocalityGroupId());
    if (localityGroup == null) {
      throw new NoSuchColumnException(
          String.format("No locality group for Cassandra table %s in Kiji table %s.",
              localityGroupTable, mLayout.getName()));
    }

    final ColumnId familyID = ColumnId.fromByteArray(cassandraColumnName.getFamily());
    final FamilyLayout family =
        localityGroup.getFamilyMap().get(localityGroup.getFamilyIdNameMap().get(familyID));
    if (family == null) {
      throw new NoSuchColumnException(String.format(
          "No family with ID %s in locality group %s of table %s.",
          familyID.getId(), localityGroup.getName(), mLayout.getName()));
    }

    final KijiColumnName kijiColumnName;
    if (family.isGroupType()) {
      // Group type family.
      final ColumnId qualifierID = ColumnId.fromByteArray(cassandraColumnName.getQualifier());
      final ColumnLayout qualifier =
          family.getColumnMap().get(family.getColumnIdNameMap().get(qualifierID));
      if (qualifier == null) {
        throw new NoSuchColumnException(String.format(
            "No column with ID %s in family %s of table %s.",
            qualifierID.getId(), family.getName(), mLayout.getName()));
      }
      kijiColumnName = KijiColumnName.create(family.getName(), qualifier.getName());
    } else {
      // Map type family.
      assert(family.isMapType());
      kijiColumnName =
          KijiColumnName.create(
              family.getName(),
              Bytes.toString(cassandraColumnName.getQualifier()));
    }
    LOG.debug("Translated Kiji column {}.", kijiColumnName);
    return kijiColumnName;
  }

  /** {@inheritDoc} */
  @Override
  public CassandraColumnName toCassandraColumnName(
      final KijiColumnName kijiColumnName
  ) throws NoSuchColumnException {
    final String familyName = kijiColumnName.getFamily();
    final String qualifierName = kijiColumnName.getQualifier();

    final FamilyLayout family = mLayout.getFamilyMap().get(familyName);
    if (family == null) {
      throw new NoSuchColumnException(kijiColumnName.toString());
    }

    final ColumnId familyID = family.getId();

    final byte[] familyBytes = familyID.toByteArray();

    if (qualifierName == null) {
      // Unqualified column
      return new CassandraColumnName(familyBytes, null);
    } else if (family.isGroupType()) {
      // Group type family.
      final ColumnId qualifierID = family.getColumnIdNameMap().inverse().get(qualifierName);
      final byte[] qualifierBytes = qualifierID.toByteArray();
      return new CassandraColumnName(familyBytes, qualifierBytes);
    } else {
      // Map type family.
      assert family.isMapType();
      final byte[] qualifierBytes = Bytes.toBytes(qualifierName);
      return new CassandraColumnName(familyBytes, qualifierBytes);
    }
  }
}
TOP

Related Classes of org.kiji.schema.layout.impl.cassandra.ShortColumnNameTranslator

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.