/*
 * 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.cassandra.db.rows;

import org.apache.cassandra.config.ColumnDefinition;
import org.apache.cassandra.db.*;

/**
 * Interface that allows to act on the result of merging multiple rows.
 *
 * More precisely, given N rows and the result of merging them, one can call {@link Rows#diff(RowDiffListener, Row, Row...)}
 * with a {@code RowDiffListener} and that listener will be informed for each input row of the diff between
 * that input and merge row.
 */
public interface RowDiffListener
{
    /**
     * Called for the row primary key liveness info of input {@code i}.
     *
     * @param i the input row from which {@code original} is from.
     * @param clustering the clustering for the row that is merged.
     * @param merged the primary key liveness info of the merged row. Will be {@code null} if input {@code i} had
     * a {@code LivenessInfo}, but the merged result don't (i.e. the original info has been shadowed/deleted).
     * @param original the primary key liveness info of input {@code i}. May be {@code null} if input {@code i}
     * has not primary key liveness info (i.e. it has {@code LivenessInfo.NONE}) but the merged result has.
     */
    public void onPrimaryKeyLivenessInfo(int i, Clustering clustering, LivenessInfo merged, LivenessInfo original);

    /**
     * Called for the row deletion of input {@code i}.
     *
     * @param i the input row from which {@code original} is from.
     * @param clustering the clustering for the row that is merged.
     * @param merged the deletion of the merged row. Will be {@code null} if input {@code i} had deletion
     * but the merged result doesn't (i.e. the deletion has been shadowed).
     * @param original the deletion of input {@code i}. May be {@code null} if input {@code i} had no deletion but the merged row has.
     */
    public void onDeletion(int i, Clustering clustering, Row.Deletion merged, Row.Deletion original);

    /**
     * Called for every (non-live) complex deletion of any complex column present in either the merged row of input {@code i}.
     *
     * @param i the input row from which {@code original} is from.
     * @param clustering the clustering for the row that is merged.
     * @param column the column for which this is a complex deletion of.
     * @param merged the complex deletion of the merged row. Will be {@code null} if input {@code i} had a complex deletion
     * for {@code column} but the merged result doesn't (i.e. the deletion has been shadowed).
     * @param original the complex deletion of input {@code i} for column {@code column}. May be {@code null} if input {@code i}
     * had no complex deletion but the merged row has.
     */
    public void onComplexDeletion(int i, Clustering clustering, ColumnDefinition column, DeletionTime merged, DeletionTime original);

    /**
     * Called for any cell that is either in the merged row or in input {@code i}.
     *
     * @param i the input row from which {@code original} is from.
     * @param clustering the clustering for the row that is merged.
     * @param merged the cell of the merged row. Will be {@code null} if input {@code i} had a cell but that cell is no present
     * in the merged result (it has been deleted/shadowed).
     * @param original the cell of input {@code i}. May be {@code null} if input {@code i} had cell corresponding to {@code merged}.
     */
    public void onCell(int i, Clustering clustering, Cell merged, Cell original);
}
