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

com.tangosol.util.aggregator.ReducerAggregator Maven / Gradle / Ivy

There is a newer version: 24.09
Show newest version
/*
 * Copyright (c) 2000, 2020, Oracle and/or its affiliates.
 *
 * Licensed under the Universal Permissive License v 1.0 as shown at
 * http://oss.oracle.com/licenses/upl.
 */

package com.tangosol.util.aggregator;

import com.tangosol.util.InvocableMap;
import com.tangosol.util.LiteMap;
import com.tangosol.util.NullImplementation;
import com.tangosol.util.ValueExtractor;

import com.tangosol.net.cache.CacheMap;

import java.util.Collection;
import java.util.Map;


/**
* The ReducerAggregator is used to implement functionality similar to
* {@link CacheMap#getAll(Collection)} API.  Instead of returning the complete
* set of values, it will return a portion of value attributes based on the
* provided {@link ValueExtractor}.
* 

* This aggregator could be used in combination with * {@link com.tangosol.util.extractor.MultiExtractor MultiExtractor} allowing one * to collect tuples that are a subset of the attributes of each object stored in * the cache. * * @param the type of the Map entry keys * @param the type of the Map entry values * @param the type of the value to extract from * @param the type of the extracted value * * @author djl 2009.03.02 */ public class ReducerAggregator extends AbstractAggregator> { // ----- constructors --------------------------------------------------- /** * Default constructor (necessary for the ExternalizableLite interface). */ public ReducerAggregator() { super(); } /** * Construct a ReducerAggregator based on the specified method name. * * @param sMethod the name of the method that is used to extract the * portion of the cached value */ public ReducerAggregator(String sMethod) { super(sMethod); } /** * Construct a ReducerAggregator based on the specified extractor. * * @param extractor the extractor that is used to extract the portion * of the cached value */ public ReducerAggregator(ValueExtractor extractor) { super(extractor); } // ----- StreamingAggregator methods ------------------------------------ @Override public InvocableMap.StreamingAggregator> supply() { return new ReducerAggregator<>(getValueExtractor()); } @Override public int characteristics() { return PARALLEL | PRESENT_ONLY; } // ----- AbstractAggregator methods ------------------------------------- /** * {@inheritDoc} */ protected void init(boolean fFinal) { Map map = m_map; if (map != null) { map.clear(); } } /** * {@inheritDoc} */ public void processEntry(InvocableMap.Entry entry) { // collect partial results in a transient map ensureMap().put(entry.getKey(), entry.extract(getValueExtractor())); } /** * {@inheritDoc} */ protected void process(Object o, boolean fFinal) { if (o != null) { if (fFinal) { // aggregate partial results Map map = (Map) o; if (!map.isEmpty()) { ensureMap().putAll(map); } } else { // should not be called with fFinal == false throw new IllegalStateException(); } } } /** * {@inheritDoc} */ protected Map finalizeResult(boolean fFinal) { Map map = m_map; m_map = null; // COH-1487 return map == null ? fFinal ? NullImplementation.getMap() : null : map; } // ----- internal helpers ----------------------------------------------- /** * Return a map that can be used to store reduced values, creating it if * one has not already been created. * * @return a set that can be used to store distinct values */ protected Map ensureMap() { Map map = m_map; if (map == null) { map = m_map = new LiteMap<>(); } return map; } // ----- data members --------------------------------------------------- /** * The resulting map of reduced values. */ protected transient Map m_map; }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy