package com.yahoo.labs.samoa.learners.classifiers.trees;

/*
 * #%L
 * SAMOA
 * %%
 * Copyright (C) 2014 - 2015 Apache Software Foundation
 * %%
 * 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.
 * #L%
 */

import com.yahoo.labs.samoa.moa.classifiers.core.AttributeSplitSuggestion;
import com.yahoo.labs.samoa.core.ContentEvent;

/**
 * Local Result Content Event is the content event that represents local calculation of statistic in Local Statistic
 * Processor.
 * 
 * @author Arinto Murdopo
 * 
 */
final class LocalResultContentEvent implements ContentEvent {

  private static final long serialVersionUID = -4206620993777418571L;

  private final AttributeSplitSuggestion bestSuggestion;
  private final AttributeSplitSuggestion secondBestSuggestion;
  private final long splitId;

  public LocalResultContentEvent() {
    bestSuggestion = null;
    secondBestSuggestion = null;
    splitId = -1;
  }

  LocalResultContentEvent(long splitId, AttributeSplitSuggestion best, AttributeSplitSuggestion secondBest) {
    this.splitId = splitId;
    this.bestSuggestion = best;
    this.secondBestSuggestion = secondBest;
  }

  @Override
  public String getKey() {
    return null;
  }

  /**
   * Method to return the best attribute split suggestion from this local statistic calculation.
   * 
   * @return The best attribute split suggestion.
   */
  AttributeSplitSuggestion getBestSuggestion() {
    return this.bestSuggestion;
  }

  /**
   * Method to return the second best attribute split suggestion from this local statistic calculation.
   * 
   * @return The second best attribute split suggestion.
   */
  AttributeSplitSuggestion getSecondBestSuggestion() {
    return this.secondBestSuggestion;
  }

  /**
   * Method to get the split ID of this local statistic calculation result
   * 
   * @return The split id of this local calculation result
   */
  long getSplitId() {
    return this.splitId;
  }

  @Override
  public void setKey(String str) {
    // do nothing

  }

  @Override
  public boolean isLastEvent() {
    return false;
  }
}
