/* * Copyright (c) 2008-2017, Hazelcast, Inc. All Rights Reserved. * * 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 com.hazelcast.aggregation.impl; import com.hazelcast.aggregation.Aggregator; import com.hazelcast.nio.ObjectDataInput; import com.hazelcast.nio.ObjectDataOutput; import com.hazelcast.nio.serialization.IdentifiedDataSerializable; import java.io.IOException; import java.util.HashSet; import java.util.Set; public final class DistinctValuesAggregator<I, R> extends AbstractAggregator<I, R, Set<R>> implements IdentifiedDataSerializable { Set<R> values = new HashSet<R>(); public DistinctValuesAggregator() { super(); } public DistinctValuesAggregator(String attributePath) { super(attributePath); } @Override public void accumulateExtracted(R value) { values.add(value); } @Override public void combine(Aggregator aggregator) { DistinctValuesAggregator distinctValuesAggregator = (DistinctValuesAggregator) aggregator; this.values.addAll(distinctValuesAggregator.values); } @Override public Set<R> aggregate() { return values; } @Override public int getFactoryId() { return AggregatorDataSerializerHook.F_ID; } @Override public int getId() { return AggregatorDataSerializerHook.DISTINCT_VALUES; } @Override public void writeData(ObjectDataOutput out) throws IOException { out.writeUTF(attributePath); out.writeInt(values.size()); for (Object value : values) { out.writeObject(value); } } @Override public void readData(ObjectDataInput in) throws IOException { this.attributePath = in.readUTF(); int count = in.readInt(); this.values = new HashSet<R>(count); for (int i = 0; i < count; i++) { values.add((R) in.readObject()); } } }