// Path: src/main/java/org/calrissian/flowmix/core/model/event/AggregatedEvent.java
// public class AggregatedEvent {
// 
//   private Event event;
//   private String previousStream;
// 
//   public AggregatedEvent(Event event, String previousStream) {
//     this.event = event;
//     this.previousStream = previousStream;
//   }
// 
//   public AggregatedEvent(Event event) {
//     this.event = event;
//   }
// 
//   public Event getEvent() {
//     return event;
//   }
// 
//   public String getPreviousStream() {
//     return previousStream;
//   }
// 
//   @Override
//   public boolean equals(Object o) {
//     if (this == o) return true;
//     if (o == null || getClass() != o.getClass()) return false;
// 
//     AggregatedEvent that = (AggregatedEvent) o;
// 
//     if (event != null ? !event.equals(that.event) : that.event != null) return false;
//     if (previousStream != null ? !previousStream.equals(that.previousStream) : that.previousStream != null)
//       return false;
// 
//     return true;
//   }
// 
//   @Override
//   public int hashCode() {
//     int result = event != null ? event.hashCode() : 0;
//     result = 31 * result + (previousStream != null ? previousStream.hashCode() : 0);
//     return result;
//   }
// 
//   @Override
//   public String toString() {
//     return "AggregatedEvent{" +
//             "event=" + event +
//             ", previousStream='" + previousStream + '\'' +
//             '}';
//   }
// }
// 
// Path: src/main/java/org/calrissian/flowmix/core/support/window/WindowItem.java
// public class WindowItem {
//     Event event;
//     long timestamp;
//     String previousStream;
// 
//     public WindowItem(Event event, long timestamp, String previousStream) {
//         this.event = event;
//         this.timestamp = timestamp;
//         this.previousStream = previousStream;
//     }
// 
//     public Event getEvent() {
//         return event;
//     }
// 
//     public long getTimestamp() {
//         return timestamp;
//     }
// 
//     public String getPreviousStream() {
//       return previousStream;
//     }
// 
//     @Override
//     public String toString() {
//         return "WindowItem{" +
//                 "event=" + event +
//                 ", timestamp=" + timestamp +
//                 '}';
//     }
// }
// 
// Path: src/main/java/org/calrissian/flowmix/exceptions/FlowmixException.java
// public class FlowmixException extends RuntimeException {
// 
//     public FlowmixException(String msg, Throwable t) {
//         super(msg, t);
//     }
// 
// }


import java.io.Serializable;
import java.util.List;
import java.util.Map;
import org.calrissian.flowmix.core.model.event.AggregatedEvent;
import org.calrissian.flowmix.core.support.window.WindowItem;
import org.calrissian.flowmix.exceptions.FlowmixException;
/*
 * Copyright (C) 2014 The Calrissian Authors
 *
 * 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.calrissian.flowmix.api;



/**
 * An aggregator over a progressive/tumbling window allows aggregate values like
 * sums and averages to be maintained for some window at some point in time
 * without the whole window being available at any point in time.
 *
 * This is very useful for associative algorithms that can be implemented
 * without the entire dataset being available. Often this is good for reduce
 * functions that can summarize a dataset without the need to see each
 * individual point.
 *
 * Multiple events can be returned as the aggregate if necessary, this means
 * multiple aggregates could be maintained inside and emitted separately (i.e.
 * sum and count and sumsqaure, and average).
 */
public interface Aggregator extends Serializable {

    public static final String GROUP_BY = "groupBy";
    public static final String GROUP_BY_DELIM = "\u0000";

    void configure(Map<String, String> configuration);

// Path: src/main/java/org/calrissian/flowmix/core/model/event/AggregatedEvent.java
// public class AggregatedEvent {
// 
//   private Event event;
//   private String previousStream;
// 
//   public AggregatedEvent(Event event, String previousStream) {
//     this.event = event;
//     this.previousStream = previousStream;
//   }
// 
//   public AggregatedEvent(Event event) {
//     this.event = event;
//   }
// 
//   public Event getEvent() {
//     return event;
//   }
// 
//   public String getPreviousStream() {
//     return previousStream;
//   }
// 
//   @Override
//   public boolean equals(Object o) {
//     if (this == o) return true;
//     if (o == null || getClass() != o.getClass()) return false;
// 
//     AggregatedEvent that = (AggregatedEvent) o;
// 
//     if (event != null ? !event.equals(that.event) : that.event != null) return false;
//     if (previousStream != null ? !previousStream.equals(that.previousStream) : that.previousStream != null)
//       return false;
// 
//     return true;
//   }
// 
//   @Override
//   public int hashCode() {
//     int result = event != null ? event.hashCode() : 0;
//     result = 31 * result + (previousStream != null ? previousStream.hashCode() : 0);
//     return result;
//   }
// 
//   @Override
//   public String toString() {
//     return "AggregatedEvent{" +
//             "event=" + event +
//             ", previousStream='" + previousStream + '\'' +
//             '}';
//   }
// }
// 
// Path: src/main/java/org/calrissian/flowmix/core/support/window/WindowItem.java
// public class WindowItem {
//     Event event;
//     long timestamp;
//     String previousStream;
// 
//     public WindowItem(Event event, long timestamp, String previousStream) {
//         this.event = event;
//         this.timestamp = timestamp;
//         this.previousStream = previousStream;
//     }
// 
//     public Event getEvent() {
//         return event;
//     }
// 
//     public long getTimestamp() {
//         return timestamp;
//     }
// 
//     public String getPreviousStream() {
//       return previousStream;
//     }
// 
//     @Override
//     public String toString() {
//         return "WindowItem{" +
//                 "event=" + event +
//                 ", timestamp=" + timestamp +
//                 '}';
//     }
// }
// 
// Path: src/main/java/org/calrissian/flowmix/exceptions/FlowmixException.java
// public class FlowmixException extends RuntimeException {
// 
//     public FlowmixException(String msg, Throwable t) {
//         super(msg, t);
//     }
// 
// }


// Path: src/main/java/org/calrissian/flowmix/api/Aggregator.java
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import org.calrissian.flowmix.core.model.event.AggregatedEvent;
import org.calrissian.flowmix.core.support.window.WindowItem;
import org.calrissian.flowmix.exceptions.FlowmixException;

/*
 * Copyright (C) 2014 The Calrissian Authors
 *
 * 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.calrissian.flowmix.api;



/**
 * An aggregator over a progressive/tumbling window allows aggregate values like
 * sums and averages to be maintained for some window at some point in time
 * without the whole window being available at any point in time.
 *
 * This is very useful for associative algorithms that can be implemented
 * without the entire dataset being available. Often this is good for reduce
 * functions that can summarize a dataset without the need to see each
 * individual point.
 *
 * Multiple events can be returned as the aggregate if necessary, this means
 * multiple aggregates could be maintained inside and emitted separately (i.e.
 * sum and count and sumsqaure, and average).
 */
public interface Aggregator extends Serializable {

    public static final String GROUP_BY = "groupBy";
    public static final String GROUP_BY_DELIM = "\u0000";

    void configure(Map<String, String> configuration);

    void added(WindowItem item);