/*
 * Copyright © 2014 - 2021 Leipzig University (Database Research Group)
 *
 * 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.gradoop.flink.representation.transactional;

import org.apache.flink.api.java.tuple.Tuple5;
import org.gradoop.common.model.impl.pojo.EPGMGraphHead;
import org.gradoop.common.model.impl.properties.Properties;
import org.gradoop.flink.representation.common.adjacencylist.AdjacencyListRow;

import java.util.Map;

/**
 * Traversal optimized representation of a graph transaction.
 * <ul>
 *   <li>{@code f0: graph head}</li>
 *   <li>{@code f1: vertex/edge id -> label}</li>
 *   <li>{@code f2: vertex/edge id -> properties}</li>
 *   <li>{@code f3: vertex id -> outgoing adjacency rows}</li>
 *   <li>{@code f4: vertex id -> incoming adjacency rows}</li>
 * </ul>
 *
 * @param <ID> ID type
 * @param <L> label type
 * @param <ED> edge data type
 * @param <VD> vertex data type
 */
public class AdjacencyList<ID extends Comparable<ID>, L extends Comparable<L>, ED, VD>
  extends Tuple5<
    EPGMGraphHead,
    Map<ID, L>,
    Map<ID, Properties>,
    Map<ID, AdjacencyListRow<ED, VD>>,
    Map<ID, AdjacencyListRow<ED, VD>>> {

  /**
   * Default constructor.
   */
  public AdjacencyList() {
  }

  /**
   * Constructor.
   *
   * @param graphHead graph id
   * @param labels graph, vertex and edge labels
   * @param properties graph, vertex and edge properties
   * @param outgoingRows outgoing adjacency list rows
   * @param incomingRows incoming adjacency list rows
   */
  public AdjacencyList(
    EPGMGraphHead graphHead,
    Map<ID, L> labels,
    Map<ID, Properties> properties,
    Map<ID, AdjacencyListRow<ED, VD>> outgoingRows,
    Map<ID, AdjacencyListRow<ED, VD>> incomingRows) {
    super(graphHead, labels, properties, outgoingRows, incomingRows);
  }

  /**
   * Label accessor.
   *
   * @param elementId graph / vertex / edge id
   * @return label
   */
  public L getLabel(ID elementId) {
    return f1.get(elementId);
  }

  /**
   * Property accessor.
   *
   * @param elementId graph / vertex / edge id
   * @return property list
   */
  public Properties getProperties(ID elementId) {
    return f2.get(elementId);
  }

  public EPGMGraphHead getGraphHead() {
    return f0;
  }

  public void setGraphHead(EPGMGraphHead graphId) {
    this.f0 = graphId;
  }

  public Map<ID, AdjacencyListRow<ED, VD>> getOutgoingRows() {
    return f3;
  }

  public Map<ID, AdjacencyListRow<ED, VD>> getIncomingRows() {
    return f4;
  }
}
