All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.dm.jrt.operator.GroupByFunctionInvocationFactory Maven / Gradle / Ivy

/*
 * Copyright 2016 Davide Maestroni
 *
 * 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.github.dm.jrt.operator;

import com.github.dm.jrt.core.channel.Channel;
import com.github.dm.jrt.core.invocation.Invocation;
import com.github.dm.jrt.core.invocation.InvocationFactory;
import com.github.dm.jrt.core.invocation.TemplateInvocation;
import com.github.dm.jrt.core.util.ConstantConditions;
import com.github.dm.jrt.function.FunctionDecorator;

import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import static com.github.dm.jrt.core.util.Reflection.asArgs;

/**
 * Factory of grouping by key invocations.
 * 

* Created by davide-maestroni on 08/30/2016. * * @param the data type. */ class GroupByFunctionInvocationFactory extends InvocationFactory> { private final FunctionDecorator mKeyFunction; /** * Constructor. * * @param keyFunction the function returning the group key. */ GroupByFunctionInvocationFactory(@NotNull final FunctionDecorator keyFunction) { super(asArgs(ConstantConditions.notNull("function instance", keyFunction))); mKeyFunction = keyFunction; } @NotNull @Override public Invocation> newInvocation() throws Exception { return new GroupByFunctionInvocation(mKeyFunction); } /** * Routine invocation grouping data into collections based on the same key. * * @param the data type. */ private static class GroupByFunctionInvocation extends TemplateInvocation> { private final FunctionDecorator mKeyFunction; private HashMap> mGroups; /** * Constructor. * * @param keyFunction the function returning the group key. */ private GroupByFunctionInvocation(@NotNull final FunctionDecorator keyFunction) { mKeyFunction = keyFunction; } @Override public void onComplete(@NotNull final Channel, ?> result) { for (final ArrayList inputs : mGroups.values()) { result.pass(inputs); } } @Override public void onInput(final DATA input, @NotNull final Channel, ?> result) throws Exception { final Object key = mKeyFunction.apply(input); final HashMap> groups = mGroups; ArrayList inputs = groups.get(key); if (inputs == null) { inputs = new ArrayList(); groups.put(key, inputs); } inputs.add(input); } @Override public void onRecycle(final boolean isReused) { mGroups = null; } @Override public void onRestart() { mGroups = new HashMap>(); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy