/*
 * 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.beam.sdk.values;

import java.io.Serializable;
import javax.annotation.Nullable;
import org.apache.beam.sdk.PipelineRunner;
import org.apache.beam.sdk.annotations.Experimental;
import org.apache.beam.sdk.annotations.Experimental.Kind;
import org.apache.beam.sdk.annotations.Internal;
import org.apache.beam.sdk.coders.Coder;
import org.apache.beam.sdk.transforms.ParDo;
import org.apache.beam.sdk.transforms.View;
import org.apache.beam.sdk.transforms.ViewFn;
import org.apache.beam.sdk.transforms.windowing.WindowMappingFn;

/**
 * A {@link PCollectionView PCollectionView&lt;T&gt;} is an immutable view of a {@link PCollection}
 * as a value of type {@code T} that can be accessed as a side input to a {@link ParDo} transform.
 *
 * <p>A {@link PCollectionView} should always be the output of a {@link
 * org.apache.beam.sdk.transforms.PTransform}. It is the joint responsibility of this transform and
 * each {@link PipelineRunner} to implement the view in a runner-specific manner.
 *
 * <p>The most common case is using the {@link View} transforms to prepare a {@link PCollection} for
 * use as a side input to {@link ParDo}. See {@link View#asSingleton()}, {@link View#asIterable()},
 * and {@link View#asMap()} for more detail on specific views available in the SDK.
 *
 * <p>NOTE: View methods should not be considered to be user-accessible. They are implementation
 * details of how a Runner obtains information required to construct a view, and are subject to
 * change at any time.
 *
 * @param <T> the type of the value(s) accessible via this {@link PCollectionView}
 */
public interface PCollectionView<T> extends PValue, Serializable {
  /**
   * <b>For internal use only.</b>
   *
   * <p>Gets the {@link PCollection} this {@link PCollectionView} was created from.
   *
   * <p>The {@link PCollection} may not be available in all contexts.
   */
  @Nullable
  @Internal
  PCollection<?> getPCollection();

  /**
   * <b>For internal use only.</b>
   *
   * @deprecated this method will be removed entirely. The {@link PCollection} underlying a side
   *     input, is part of the side input's specification with a {@link ParDo} transform, which will
   *     obtain that information via a package-private channel.
   */
  @Deprecated
  @Internal
  TupleTag<?> getTagInternal();

  /**
   * <b>For internal use only.</b>
   *
   * @deprecated this method will be removed entirely. The {@link ViewFn} for a side input is an
   *     attribute of the side input's specification with a {@link ParDo} transform, which will
   *     obtain this specification via a package-private channel.
   */
  @Deprecated
  @Internal
  ViewFn<?, T> getViewFn();

  /**
   * <b>For internal use only.</b>
   *
   * <p>Returns the {@link WindowMappingFn} used to map windows from a main input to the side input
   * of this {@link PCollectionView}.
   */
  @Experimental(Kind.CORE_RUNNERS_ONLY)
  @Internal
  WindowMappingFn<?> getWindowMappingFn();

  /**
   * <b>For internal use only.</b>
   *
   * @deprecated this method will be removed entirely. The {@link PCollection} underlying a side
   *     input, including its {@link WindowingStrategy}, is part of the side input's specification
   *     with a {@link ParDo} transform, which will obtain that information via a package-private
   *     channel.
   */
  @Deprecated
  @Internal
  WindowingStrategy<?, ?> getWindowingStrategyInternal();

  /**
   * <b>For internal use only.</b>
   *
   * @deprecated this method will be removed entirely. The {@link PCollection} underlying a side
   *     input, including its {@link Coder}, is part of the side input's specification with a {@link
   *     ParDo} transform, which will obtain that information via a package-private channel.
   */
  @Deprecated
  @Internal
  Coder<?> getCoderInternal();
}
