/* * Copyright 2004-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.compass.core.test.engine.lucene.transaction.readcommitted; import java.util.ArrayList; import org.apache.lucene.index.Term; import org.apache.lucene.index.TermEnum; import org.compass.core.Resource; import org.compass.core.config.CompassEnvironment; import org.compass.core.config.CompassSettings; import org.compass.core.config.RuntimeCompassSettings; import org.compass.core.engine.SearchEngine; import org.compass.core.engine.SearchEngineHits; import org.compass.core.engine.SearchEngineQuery; import org.compass.core.lucene.LuceneEnvironment; import org.compass.core.lucene.engine.LuceneSearchEngineInternalSearch; import org.compass.core.lucene.engine.transaction.readcommitted.ReadCommittedTransactionProcessor; import org.compass.core.spi.InternalCompass; import org.compass.core.test.engine.lucene.transaction.AbstractTransactionEngineTests; /** * @author kimchy */ public abstract class AbstractReadCommittedTransactionTests extends AbstractTransactionEngineTests { protected CompassSettings buildCompassSettings() { CompassSettings settings = super.buildCompassSettings(); settings.setSetting(CompassEnvironment.CONNECTION, "target/test-index"); settings.setSetting(LuceneEnvironment.Transaction.Processor.TYPE, LuceneEnvironment.Transaction.Processor.ReadCommitted.NAME); return settings; } public void testSettings() { assertEquals(LuceneEnvironment.Transaction.Processor.ReadCommitted.NAME, getSettings().getSetting( LuceneEnvironment.Transaction.Processor.TYPE)); } public void testSearchEngineTransactionProcessorInstance() { getSearchEngine().begin(); assertTrue(getLuceneSearchEngine().getTransactionProcessor() instanceof ReadCommittedTransactionProcessor); getSearchEngine().rollback(); } public void testCreateResourceReadCommitted() { getSearchEngine().begin(); Resource singleId = createSingleIdResource(getSearchEngine()); getSearchEngine().create(singleId); Resource multiId = createMultiIdResource(getSearchEngine()); getSearchEngine().create(multiId); assertSingleIdResourceExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().rollback(); } public void testSaveResourceReadCommitted() { getSearchEngine().begin(); Resource singleId = createSingleIdResource(getSearchEngine()); getSearchEngine().create(singleId); Resource multiId = createMultiIdResource(getSearchEngine()); getSearchEngine().create(multiId); assertSingleIdResourceExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().commit(true); getSearchEngine().begin(); assertSingleIdResourceOriginal(getSearchEngine()); assertMulitIdResourceOriginal(getSearchEngine()); singleId = createUpdatedSingleIdResource(getSearchEngine()); getSearchEngine().save(singleId); assertSingleIdResourceUpdated(getSearchEngine()); assertMulitIdResourceOriginal(getSearchEngine()); getSearchEngine().rollback(); } public void testDeleteResource() { getSearchEngine().begin(); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceNotExists(getSearchEngine()); Resource singleId = createSingleIdResource(getSearchEngine()); getSearchEngine().create(singleId); Resource multiId = createMultiIdResource(getSearchEngine()); getSearchEngine().create(multiId); assertSingleIdResourceExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().delete(singleId); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().delete(multiId); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceNotExists(getSearchEngine()); multiId = createMultiIdResource(getSearchEngine()); getSearchEngine().create(multiId); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().delete(multiId); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceNotExists(getSearchEngine()); getSearchEngine().rollback(); } public void testMultiIdDoubleEntriesReadCommitted() throws Exception { getSearchEngine().begin(); assertMulitIdResourceNotExists(getSearchEngine()); assertMulitIdResource2NotExists(getSearchEngine()); Resource multiId = createMultiIdResource(getSearchEngine()); getSearchEngine().create(multiId); assertMulitIdResourceExists(getSearchEngine()); assertMulitIdResource2NotExists(getSearchEngine()); Resource multiId2 = createMultiIdResource2(getSearchEngine()); getSearchEngine().create(multiId2); assertMulitIdResourceExists(getSearchEngine()); assertMulitIdResource2Exists(getSearchEngine()); getSearchEngine().delete(multiId2); assertMulitIdResourceExists(getSearchEngine()); assertMulitIdResource2NotExists(getSearchEngine()); getSearchEngine().delete(multiId); assertMulitIdResourceNotExists(getSearchEngine()); assertMulitIdResource2NotExists(getSearchEngine()); getSearchEngine().rollback(); } public void testFindResourceReadCommitted() { getSearchEngine().begin(); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceNotExists(getSearchEngine()); Resource singleId = createSingleIdResource(getSearchEngine()); getSearchEngine().create(singleId); Resource multiId = createMultiIdResource(getSearchEngine()); getSearchEngine().create(multiId); SearchEngineQuery query = getSearchEngine().queryBuilder().queryString(PROPERTY_VAL1 + ":" + VALUE_VAL1).toQuery(); SearchEngineHits hits = query.hits(getSearchEngine()); assertEquals(1, hits.getLength()); Resource r = hits.getResource(0); assertEquals(VALUE_ID1, r.getProperty(PROPERTY_ID1).getStringValue()); query = getSearchEngine().queryBuilder().queryString(PROPERTY_VAL2 + ":" + VALUE_VAL2).toQuery(); hits = query.hits(getSearchEngine()); assertEquals(1, hits.getLength()); r = hits.getResource(0); assertEquals(VALUE_ID2, r.getProperty(PROPERTY_ID2).getStringValue()); query = getSearchEngine().queryBuilder().queryString(PROPERTY_VAL4 + ":" + VALUE_VAL4).toQuery(); hits = query.hits(getSearchEngine()); assertEquals(2, hits.getLength()); getSearchEngine().delete(r); query = getSearchEngine().queryBuilder().queryString(PROPERTY_VAL2 + ":" + VALUE_VAL2).toQuery(); hits = query.hits(getSearchEngine()); assertEquals(0, hits.getLength()); query = getSearchEngine().queryBuilder().queryString(PROPERTY_VAL4 + ":" + VALUE_VAL4).toQuery(); hits = query.hits(getSearchEngine()); assertEquals(1, hits.getLength()); getSearchEngine().rollback(); } public void testDeleteResourceWithCommitReadCommitted() { getSearchEngine().begin(); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceNotExists(getSearchEngine()); Resource singleId = createSingleIdResource(getSearchEngine()); getSearchEngine().create(singleId); Resource multiId = createMultiIdResource(getSearchEngine()); getSearchEngine().create(multiId); assertSingleIdResourceExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().delete(singleId); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().commit(true); getSearchEngine().begin(); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().commit(true); getSearchEngine().begin(); getSearchEngine().delete(multiId); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceNotExists(getSearchEngine()); getSearchEngine().commit(true); getSearchEngine().begin(); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceNotExists(getSearchEngine()); getSearchEngine().commit(true); } public void testDeleteResource2WithCommitReadCommitted() { getSearchEngine().begin(); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceNotExists(getSearchEngine()); assertSingleIdResource2NotExists(getSearchEngine()); assertMulitIdResource2NotExists(getSearchEngine()); Resource singleId = createSingleIdResource(getSearchEngine()); getSearchEngine().create(singleId); Resource multiId = createMultiIdResource(getSearchEngine()); getSearchEngine().create(multiId); getSearchEngine().commit(true); getSearchEngine().begin(); Resource singleId2 = createSingleIdResource2(getSearchEngine()); getSearchEngine().create(singleId2); Resource multiId2 = createMultiIdResource2(getSearchEngine()); getSearchEngine().create(multiId2); assertSingleIdResourceExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); assertSingleIdResource2Exists(getSearchEngine()); assertMulitIdResource2Exists(getSearchEngine()); getSearchEngine().delete(singleId); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); assertSingleIdResource2Exists(getSearchEngine()); getSearchEngine().delete(singleId2); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); assertSingleIdResource2NotExists(getSearchEngine()); getSearchEngine().commit(true); } public void testDeleteResourceWithRollbackReadCommitted() { getSearchEngine().begin(); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceNotExists(getSearchEngine()); Resource singleId = createSingleIdResource(getSearchEngine()); getSearchEngine().create(singleId); Resource multiId = createMultiIdResource(getSearchEngine()); getSearchEngine().create(multiId); assertSingleIdResourceExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().delete(singleId); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().commit(true); getSearchEngine().begin(); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().commit(true); getSearchEngine().begin(); getSearchEngine().delete(multiId); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceNotExists(getSearchEngine()); getSearchEngine().rollback(); getSearchEngine().begin(); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().commit(true); } public void testFindResourceWithCommitReadCommitted() { getSearchEngine().begin(); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceNotExists(getSearchEngine()); Resource singleId = createSingleIdResource(getSearchEngine()); getSearchEngine().create(singleId); Resource multiId = createMultiIdResource(getSearchEngine()); getSearchEngine().create(multiId); SearchEngineQuery query = getSearchEngine().queryBuilder().queryString(PROPERTY_VAL1 + ":" + VALUE_VAL1).toQuery(); SearchEngineHits hits = query.hits(getSearchEngine()); assertEquals(1, hits.getLength()); Resource r = hits.getResource(0); assertEquals(VALUE_ID1, r.getProperty(PROPERTY_ID1).getStringValue()); getSearchEngine().commit(true); getSearchEngine().begin(); query = getSearchEngine().queryBuilder().queryString(PROPERTY_VAL1 + ":" + VALUE_VAL1).toQuery(); hits = query.hits(getSearchEngine()); assertEquals(1, hits.getLength()); r = hits.getResource(0); assertEquals(VALUE_ID1, r.getProperty(PROPERTY_ID1).getStringValue()); query = getSearchEngine().queryBuilder().queryString(PROPERTY_VAL2 + ":" + VALUE_VAL2).toQuery(); hits = query.hits(getSearchEngine()); assertEquals(1, hits.getLength()); r = hits.getResource(0); assertEquals(VALUE_ID2, r.getProperty(PROPERTY_ID2).getStringValue()); getSearchEngine().delete(r); assertMulitIdResourceNotExists(getSearchEngine()); query = getSearchEngine().queryBuilder().queryString(PROPERTY_VAL1 + ":" + VALUE_VAL1).toQuery(); hits = query.hits(getSearchEngine()); assertEquals(1, hits.getLength()); r = hits.getResource(0); assertEquals(VALUE_ID1, r.getProperty(PROPERTY_ID1).getStringValue()); query = getSearchEngine().queryBuilder().queryString(PROPERTY_VAL2 + ":" + VALUE_VAL2).toQuery(); hits = query.hits(getSearchEngine()); assertEquals(0, hits.getLength()); getSearchEngine().commit(true); getSearchEngine().begin(); assertMulitIdResourceNotExists(getSearchEngine()); query = getSearchEngine().queryBuilder().queryString(PROPERTY_VAL1 + ":" + VALUE_VAL1).toQuery(); hits = query.hits(getSearchEngine()); assertEquals(1, hits.getLength()); r = hits.getResource(0); assertEquals(VALUE_ID1, r.getProperty(PROPERTY_ID1).getStringValue()); query = getSearchEngine().queryBuilder().queryString(PROPERTY_VAL2 + ":" + VALUE_VAL2).toQuery(); hits = query.hits(getSearchEngine()); assertEquals(0, hits.getLength()); query = getSearchEngine().queryBuilder().queryString(PROPERTY_VAL4 + ":" + VALUE_VAL4).toQuery(); hits = query.hits(getSearchEngine()); assertEquals(1, hits.getLength()); getSearchEngine().commit(true); } public void testTermDocs() throws Exception { getSearchEngine().begin(); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceNotExists(getSearchEngine()); // create an index with data and commit it Resource singleId = createSingleIdResource(getSearchEngine()); getSearchEngine().create(singleId); Resource multiId = createMultiIdResource(getSearchEngine()); getSearchEngine().create(multiId); assertSingleIdResourceExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().commit(true); // start one index engine again, and perform reads getSearchEngine().begin(); assertSingleIdResourceExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); LuceneSearchEngineInternalSearch internalSearch = (LuceneSearchEngineInternalSearch) getSearchEngine().internalSearch(null, null); TermEnum termEnum = internalSearch.getReader().terms(new Term(PROPERTY_VAL1, "")); try { ArrayList tempList = new ArrayList(); while (PROPERTY_VAL1.equals(termEnum.term().field())) { tempList.add(termEnum.term().text()); if (!termEnum.next()) { break; } } assertEquals(1, tempList.size()); assertEquals("val1value", tempList.get(0)); } finally { termEnum.close(); } getSearchEngine().commit(true); } public void testConcurrentReads() throws Exception { getSearchEngine().begin(); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceNotExists(getSearchEngine()); // create an index with data and commit it Resource singleId = createSingleIdResource(getSearchEngine()); getSearchEngine().create(singleId); Resource multiId = createMultiIdResource(getSearchEngine()); getSearchEngine().create(multiId); assertSingleIdResourceExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().commit(true); // start one index engine again, and perform reads getSearchEngine().begin(); assertSingleIdResourceExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); // start another index engine, and perform reads (checks that is is not // locked - conccurrent) SearchEngine searchEngine = getSearchEngineFactory().openSearchEngine(new RuntimeCompassSettings(((InternalCompass) compass).getSettings())); searchEngine.begin(); assertSingleIdResourceExists(searchEngine); assertMulitIdResourceExists(searchEngine); searchEngine.commit(true); getSearchEngine().rollback(); } public void testNoDirtyRead() throws Exception { getSearchEngine().begin(); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceNotExists(getSearchEngine()); // create an index with data, don't commit it yet Resource singleId = createSingleIdResource(getSearchEngine()); getSearchEngine().create(singleId); Resource multiId = createMultiIdResource(getSearchEngine()); getSearchEngine().create(multiId); assertSingleIdResourceExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); // start another index engine and check that we can read (as well not // read the other transaction data) SearchEngine searchEngine = getSearchEngineFactory().openSearchEngine(new RuntimeCompassSettings(((InternalCompass) compass).getSettings())); searchEngine.begin(); assertSingleIdResourceNotExists(searchEngine); assertMulitIdResourceNotExists(searchEngine); searchEngine.commit(true); getSearchEngine().commit(true); } public void testUnrepeatableReads() throws Exception { getSearchEngine().begin(); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceNotExists(getSearchEngine()); // start an index engine, with an index that has no data SearchEngine searchEngine = getSearchEngineFactory().openSearchEngine(new RuntimeCompassSettings(((InternalCompass) compass).getSettings())); searchEngine.begin(); assertSingleIdResourceNotExists(searchEngine); assertMulitIdResourceNotExists(searchEngine); Resource singleId = createSingleIdResource(getSearchEngine()); getSearchEngine().create(singleId); Resource multiId = createMultiIdResource(getSearchEngine()); getSearchEngine().create(multiId); assertSingleIdResourceExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().commit(true); // check for repeatable reads assertSingleIdResourceExists(searchEngine); assertMulitIdResourceExists(searchEngine); searchEngine.commit(true); } public void testTwoPhaseCreatePrepareRollbackReadCommitted() { // create an index with data and commit it getSearchEngine().begin(); Resource singleId = createSingleIdResource(getSearchEngine()); getSearchEngine().create(singleId); Resource multiId = createMultiIdResource(getSearchEngine()); getSearchEngine().create(multiId); assertSingleIdResourceExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().prepare(); getSearchEngine().rollback(); getSearchEngine().begin(); assertSingleIdResourceNotExists(getSearchEngine()); assertMulitIdResourceNotExists(getSearchEngine()); getSearchEngine().rollback(); } public void testTwoPhaseDeletePrepareRollbackReadCommitted() { // create an index with data and commit it getSearchEngine().begin(); Resource singleId = createSingleIdResource(getSearchEngine()); getSearchEngine().create(singleId); Resource multiId = createMultiIdResource(getSearchEngine()); getSearchEngine().create(multiId); assertSingleIdResourceExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().prepare(); getSearchEngine().commit(false); getSearchEngine().begin(); assertSingleIdResourceExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().rollback(); getSearchEngine().begin(); getSearchEngine().delete(singleId); assertSingleIdResourceNotExists(getSearchEngine()); getSearchEngine().prepare(); getSearchEngine().rollback(); getSearchEngine().begin(); assertSingleIdResourceExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().rollback(); } public void testTwoPhasePrepareCommitReadCommitted() { // create an index with data and commit it getSearchEngine().begin(); Resource singleId = createSingleIdResource(getSearchEngine()); getSearchEngine().create(singleId); Resource multiId = createMultiIdResource(getSearchEngine()); getSearchEngine().create(multiId); assertSingleIdResourceExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().prepare(); getSearchEngine().commit(false); getSearchEngine().begin(); assertSingleIdResourceExists(getSearchEngine()); assertMulitIdResourceExists(getSearchEngine()); getSearchEngine().rollback(); } public void testCreateAndFindWithinTransaction() { getSearchEngine().begin(); Resource singleId = createSingleIdResource(getSearchEngine()); getSearchEngine().create(singleId); SearchEngineHits hits = getSearchEngine().queryBuilder().term(PROPERTY_VAL1, VALUE_VAL1).hits(getSearchEngine()); assertEquals(1, hits.getLength()); getSearchEngine().rollback(); } }