package de.axone.cache.ng; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; public class AutomaticTwoStepCache<K,I,O> { private final CacheNG.AutomaticClient<K,List<I>> intermediatesForKey; private final CacheNG.AutomaticClient<I,O> valuesForIntermediate; public AutomaticTwoStepCache( CacheNG.AutomaticClient<K,List<I>> intermediatesForKey, CacheNG.AutomaticClient<I,O> valuesForIntermediate ){ this.intermediatesForKey = intermediatesForKey; this.valuesForIntermediate = valuesForIntermediate; } public List<O> fetch( K key, CacheNG.SingleValueAccessor<K,List<I>> intermediateAccessor, CacheNG.MultiValueAccessor<I,O> valueAccessor ){ List<I> intermediates = intermediatesForKey.fetch( key, intermediateAccessor ); if( intermediates == null ) return Collections.emptyList(); Map<I,O> values = valuesForIntermediate.fetch( intermediates, valueAccessor ); List<O> result = new ArrayList<>( intermediates.size() ); for( Map.Entry<I,O> entry : values.entrySet() ) { O value = entry.getValue(); if( value != null ) result.add( value ); } return result; } }