package de.axone.cache.ng; import static de.axone.cache.ng.CacheNGAssert.*; import static de.axone.cache.ng.CacheNGTestHelpers.*; import static de.axone.cache.ng.CacheNGTest_Implementations.*; import static org.assertj.core.api.Assertions.*; import static org.testng.Assert.*; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.testng.annotations.Test; import de.axone.cache.ng.CacheNGTestHelpers.RN; import de.axone.cache.ng.CacheNGTestHelpers.TArticle; import de.axone.cache.ng.CacheNGTestHelpers.Tid; import de.axone.cache.ng.CacheNGTest_ArticleListForSearchQuery.TestAccessor_ArticleForQuery; import de.axone.cache.ng.CacheNGTest_ArticleListForSearchQuery.TestSearchQuery; import de.axone.cache.ng.CacheNGTest_ArticleListForSearchQuery.TestSearchQuery_Tid; import de.axone.cache.ng.CacheNGTest_ArticleListForSearchQuery.TidToQueryBridge; import de.axone.cache.ng.CacheNGTest_ArticleListForTid.TestAccessor_ArticleForTid; import de.axone.cache.ng.CacheNGTest_ArticleListForTid.TestMapTidToArticle; //TODO: Notiz: Die echten Search-Queries sollen von ArticleQuery auf irgendwas // wie "ExecutorService" umgestellt werden. Die Exekutoren könnten von den jew. // Backends order von einer Factory erzeugt werden. @Test( groups="cacheng.combined" ) public class CacheNGTest_CombinedSearchQueries { TestMapTidToArticle data = new TestMapTidToArticle(); { data.addArticle( TArticle.build( A12345 ) ); data.addArticle( TArticle.build( A12346 ) ); data.addArticle( TArticle.build( A12347 ) ); } static int i=1; TestSearchQuery_Tid t123 = new TestSearchQuery_Tid( T123 ), t123_ = new TestSearchQuery_Tid( tid( i+"23" ) ), t234 = new TestSearchQuery_Tid( T234 ) ; CombinedSearchQuery qq1234 = new CombinedSearchQuery( t123, t234 ), qq1234_ = new CombinedSearchQuery( t123_, t234 ), qq2345 = new CombinedSearchQuery( t234, t234 ) ; public void hashCodeAndEquals(){ assertThat( qq1234 ) .isEqualTo( qq1234_ ) .isNotEqualTo( qq2345 ) .is( havingSameHashCodeAs( qq1234_ ) ) .isNot( havingSameHashCodeAs( qq2345 ) ) ; } public void basicQueryOperations() { TestAccessor_ArticleForTid forTid = new TestAccessor_ArticleForTid( data ); CacheHashMap<Tid,List<TArticle>> cacheForTid = new CacheHashMap<>( RN.TID_LARTICLE ); CacheNG.AutomaticClient<Tid, List<TArticle>> autoForTid = new AutomaticClientImpl<>( cacheForTid ); TestAccessor_ArticleForQuery forQuery = new TestAccessor_ArticleForQuery( autoForTid, forTid ); CacheHashMap<TestSearchQuery, List<TArticle>> cacheForQuery = new CacheHashMap<>( RN.SQTID_LARTICLE ); CacheNG.AutomaticClient<TestSearchQuery, List<TArticle>> autoForQuery = new AutomaticClientImpl<>( cacheForQuery ); cacheForTid.registerListener( new TidToQueryBridge( cacheForQuery ) ); assertFalse( autoForQuery.isCached( qq1234 ) ); List<TArticle> arts = autoForQuery.fetch( qq1234, forQuery ); assertThat( arts ) .areExactly( 1, havingIdentifier( aid( "12345" ) ) ) .areExactly( 1, havingIdentifier( aid( "12346" ) ) ) .hasSize( 2 ) ; assertTrue( autoForQuery.isCached( qq1234 ) ); } static class CombinedSearchQuery implements TestSearchQuery { final List<TestSearchQuery> subQueries; public CombinedSearchQuery( TestSearchQuery ... subQueries ) { this.subQueries = Arrays.asList( subQueries ); } @Override public List<TArticle> execute( CacheNG.AutomaticClient<Tid, List<TArticle>> data, CacheNG.SingleValueAccessor<Tid, List<TArticle>> accessor ) { Set<TArticle> result = new LinkedHashSet<TArticle>(); for( TestSearchQuery sub : subQueries ){ result.addAll( sub.execute( data, accessor ) ); } return new ArrayList<>( result ); } @Override public int hashCode() { return subQueries.hashCode(); } @Override public boolean equals( Object obj ) { if( this == obj ) return true; if( obj == null ) return false; if( !( obj instanceof CombinedSearchQuery ) ) return false; CombinedSearchQuery other = (CombinedSearchQuery) obj; return subQueries.equals( other.subQueries ); } } }