package org.infinispan.lucene.cacheloader; import java.io.File; import java.io.IOException; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.StringField; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TotalHitCountCollector; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.infinispan.lucene.CacheTestSupport; import org.infinispan.lucene.testutils.LuceneSettings; import org.testng.AssertJUnit; /** * Helper class which will contain common using methods. * * @author Anna Manukyan */ public class TestHelper { private TestHelper(){ //not to be instantiated } /** * Verifies that entries exist/not exist in the index. * * @param rootDir index root directory. * @param indexName index name. * @param termsAdded number of terms to be verified. * @param inverted flag to define which term should exist which not. * @throws IOException */ public static void verifyIndex(File rootDir, String indexName, int termsAdded, boolean inverted) throws IOException { File indexDir = new File(rootDir, indexName); Directory directory = FSDirectory.open(indexDir.toPath()); try { verifyOnDirectory(directory, termsAdded, inverted); } finally { directory.close(); } } /** * Verifies that entries exist/not exist in the index. * * @param directory index root directory. * @param termsAdded number of terms to be verified. * @param inverted flag to define which term should exist which not. * @throws IOException */ public static void verifyOnDirectory(Directory directory, int termsAdded, boolean inverted) throws IOException { IndexReader indexReader = DirectoryReader.open(directory); IndexSearcher searcher = new IndexSearcher(indexReader); try { for (int i = 0; i <= termsAdded; i++) { String term = String.valueOf(i); final Query queryToFind; final Query queryNotToFind; if (i % 2 == 0 ^ inverted) { queryToFind = new TermQuery(new Term("main", term)); queryNotToFind = new TermQuery(new Term("secondaryField", term)); } else { queryToFind = new TermQuery(new Term("secondaryField", term)); queryNotToFind = new TermQuery(new Term("main", term)); } TotalHitCountCollector toFindCounter = new TotalHitCountCollector(); searcher.search(queryToFind, toFindCounter); AssertJUnit.assertEquals("String '" + term + "' should exist but was not found in index", 1, toFindCounter.getTotalHits()); TotalHitCountCollector toNotFindCounter = new TotalHitCountCollector(); searcher.search(queryNotToFind, toNotFindCounter); AssertJUnit.assertEquals("String '" + term + "' should NOT exist but was found in index", 0, toNotFindCounter.getTotalHits()); } } finally { indexReader.close(); } } /** * Creates terms and inserts them into the index. * * @param rootDir index root directory. * @param indexName the name of the index. * @param termsToAdd number of terms to be added. * @param invert flag which identifies which terms should be inserted which not. * @throws IOException */ public static void createIndex(File rootDir, String indexName, int termsToAdd, boolean invert) throws IOException { File indexDir = new File(rootDir, indexName); FSDirectory directory = FSDirectory.open(indexDir.toPath()); try { CacheTestSupport.initializeDirectory(directory); IndexWriter iwriter = LuceneSettings.openWriter(directory, 100000); try { for (int i = 0; i <= termsToAdd; i++) { Document doc = new Document(); String term = String.valueOf(i); //For even values of i we add to "main" field if (i % 2 == 0 ^ invert) { doc.add(new StringField("main", term, Field.Store.NO)); } else { doc.add(new StringField("secondaryField", term, Field.Store.YES)); } iwriter.addDocument(doc); } iwriter.commit(); } finally { iwriter.close(); } } finally { directory.close(); } } /** * Creates root directory with subdirectories based on the provided directory name and it's sub directory name. * * @param parentDir the path of the root directory. * @param rootDirectoryName the path of the sub directory. * @return the created file. */ public static File createRootDir(final String parentDir, final String rootDirectoryName) { File rootDir = new File(new File(parentDir).getAbsoluteFile(), rootDirectoryName); boolean directoriesCreated = rootDir.mkdirs(); assert directoriesCreated : "couldn't create directory for test"; rootDir.deleteOnExit(); return rootDir; } /** * Returns the list of file names in the specified directory. * * @param rootDir the root directory. * @param indexName the name of the subdirectory. * @return the array of the names of the files. */ public static String[] getFileNamesFromDir(File rootDir, String indexName) { File indexDir = new File(rootDir.getAbsoluteFile(), indexName); assert indexDir.exists(); String[] fileNames = indexDir.list(); assert fileNames.length > 0; return fileNames; } }