All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.lens.cube.metadata.timeline.PartitionTimeline Maven / Gradle / Ivy

The newest version!
/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.lens.cube.metadata.timeline;


import java.util.*;

import org.apache.lens.cube.metadata.MetastoreUtil;
import org.apache.lens.cube.metadata.TimePartition;
import org.apache.lens.cube.metadata.TimePartitionRange;
import org.apache.lens.cube.metadata.UpdatePeriod;
import org.apache.lens.server.api.error.LensException;

import org.apache.hadoop.hive.ql.metadata.Table;

import com.google.common.collect.Maps;
import com.google.common.collect.Sets;

import lombok.Data;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;

/**
 * Represents the in-memory data structure that represents timeline of all existing partitions for a given storage
 * table, update period, partition column. Is an Abstract class. Can be implemented in multiple ways.
 *
 * @see org.apache.lens.cube.metadata.timeline.EndsAndHolesPartitionTimeline
 * @see org.apache.lens.cube.metadata.timeline.StoreAllPartitionTimeline
 */
@Data
@Slf4j
public abstract class PartitionTimeline implements Iterable {
  private final String storageTableName;
  private final UpdatePeriod updatePeriod;
  private final String partCol;
  private TreeSet all;

  /** wrapper on latest data */
  public Date getLatestDate() {
    return latest() == null ? null : latest().getDate();
  }

  /**
   * Sets PartitionTimeline implementation class's name and specific params in table param.
   *
   * @param table
   * @see #init(org.apache.hadoop.hive.ql.metadata.Table)
   */
  public void updateTableParams(Table table) {
    String prefix = MetastoreUtil.getPartitionInfoKeyPrefix(getUpdatePeriod(), getPartCol());
    String storageClass = MetastoreUtil.getPartitionTimelineStorageClassKey(getUpdatePeriod(), getPartCol());
    table.getParameters().put(storageClass, this.getClass().getCanonicalName());
    for (Map.Entry entry : toProperties().entrySet()) {
      table.getParameters().put(prefix + entry
        .getKey(), entry.getValue());
    }
  }

  /**
   * Extracts timeline implementation class from table params and instantiates it with other arguments, also in table
   * params.
   *
   * @param table
   * @throws LensException
   * @see #updateTableParams(org.apache.hadoop.hive.ql.metadata.Table)
   */
  public void init(Table table) throws LensException {
    HashMap props = Maps.newHashMap();
    String prefix = MetastoreUtil.getPartitionInfoKeyPrefix(getUpdatePeriod(), getPartCol());
    for (Map.Entry entry : table.getParameters().entrySet()) {
      if (entry.getKey().startsWith(prefix)) {
        props.put(entry.getKey().substring(prefix.length()), entry.getValue());
      }
    }
    log.info("initializing timeline from table properties: {},{},{}",
      getStorageTableName(), getUpdatePeriod(), getPartCol());
    initFromProperties(props);
    log.info("initialized to: {}", this);
  }

  /**
   * Add partition to local memory to be sent for batch addition.
   *
   * @see #commitBatchAdditions()
   */
  public void addForBatchAddition(TimePartition partition) {
    if (all == null) {
      all = Sets.newTreeSet();
    }
    all.add(partition);
  }

  /**
   * Commit all partitions that were added to batch addition queue. //TODO: improve batch addition implementation.
   *
   * @return true if all the partitions were added successfully, or no partitions needed to be added
   * @throws LensException
   */
  public boolean commitBatchAdditions() throws LensException {
    if (getAll() == null) {
      return true;
    }
    log.info("initializing timeline from batch addition: {},{},{}",
      getStorageTableName(), getUpdatePeriod(), getPartCol());
    boolean result = add(getAll());
    all = null;
    log.info("initialized to: {}", this);
    return result;
  }


  /**
   * Add partition to timeline
   *
   * @param partition
   * @return whether add was successful
   * @throws LensException
   */
  public abstract boolean add(@NonNull TimePartition partition) throws LensException;

  /**
   * Add multiple partitions to timeline
   *
   * @param partitions
   * @return whether add was successful
   * @throws LensException
   */
  public boolean add(@NonNull Collection partitions) throws LensException {
    boolean result = true;
    for (TimePartition partition : partitions) {
      result &= add(partition);
    }
    // Can also return the failed to add items.
    return result;
  }

  /**
   * Add partition range to the timeline. Default implementation is to iterate over the range and add
   * each time partition belonging to the given range. Implementing classes can override.
   *
   * @param partitionRange
   * @return whether add was successful
   * @throws LensException
   */
  boolean add(TimePartitionRange partitionRange) throws LensException {
    boolean ret = true;
    for (TimePartition part : partitionRange) {
      ret &= add(part);
    }
    return ret;
  }

  /**
   * drop partition.
   *
   * @param toDrop
   * @return whether drop was successful
   * @throws LensException
   */
  public abstract boolean drop(@NonNull TimePartition toDrop) throws LensException;

  /**
   * latest partition. will be null if no partitions exist.
   *
   * @return
   */
  public abstract TimePartition latest();

  /**
   * serialize member objects as map
   *
   * @return
   */
  public abstract Map toProperties();

  /**
   * deserialize member variables from given map
   *
   * @param properties
   * @return true if after deserializing, the timeline is in consistent state
   * @throws LensException
   * @see #isConsistent()
   */
  public abstract boolean initFromProperties(Map properties) throws LensException;

  /**
   * Whether No partitions have been registered
   *
   * @return
   */
  public abstract boolean isEmpty();

  /**
   * whether timeline is in consistent state
   *
   * @return
   */
  public abstract boolean isConsistent();

  /**
   * Checks partition existance
   *
   * @param partition
   * @return
   */
  public abstract boolean exists(TimePartition partition);
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy