package lux; import static org.junit.Assert.*; import java.io.IOException; import java.util.Arrays; import lux.index.analysis.DefaultAnalyzer; import net.sf.saxon.s9api.XdmNode; import net.sf.saxon.s9api.XdmNodeKind; import net.sf.saxon.s9api.XdmSequenceIterator; import net.sf.saxon.tree.tiny.TinyDocumentImpl; import org.apache.lucene.document.Field.Store; import org.apache.lucene.document.StringField; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.Version; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; public class CachingDocReaderTest { private Evaluator eval; @Before public void init () throws IOException { eval = Evaluator.createEvaluator(new RAMDirectory()); } /** * Once we implement storing binary documents, we can test retrieving them! * @throws Exception */ @Test @Ignore public void testBinaryDocument() throws Exception { String insertQuery = " let $test := text { '' } " + " return (lux:delete('lux:/'), lux:insert('/minus.xqy', $test), lux:commit())"; XdmResultSet result = eval.evaluate(insertQuery); assertSuccessfulResult(result); eval.reopenSearcher(); // see result of insert XdmNode doc = eval.getDocReader().get(0, eval.getSearcher().getIndexReader()); Object data = ((TinyDocumentImpl)doc.getUnderlyingNode()).getUserData("_binaryDocument"); assertTrue ("unexpected data type", data instanceof byte[]); byte[] bytes = (byte[]) data; String q = new String (bytes, "utf-8"); assertEquals (insertQuery, q); } private void assertSuccessfulResult(XdmResultSet result) { if (! result.getErrors().isEmpty()) { result.getErrors().get(0).printStackTrace(); fail(result.getErrors().get(0).toString()); } } private void assertResult(String s, XdmResultSet result) { assertSuccessfulResult (result); XdmSequenceIterator iter = result.getXdmValue().iterator(); assertEquals (s, iter.next().getStringValue()); assertFalse ("more than one result", iter.hasNext()); } /** * Test retrieving a document that has no lux fields * @throws Exception */ @Test public void testEmptyDocument () throws Exception { RAMDirectory dir = new RAMDirectory(); // add a document to the index that has no xml-valued field: IndexWriter writer = new IndexWriter (dir, new IndexWriterConfig(Version.LUCENE_46, new DefaultAnalyzer())); StringField field = new StringField("string", "value", Store.YES); writer.addDocument(Arrays.asList(new StringField[] { field } )); writer.commit(); writer.close(); Evaluator e = Evaluator.createEvaluator (dir); XdmNode doc = e.getDocReader().get(0, e.getSearcher().getIndexReader()); assertNotNull (doc); assertEquals ("", doc.getStringValue()); assertEquals (XdmNodeKind.DOCUMENT, doc.getNodeKind()); try { doc = e.getDocReader().get(1, e.getSearcher().getIndexReader()); fail ("expected exception not thrown"); } catch (IllegalArgumentException e1) { } } @Test public void testOverwriteDocument () throws Exception { XdmResultSet result = eval.evaluate("lux:insert('/test', <test>1</test>)"); assertSuccessfulResult(result); result = eval.evaluate("lux:insert('/test', <test2>2</test2>)"); assertSuccessfulResult(result); eval.reopenSearcher(); assertResult ("1", eval.evaluate("count(doc('/test'))")); assertResult ("2", eval.evaluate("doc('/test')/test2")); } }