12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601 |
- /*
- Copyright (c) 2007 Health Market Science, Inc.
-
- 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 com.healthmarketscience.jackcess;
-
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collections;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- import java.util.NoSuchElementException;
- import java.util.TreeSet;
- import java.util.stream.Collectors;
-
- import static com.healthmarketscience.jackcess.Database.*;
- import com.healthmarketscience.jackcess.impl.ColumnImpl;
- import com.healthmarketscience.jackcess.impl.JetFormatTest;
- import static com.healthmarketscience.jackcess.impl.JetFormatTest.*;
- import com.healthmarketscience.jackcess.impl.RowIdImpl;
- import com.healthmarketscience.jackcess.impl.TableImpl;
- import com.healthmarketscience.jackcess.util.CaseInsensitiveColumnMatcher;
- import com.healthmarketscience.jackcess.util.ColumnMatcher;
- import com.healthmarketscience.jackcess.util.RowFilterTest;
- import com.healthmarketscience.jackcess.util.SimpleColumnMatcher;
- import junit.framework.TestCase;
- import static com.healthmarketscience.jackcess.TestUtil.*;
- import static com.healthmarketscience.jackcess.DatabaseBuilder.*;
-
- /**
- * @author James Ahlborn
- */
- public class CursorTest extends TestCase {
-
- static final List<TestDB> INDEX_CURSOR_DBS =
- TestDB.getSupportedForBasename(Basename.INDEX_CURSOR);
-
-
- public CursorTest(String name) throws Exception {
- super(name);
- }
-
- @Override
- protected void setUp() {
- TestUtil.setTestAutoSync(false);
- }
-
- @Override
- protected void tearDown() {
- TestUtil.clearTestAutoSync();
- }
-
- private static List<Map<String,Object>> createTestTableData()
- throws Exception
- {
- List<Map<String,Object>> expectedRows =
- new ArrayList<Map<String,Object>>();
- for(int i = 0; i < 10; ++i) {
- expectedRows.add(createExpectedRow("id", i, "value", "data" + i));
- }
- return expectedRows;
- }
-
- private static List<Map<String,Object>> createTestTableData(
- int startIdx,
- int endIdx)
- throws Exception
- {
- List<Map<String,Object>> expectedRows = createTestTableData();
- expectedRows.subList(endIdx, expectedRows.size()).clear();
- expectedRows.subList(0, startIdx).clear();
- return expectedRows;
- }
-
- private static Database createTestTable(final FileFormat fileFormat)
- throws Exception
- {
- Database db = createMem(fileFormat);
-
- Table table = newTable("test")
- .addColumn(newColumn("id", DataType.LONG))
- .addColumn(newColumn("value", DataType.TEXT))
- .toTable(db);
-
- for(Map<String,Object> row : createTestTableData()) {
- table.addRow(row.get("id"), row.get("value"));
- }
-
- return db;
- }
-
- private static List<Map<String,Object>> createUnorderedTestTableData()
- throws Exception
- {
- List<Map<String,Object>> expectedRows =
- new ArrayList<Map<String,Object>>();
- int[] ids = new int[]{3, 7, 6, 1, 2, 9, 0, 5, 4, 8};
- for(int i : ids) {
- expectedRows.add(createExpectedRow("id", i, "value", "data" + i));
- }
- return expectedRows;
- }
-
- static Database createTestIndexTable(final TestDB indexCursorDB)
- throws Exception
- {
- Database db = openMem(indexCursorDB);
-
- Table table = db.getTable("test");
-
- for(Map<String,Object> row : createUnorderedTestTableData()) {
- table.addRow(row.get("id"), row.get("value"));
- }
-
- return db;
- }
-
- private static List<Map<String,Object>> createDupeTestTableData()
- throws Exception
- {
- List<Map<String,Object>> expectedRows =
- new ArrayList<Map<String,Object>>();
- int[] ids = new int[]{3, 7, 6, 1, 2, 9, 0, 5, 4, 8};
- for(int i : ids) {
- expectedRows.add(createExpectedRow("id", i, "value", "data" + (i % 3)));
- }
- for(int i : ids) {
- expectedRows.add(createExpectedRow("id", i, "value", "data" + (i % 5)));
- }
- return expectedRows;
- }
-
- private static Database createDupeTestTable(final FileFormat fileFormat)
- throws Exception
- {
- Database db = createMem(fileFormat);
-
- Table table = newTable("test")
- .addColumn(newColumn("id", DataType.LONG))
- .addColumn(newColumn("value", DataType.TEXT))
- .toTable(db);
-
- for(Map<String,Object> row : createDupeTestTableData()) {
- table.addRow(row.get("id"), row.get("value"));
- }
-
- return db;
- }
-
- static Database createDupeTestTable(final TestDB indexCursorDB)
- throws Exception
- {
- Database db = openMem(indexCursorDB);
-
- Table table = db.getTable("test");
-
- for(Map<String,Object> row : createDupeTestTableData()) {
- table.addRow(row.get("id"), row.get("value"));
- }
-
- return db;
- }
-
- private static Cursor createIndexSubRangeCursor(Table table,
- Index idx,
- int type)
- throws Exception
- {
- return table.newCursor()
- .setIndex(idx)
- .setStartEntry(3 - type)
- .setStartRowInclusive(type == 0)
- .setEndEntry(8 + type)
- .setEndRowInclusive(type == 0)
- .toCursor();
- }
-
- public void testRowId() throws Exception {
- // test special cases
- RowIdImpl rowId1 = new RowIdImpl(1, 2);
- RowIdImpl rowId2 = new RowIdImpl(1, 3);
- RowIdImpl rowId3 = new RowIdImpl(2, 1);
-
- List<RowIdImpl> sortedRowIds =
- new ArrayList<RowIdImpl>(new TreeSet<RowIdImpl>(
- Arrays.asList(rowId1, rowId2, rowId3, RowIdImpl.FIRST_ROW_ID,
- RowIdImpl.LAST_ROW_ID)));
-
- assertEquals(Arrays.asList(RowIdImpl.FIRST_ROW_ID, rowId1, rowId2, rowId3,
- RowIdImpl.LAST_ROW_ID),
- sortedRowIds);
- }
-
- public void testSimple() throws Exception {
- for (final FileFormat fileFormat : JetFormatTest.SUPPORTED_FILEFORMATS) {
- Database db = createTestTable(fileFormat);
-
- Table table = db.getTable("test");
- Cursor cursor = CursorBuilder.createCursor(table);
- doTestSimple(cursor, null);
- db.close();
- }
- }
-
- private static void doTestSimple(Cursor cursor,
- List<Map<String, Object>> expectedRows)
- throws Exception
- {
- if(expectedRows == null) {
- expectedRows = createTestTableData();
- }
-
- List<Map<String, Object>> foundRows =
- new ArrayList<Map<String, Object>>();
- for(Map<String, Object> row : cursor) {
- foundRows.add(row);
- }
- assertEquals(expectedRows, foundRows);
- }
-
- public void testMove() throws Exception {
- for (final FileFormat fileFormat : JetFormatTest.SUPPORTED_FILEFORMATS) {
- Database db = createTestTable(fileFormat);
-
- Table table = db.getTable("test");
- Cursor cursor = CursorBuilder.createCursor(table);
- doTestMove(cursor, null);
-
- db.close();
- }
- }
-
- private static void doTestMove(Cursor cursor,
- List<Map<String, Object>> expectedRows)
- throws Exception
- {
- if(expectedRows == null) {
- expectedRows = createTestTableData();
- }
- expectedRows.subList(1, 4).clear();
-
- List<Map<String, Object>> foundRows =
- new ArrayList<Map<String, Object>>();
- assertTrue(cursor.isBeforeFirst());
- assertFalse(cursor.isAfterLast());
- foundRows.add(cursor.getNextRow());
- assertEquals(3, cursor.moveNextRows(3));
- assertFalse(cursor.isBeforeFirst());
- assertFalse(cursor.isAfterLast());
-
- Map<String,Object> expectedRow = cursor.getCurrentRow();
- Cursor.Savepoint savepoint = cursor.getSavepoint();
- assertEquals(2, cursor.movePreviousRows(2));
- assertEquals(2, cursor.moveNextRows(2));
- assertTrue(cursor.moveToNextRow());
- assertTrue(cursor.moveToPreviousRow());
- assertEquals(expectedRow, cursor.getCurrentRow());
-
- while(cursor.moveToNextRow()) {
- foundRows.add(cursor.getCurrentRow());
- }
- assertEquals(expectedRows, foundRows);
- assertFalse(cursor.isBeforeFirst());
- assertTrue(cursor.isAfterLast());
-
- assertEquals(0, cursor.moveNextRows(3));
-
- cursor.beforeFirst();
- assertTrue(cursor.isBeforeFirst());
- assertFalse(cursor.isAfterLast());
-
- cursor.afterLast();
- assertFalse(cursor.isBeforeFirst());
- assertTrue(cursor.isAfterLast());
-
- cursor.restoreSavepoint(savepoint);
- assertEquals(expectedRow, cursor.getCurrentRow());
- }
-
- public void testMoveNoReset() throws Exception {
- for (final FileFormat fileFormat : JetFormatTest.SUPPORTED_FILEFORMATS) {
- Database db = createTestTable(fileFormat);
-
- Table table = db.getTable("test");
- Cursor cursor = CursorBuilder.createCursor(table);
- doTestMoveNoReset(cursor);
-
- db.close();
- }
- }
-
- private static void doTestMoveNoReset(Cursor cursor)
- throws Exception
- {
- List<Map<String, Object>> expectedRows = createTestTableData();
- List<Map<String, Object>> foundRows = new ArrayList<Map<String, Object>>();
-
- Iterator<Row> iter = cursor.newIterable().iterator();
-
- for(int i = 0; i < 6; ++i) {
- foundRows.add(iter.next());
- }
-
- iter = cursor.newIterable().reset(false).reverse().iterator();
- iter.next();
- Map<String, Object> row = iter.next();
- assertEquals(expectedRows.get(4), row);
-
- iter = cursor.newIterable().reset(false).iterator();
- iter.next();
- row = iter.next();
- assertEquals(expectedRows.get(5), row);
- iter.next();
-
- iter = cursor.newIterable().reset(false).iterator();
- for(int i = 6; i < 10; ++i) {
- foundRows.add(iter.next());
- }
-
- assertEquals(expectedRows, foundRows);
- }
-
- public void testSearch() throws Exception {
- for (final FileFormat fileFormat : JetFormatTest.SUPPORTED_FILEFORMATS) {
- Database db = createTestTable(fileFormat);
-
- Table table = db.getTable("test");
- Cursor cursor = CursorBuilder.createCursor(table);
- doTestSearch(table, cursor, null, 42, -13);
-
- db.close();
- }
- }
-
- private static void doTestSearch(Table table, Cursor cursor, Index index,
- Integer... outOfRangeValues)
- throws Exception
- {
- assertTrue(cursor.findFirstRow(table.getColumn("id"), 3));
- assertEquals(createExpectedRow("id", 3,
- "value", "data" + 3),
- cursor.getCurrentRow());
-
- assertTrue(cursor.findFirstRow(createExpectedRow(
- "id", 6,
- "value", "data" + 6)));
- assertEquals(createExpectedRow("id", 6,
- "value", "data" + 6),
- cursor.getCurrentRow());
-
- assertFalse(cursor.findFirstRow(createExpectedRow(
- "id", 8,
- "value", "data" + 13)));
- assertFalse(cursor.findFirstRow(table.getColumn("id"), 13));
- assertEquals(createExpectedRow("id", 6,
- "value", "data" + 6),
- cursor.getCurrentRow());
-
- assertTrue(cursor.findFirstRow(createExpectedRow(
- "value", "data" + 7)));
- assertEquals(createExpectedRow("id", 7,
- "value", "data" + 7),
- cursor.getCurrentRow());
-
- assertTrue(cursor.findFirstRow(table.getColumn("value"), "data" + 4));
- assertEquals(createExpectedRow("id", 4,
- "value", "data" + 4),
- cursor.getCurrentRow());
-
- for(Integer outOfRangeValue : outOfRangeValues) {
- assertFalse(cursor.findFirstRow(table.getColumn("id"),
- outOfRangeValue));
- assertFalse(cursor.findFirstRow(table.getColumn("value"),
- "data" + outOfRangeValue));
- assertFalse(cursor.findFirstRow(createExpectedRow(
- "id", outOfRangeValue,
- "value", "data" + outOfRangeValue)));
- }
-
- assertEquals("data" + 5,
- CursorBuilder.findValue(table,
- table.getColumn("value"),
- table.getColumn("id"), 5));
- assertEquals(createExpectedRow("id", 5,
- "value", "data" + 5),
- CursorBuilder.findRow(table,
- createExpectedRow("id", 5)));
- if(index != null) {
- assertEquals("data" + 5,
- CursorBuilder.findValue(index,
- table.getColumn("value"),
- table.getColumn("id"), 5));
- assertEquals(createExpectedRow("id", 5,
- "value", "data" + 5),
- CursorBuilder.findRow(index,
- createExpectedRow("id", 5)));
-
- assertNull(CursorBuilder.findValue(index,
- table.getColumn("value"),
- table.getColumn("id"),
- -17));
- assertNull(CursorBuilder.findRow(index,
- createExpectedRow("id", 13)));
- }
- }
-
- public void testReverse() throws Exception {
- for (final FileFormat fileFormat : JetFormatTest.SUPPORTED_FILEFORMATS) {
- Database db = createTestTable(fileFormat);
-
- Table table = db.getTable("test");
- Cursor cursor = CursorBuilder.createCursor(table);
- doTestReverse(cursor, null);
-
- db.close();
- }
- }
-
- private static void doTestReverse(Cursor cursor,
- List<Map<String, Object>> expectedRows)
- throws Exception
- {
- if(expectedRows == null) {
- expectedRows = createTestTableData();
- }
- Collections.reverse(expectedRows);
-
- List<Map<String, Object>> foundRows =
- new ArrayList<Map<String, Object>>();
- for(Map<String, Object> row : cursor.newIterable().reverse()) {
- foundRows.add(row);
- }
- assertEquals(expectedRows, foundRows);
- }
-
- public void testLiveAddition() throws Exception {
- for (final FileFormat fileFormat : JetFormatTest.SUPPORTED_FILEFORMATS) {
- Database db = createTestTable(fileFormat);
-
- Table table = db.getTable("test");
-
- Cursor cursor1 = CursorBuilder.createCursor(table);
- Cursor cursor2 = CursorBuilder.createCursor(table);
- doTestLiveAddition(table, cursor1, cursor2, 11);
-
- db.close();
- }
- }
-
- private static void doTestLiveAddition(Table table,
- Cursor cursor1,
- Cursor cursor2,
- Integer newRowNum) throws Exception
- {
- cursor1.moveNextRows(11);
- cursor2.moveNextRows(11);
-
- assertTrue(cursor1.isAfterLast());
- assertTrue(cursor2.isAfterLast());
-
- table.addRow(newRowNum, "data" + newRowNum);
- Map<String,Object> expectedRow =
- createExpectedRow("id", newRowNum, "value", "data" + newRowNum);
-
- assertFalse(cursor1.isAfterLast());
- assertFalse(cursor2.isAfterLast());
-
- assertEquals(expectedRow, cursor1.getCurrentRow());
- assertEquals(expectedRow, cursor2.getCurrentRow());
- assertFalse(cursor1.moveToNextRow());
- assertFalse(cursor2.moveToNextRow());
- assertTrue(cursor1.isAfterLast());
- assertTrue(cursor2.isAfterLast());
- }
-
-
- public void testLiveDeletion() throws Exception {
- for (final FileFormat fileFormat : JetFormatTest.SUPPORTED_FILEFORMATS) {
- Database db = createTestTable(fileFormat);
-
- Table table = db.getTable("test");
-
- Cursor cursor1 = CursorBuilder.createCursor(table);
- Cursor cursor2 = CursorBuilder.createCursor(table);
- Cursor cursor3 = CursorBuilder.createCursor(table);
- Cursor cursor4 = CursorBuilder.createCursor(table);
- doTestLiveDeletion(cursor1, cursor2, cursor3, cursor4, 1);
-
- db.close();
- }
- }
-
- private static void doTestLiveDeletion(
- Cursor cursor1,
- Cursor cursor2,
- Cursor cursor3,
- Cursor cursor4,
- int firstValue) throws Exception
- {
- assertEquals(2, cursor1.moveNextRows(2));
- assertEquals(3, cursor2.moveNextRows(3));
- assertEquals(3, cursor3.moveNextRows(3));
- assertEquals(4, cursor4.moveNextRows(4));
-
- Map<String,Object> expectedPrevRow =
- createExpectedRow("id", firstValue, "value", "data" + firstValue);
- ++firstValue;
- Map<String,Object> expectedDeletedRow =
- createExpectedRow("id", firstValue, "value", "data" + firstValue);
- ++firstValue;
- Map<String,Object> expectedNextRow =
- createExpectedRow("id", firstValue, "value", "data" + firstValue);
-
- assertEquals(expectedDeletedRow, cursor2.getCurrentRow());
- assertEquals(expectedDeletedRow, cursor3.getCurrentRow());
-
- assertFalse(cursor2.isCurrentRowDeleted());
- assertFalse(cursor3.isCurrentRowDeleted());
-
- cursor2.deleteCurrentRow();
-
- assertTrue(cursor2.isCurrentRowDeleted());
- assertTrue(cursor3.isCurrentRowDeleted());
-
- assertEquals(expectedNextRow, cursor1.getNextRow());
- assertEquals(expectedNextRow, cursor2.getNextRow());
- assertEquals(expectedNextRow, cursor3.getNextRow());
-
- assertEquals(expectedPrevRow, cursor3.getPreviousRow());
-
- assertTrue(cursor3.moveToNextRow());
- cursor3.deleteCurrentRow();
- assertTrue(cursor3.isCurrentRowDeleted());
-
- firstValue += 2;
- expectedNextRow =
- createExpectedRow("id", firstValue, "value", "data" + firstValue);
- assertTrue(cursor3.moveToNextRow());
- assertEquals(expectedNextRow, cursor3.getNextRow());
-
- cursor1.beforeFirst();
- assertTrue(cursor1.moveToNextRow());
- cursor1.deleteCurrentRow();
- assertFalse(cursor1.isBeforeFirst());
- assertFalse(cursor1.isAfterLast());
- assertFalse(cursor1.moveToPreviousRow());
- assertTrue(cursor1.isBeforeFirst());
- assertFalse(cursor1.isAfterLast());
-
- cursor1.afterLast();
- assertTrue(cursor1.moveToPreviousRow());
- cursor1.deleteCurrentRow();
- assertFalse(cursor1.isBeforeFirst());
- assertFalse(cursor1.isAfterLast());
- assertFalse(cursor1.moveToNextRow());
- assertFalse(cursor1.isBeforeFirst());
- assertTrue(cursor1.isAfterLast());
-
- cursor1.beforeFirst();
- while(cursor1.moveToNextRow()) {
- cursor1.deleteCurrentRow();
- }
-
- assertTrue(cursor1.isAfterLast());
- assertTrue(cursor2.isCurrentRowDeleted());
- assertTrue(cursor3.isCurrentRowDeleted());
- assertTrue(cursor4.isCurrentRowDeleted());
- }
-
- public void testSimpleIndex() throws Exception {
- for (final TestDB indexCursorDB : INDEX_CURSOR_DBS) {
- Database db = createTestIndexTable(indexCursorDB);
-
- Table table = db.getTable("test");
- Index idx = table.getIndexes().get(0);
-
- assertTable(createUnorderedTestTableData(), table);
-
- Cursor cursor = CursorBuilder.createCursor(idx);
- doTestSimple(cursor, null);
-
- db.close();
- }
- }
-
- public void testMoveIndex() throws Exception {
- for (final TestDB indexCursorDB : INDEX_CURSOR_DBS) {
- Database db = createTestIndexTable(indexCursorDB);
-
- Table table = db.getTable("test");
- Index idx = table.getIndexes().get(0);
- Cursor cursor = CursorBuilder.createCursor(idx);
- doTestMove(cursor, null);
-
- db.close();
- }
- }
-
- public void testReverseIndex() throws Exception {
- for (final TestDB indexCursorDB : INDEX_CURSOR_DBS) {
- Database db = createTestIndexTable(indexCursorDB);
-
- Table table = db.getTable("test");
- Index idx = table.getIndexes().get(0);
- Cursor cursor = CursorBuilder.createCursor(idx);
- doTestReverse(cursor, null);
-
- db.close();
- }
- }
-
- public void testSearchIndex() throws Exception {
- for (final TestDB indexCursorDB : INDEX_CURSOR_DBS) {
- Database db = createTestIndexTable(indexCursorDB);
-
- Table table = db.getTable("test");
- Index idx = table.getIndexes().get(0);
- Cursor cursor = CursorBuilder.createCursor(idx);
- doTestSearch(table, cursor, idx, 42, -13);
-
- db.close();
- }
- }
-
- public void testLiveAdditionIndex() throws Exception {
- for (final TestDB indexCursorDB : INDEX_CURSOR_DBS) {
- Database db = createTestIndexTable(indexCursorDB);
-
- Table table = db.getTable("test");
- Index idx = table.getIndexes().get(0);
-
- Cursor cursor1 = CursorBuilder.createCursor(idx);
- Cursor cursor2 = CursorBuilder.createCursor(idx);
- doTestLiveAddition(table, cursor1, cursor2, 11);
-
- db.close();
- }
- }
-
- public void testLiveDeletionIndex() throws Exception {
- for (final TestDB indexCursorDB : INDEX_CURSOR_DBS) {
- Database db = createTestIndexTable(indexCursorDB);
-
- Table table = db.getTable("test");
- Index idx = table.getIndexes().get(0);
-
- Cursor cursor1 = CursorBuilder.createCursor(idx);
- Cursor cursor2 = CursorBuilder.createCursor(idx);
- Cursor cursor3 = CursorBuilder.createCursor(idx);
- Cursor cursor4 = CursorBuilder.createCursor(idx);
- doTestLiveDeletion(cursor1, cursor2, cursor3, cursor4, 1);
-
- db.close();
- }
- }
-
- public void testSimpleIndexSubRange() throws Exception {
- for (final TestDB indexCursorDB : INDEX_CURSOR_DBS) {
- for(int i = 0; i < 2; ++i) {
- Database db = createTestIndexTable(indexCursorDB);
-
- Table table = db.getTable("test");
- Index idx = table.getIndexes().get(0);
-
- Cursor cursor = createIndexSubRangeCursor(table, idx, i);
-
- List<Map<String,Object>> expectedRows =
- createTestTableData(3, 9);
-
- doTestSimple(cursor, expectedRows);
-
- db.close();
- }
- }
- }
-
- public void testMoveIndexSubRange() throws Exception {
- for (final TestDB indexCursorDB : INDEX_CURSOR_DBS) {
- for(int i = 0; i < 2; ++i) {
- Database db = createTestIndexTable(indexCursorDB);
-
- Table table = db.getTable("test");
- Index idx = table.getIndexes().get(0);
-
- Cursor cursor = createIndexSubRangeCursor(table, idx, i);
-
- List<Map<String,Object>> expectedRows =
- createTestTableData(3, 9);
-
- doTestMove(cursor, expectedRows);
-
- db.close();
- }
- }
- }
-
- public void testSearchIndexSubRange() throws Exception {
- for (final TestDB indexCursorDB : INDEX_CURSOR_DBS) {
- for(int i = 0; i < 2; ++i) {
- Database db = createTestIndexTable(indexCursorDB);
-
- Table table = db.getTable("test");
- Index idx = table.getIndexes().get(0);
-
- Cursor cursor = createIndexSubRangeCursor(table, idx, i);
-
- doTestSearch(table, cursor, idx, 2, 9);
-
- db.close();
- }
- }
- }
-
- public void testReverseIndexSubRange() throws Exception {
- for (final TestDB indexCursorDB : INDEX_CURSOR_DBS) {
- for(int i = 0; i < 2; ++i) {
- Database db = createTestIndexTable(indexCursorDB);
-
- Table table = db.getTable("test");
- Index idx = table.getIndexes().get(0);
-
- Cursor cursor = createIndexSubRangeCursor(table, idx, i);
-
- List<Map<String,Object>> expectedRows =
- createTestTableData(3, 9);
-
- doTestReverse(cursor, expectedRows);
-
- db.close();
- }
- }
- }
-
- public void testLiveAdditionIndexSubRange() throws Exception {
- for (final TestDB indexCursorDB : INDEX_CURSOR_DBS) {
- for(int i = 0; i < 2; ++i) {
- Database db = createTestIndexTable(indexCursorDB);
-
- Table table = db.getTable("test");
- Index idx = table.getIndexes().get(0);
-
- Cursor cursor1 = createIndexSubRangeCursor(table, idx, i);
- Cursor cursor2 = createIndexSubRangeCursor(table, idx, i);
-
- doTestLiveAddition(table, cursor1, cursor2, 8);
-
- db.close();
- }
- }
- }
-
- public void testLiveDeletionIndexSubRange() throws Exception {
- for (final TestDB indexCursorDB : INDEX_CURSOR_DBS) {
- for(int i = 0; i < 2; ++i) {
- Database db = createTestIndexTable(indexCursorDB);
-
- Table table = db.getTable("test");
- Index idx = table.getIndexes().get(0);
-
- Cursor cursor1 = createIndexSubRangeCursor(table, idx, i);
- Cursor cursor2 = createIndexSubRangeCursor(table, idx, i);
- Cursor cursor3 = createIndexSubRangeCursor(table, idx, i);
- Cursor cursor4 = createIndexSubRangeCursor(table, idx, i);
-
- doTestLiveDeletion(cursor1, cursor2, cursor3, cursor4, 4);
-
- db.close();
- }
- }
- }
-
- public void testFindAllIndex() throws Exception {
- for (final FileFormat fileFormat : JetFormatTest.SUPPORTED_FILEFORMATS) {
- Database db = createDupeTestTable(fileFormat);
-
- Table table = db.getTable("test");
- Cursor cursor = CursorBuilder.createCursor(table);
-
- doTestFindAll(table, cursor, null);
-
- db.close();
- }
- }
-
- public void testFindAll() throws Exception {
- for (final TestDB indexCursorDB : INDEX_CURSOR_DBS) {
- Database db = createDupeTestTable(indexCursorDB);
-
- Table table = db.getTable("test");
- Index idx = table.getIndexes().get(0);
- Cursor cursor = CursorBuilder.createCursor(idx);
-
- doTestFindAll(table, cursor, idx);
-
- db.close();
- }
- }
-
- private static void doTestFindAll(Table table, Cursor cursor, Index index)
- throws Exception
- {
- List<? extends Map<String,Object>> rows = RowFilterTest.toList(
- cursor.newIterable().setMatchPattern("value", "data2"));
-
- List<? extends Map<String, Object>> expectedRows = null;
-
- if(index == null) {
- expectedRows =
- createExpectedTable(
- createExpectedRow(
- "id", 2, "value", "data2"),
- createExpectedRow(
- "id", 5, "value", "data2"),
- createExpectedRow(
- "id", 8, "value", "data2"),
- createExpectedRow(
- "id", 7, "value", "data2"),
- createExpectedRow(
- "id", 2, "value", "data2"));
- } else {
- expectedRows =
- createExpectedTable(
- createExpectedRow(
- "id", 2, "value", "data2"),
- createExpectedRow(
- "id", 2, "value", "data2"),
- createExpectedRow(
- "id", 5, "value", "data2"),
- createExpectedRow(
- "id", 7, "value", "data2"),
- createExpectedRow(
- "id", 8, "value", "data2"));
- }
- assertEquals(expectedRows, rows);
-
- Column valCol = table.getColumn("value");
- rows = RowFilterTest.toList(
- cursor.newIterable().setMatchPattern(valCol, "data4"));
-
- if(index == null) {
- expectedRows =
- createExpectedTable(
- createExpectedRow(
- "id", 9, "value", "data4"),
- createExpectedRow(
- "id", 4, "value", "data4"));
- } else {
- expectedRows =
- createExpectedTable(
- createExpectedRow(
- "id", 4, "value", "data4"),
- createExpectedRow(
- "id", 9, "value", "data4"));
- }
- assertEquals(expectedRows, rows);
-
- rows = RowFilterTest.toList(
- cursor.newIterable().setMatchPattern(valCol, "data9"));
-
- assertTrue(rows.isEmpty());
-
- rows = RowFilterTest.toList(
- cursor.newIterable().setMatchPattern(
- Collections.singletonMap("id", 8)));
-
- expectedRows =
- createExpectedTable(
- createExpectedRow(
- "id", 8, "value", "data2"),
- createExpectedRow(
- "id", 8, "value", "data3"));
- assertEquals(expectedRows, rows);
-
- for(Map<String,Object> row : table) {
-
- List<Map<String,Object>> tmpRows = new ArrayList<Map<String,Object>>();
- for(Map<String,Object> tmpRow : cursor) {
- if(row.equals(tmpRow)) {
- tmpRows.add(tmpRow);
- }
- }
- expectedRows = tmpRows;
- assertFalse(expectedRows.isEmpty());
-
- rows = RowFilterTest.toList(cursor.newIterable().setMatchPattern(row));
-
- assertEquals(expectedRows, rows);
- }
-
- rows = RowFilterTest.toList(
- cursor.newIterable().addMatchPattern("id", 8)
- .addMatchPattern("value", "data13"));
- assertTrue(rows.isEmpty());
- }
-
- public void testId() throws Exception
- {
- for (final TestDB indexCursorDB : INDEX_CURSOR_DBS) {
- Database db = createTestIndexTable(indexCursorDB);
-
- Table table = db.getTable("test");
- Index idx = table.getIndexes().get(0);
-
- Cursor tCursor = CursorBuilder.createCursor(table);
- Cursor iCursor = CursorBuilder.createCursor(idx);
-
- Cursor.Savepoint tSave = tCursor.getSavepoint();
- Cursor.Savepoint iSave = iCursor.getSavepoint();
-
- tCursor.restoreSavepoint(tSave);
- iCursor.restoreSavepoint(iSave);
-
- try {
- tCursor.restoreSavepoint(iSave);
- fail("IllegalArgumentException should have been thrown");
- } catch(IllegalArgumentException e) {
- // success
- }
-
- try {
- iCursor.restoreSavepoint(tSave);
- fail("IllegalArgumentException should have been thrown");
- } catch(IllegalArgumentException e) {
- // success
- }
-
- Cursor tCursor2 = CursorBuilder.createCursor(table);
- Cursor iCursor2 = CursorBuilder.createCursor(idx);
-
- tCursor2.restoreSavepoint(tSave);
- iCursor2.restoreSavepoint(iSave);
-
- db.close();
- }
- }
-
- public void testColumnMatcher() throws Exception {
-
-
- for (final FileFormat fileFormat : JetFormatTest.SUPPORTED_FILEFORMATS) {
- Database db = createTestTable(fileFormat);
-
- Table table = db.getTable("test");
-
- doTestMatchers(table, SimpleColumnMatcher.INSTANCE, false);
- doTestMatchers(table, CaseInsensitiveColumnMatcher.INSTANCE, true);
-
- Cursor cursor = CursorBuilder.createCursor(table);
- doTestMatcher(table, cursor, SimpleColumnMatcher.INSTANCE, false);
- doTestMatcher(table, cursor, CaseInsensitiveColumnMatcher.INSTANCE,
- true);
- db.close();
- }
- }
-
- private static void doTestMatchers(Table table, ColumnMatcher columnMatcher,
- boolean caseInsensitive)
- throws Exception
- {
- assertTrue(columnMatcher.matches(table, "value", null, null));
- assertFalse(columnMatcher.matches(table, "value", "foo", null));
- assertFalse(columnMatcher.matches(table, "value", null, "foo"));
- assertTrue(columnMatcher.matches(table, "value", "foo", "foo"));
- assertTrue(columnMatcher.matches(table, "value", "foo", "Foo")
- == caseInsensitive);
-
- assertFalse(columnMatcher.matches(table, "value", 13, null));
- assertFalse(columnMatcher.matches(table, "value", null, 13));
- assertTrue(columnMatcher.matches(table, "value", 13, 13));
- }
-
- private static void doTestMatcher(Table table, Cursor cursor,
- ColumnMatcher columnMatcher,
- boolean caseInsensitive)
- throws Exception
- {
- cursor.setColumnMatcher(columnMatcher);
-
- assertTrue(cursor.findFirstRow(table.getColumn("id"), 3));
- assertEquals(createExpectedRow("id", 3,
- "value", "data" + 3),
- cursor.getCurrentRow());
-
- assertTrue(cursor.findFirstRow(createExpectedRow(
- "id", 6,
- "value", "data" + 6)));
- assertEquals(createExpectedRow("id", 6,
- "value", "data" + 6),
- cursor.getCurrentRow());
-
- assertTrue(cursor.findFirstRow(createExpectedRow(
- "id", 6,
- "value", "Data" + 6)) == caseInsensitive);
- if(caseInsensitive) {
- assertEquals(createExpectedRow("id", 6,
- "value", "data" + 6),
- cursor.getCurrentRow());
- }
-
- assertFalse(cursor.findFirstRow(createExpectedRow(
- "id", 8,
- "value", "data" + 13)));
- assertFalse(cursor.findFirstRow(table.getColumn("id"), 13));
- assertEquals(createExpectedRow("id", 6,
- "value", "data" + 6),
- cursor.getCurrentRow());
-
- assertTrue(cursor.findFirstRow(createExpectedRow(
- "value", "data" + 7)));
- assertEquals(createExpectedRow("id", 7,
- "value", "data" + 7),
- cursor.getCurrentRow());
-
- assertTrue(cursor.findFirstRow(createExpectedRow(
- "value", "Data" + 7)) == caseInsensitive);
- if(caseInsensitive) {
- assertEquals(createExpectedRow("id", 7,
- "value", "data" + 7),
- cursor.getCurrentRow());
- }
-
- assertTrue(cursor.findFirstRow(table.getColumn("value"), "data" + 4));
- assertEquals(createExpectedRow("id", 4,
- "value", "data" + 4),
- cursor.getCurrentRow());
-
- assertTrue(cursor.findFirstRow(table.getColumn("value"), "Data" + 4)
- == caseInsensitive);
- if(caseInsensitive) {
- assertEquals(createExpectedRow("id", 4,
- "value", "data" + 4),
- cursor.getCurrentRow());
- }
-
- assertEquals(Arrays.asList(createExpectedRow("id", 4,
- "value", "data" + 4)),
- RowFilterTest.toList(
- cursor.newIterable()
- .setMatchPattern("value", "data4")
- .setColumnMatcher(SimpleColumnMatcher.INSTANCE)));
-
- assertEquals(Arrays.asList(createExpectedRow("id", 3,
- "value", "data" + 3)),
- RowFilterTest.toList(
- cursor.newIterable()
- .setMatchPattern("value", "DaTa3")
- .setColumnMatcher(CaseInsensitiveColumnMatcher.INSTANCE)));
-
- assertEquals(Arrays.asList(createExpectedRow("id", 2,
- "value", "data" + 2)),
- RowFilterTest.toList(
- cursor.newIterable()
- .addMatchPattern("value", "DaTa2")
- .addMatchPattern("id", 2)
- .setColumnMatcher(CaseInsensitiveColumnMatcher.INSTANCE)));
- }
-
- public void testIndexCursor() throws Exception
- {
- for (final TestDB testDB : TestDB.getSupportedForBasename(Basename.INDEX, true)) {
-
- Database db = openMem(testDB);
- Table t1 = db.getTable("Table1");
- Index idx = t1.getIndex(IndexBuilder.PRIMARY_KEY_NAME);
- IndexCursor cursor = CursorBuilder.createCursor(idx);
-
- assertFalse(cursor.findFirstRowByEntry(-1));
- cursor.findClosestRowByEntry(-1);
- assertEquals(0, cursor.getCurrentRow().get("id"));
-
- assertTrue(cursor.findFirstRowByEntry(1));
- assertEquals(1, cursor.getCurrentRow().get("id"));
-
- cursor.findClosestRowByEntry(2);
- assertEquals(2, cursor.getCurrentRow().get("id"));
-
- assertFalse(cursor.findFirstRowByEntry(4));
- cursor.findClosestRowByEntry(4);
- assertTrue(cursor.isAfterLast());
-
- db.close();
- }
- }
-
- public void testIndexCursorDelete() throws Exception
- {
- for (final TestDB testDB : TestDB.getSupportedForBasename(Basename.INDEX)) {
-
- Database db = openMem(testDB);
- Table t1 = db.getTable("Table1");
- Index idx = t1.getIndex("Table2Table1");
- IndexCursor cursor = CursorBuilder.createCursor(idx);
-
- List<String> expectedData = cursor.newEntryIterable(1)
- .addColumnNames("data")
- .stream().map(r -> r.getString("data"))
- .collect(Collectors.toList());
-
- assertEquals(Arrays.asList("baz11", "baz11-2"), expectedData);
-
- expectedData = new ArrayList<String>();
- for(Iterator<? extends Row> iter =
- cursor.newEntryIterable(1).iterator();
- iter.hasNext(); ) {
- expectedData.add(iter.next().getString("data"));
- iter.remove();
- try {
- iter.remove();
- fail("IllegalArgumentException should have been thrown");
- } catch(IllegalStateException e) {
- // success
- }
-
- if(!iter.hasNext()) {
- try {
- iter.next();
- fail("NoSuchElementException should have been thrown");
- } catch(NoSuchElementException e) {
- // success
- }
- }
- }
-
- assertEquals(Arrays.asList("baz11", "baz11-2"), expectedData);
-
- expectedData = new ArrayList<String>();
- for(Row row : cursor.newEntryIterable(1)
- .addColumnNames("data")) {
- expectedData.add(row.getString("data"));
- }
-
- assertTrue(expectedData.isEmpty());
-
- db.close();
- }
- }
-
- public void testCursorDelete() throws Exception
- {
- for (final TestDB testDB : TestDB.getSupportedForBasename(Basename.INDEX)) {
-
- Database db = openMem(testDB);
- Table t1 = db.getTable("Table1");
- Cursor cursor = CursorBuilder.createCursor(t1);
-
- List<String> expectedData = cursor.newIterable().setColumnNames(
- Arrays.asList("otherfk1", "data")).stream()
- .filter(r -> r.get("otherfk1").equals(1))
- .map(r -> r.getString("data"))
- .collect(Collectors.toList());
-
- assertEquals(Arrays.asList("baz11", "baz11-2"), expectedData);
-
- expectedData = new ArrayList<String>();
- for(Iterator<? extends Row> iter = cursor.iterator();
- iter.hasNext(); ) {
- Row row = iter.next();
- if(row.get("otherfk1").equals(1)) {
- expectedData.add(row.getString("data"));
- iter.remove();
- try {
- iter.remove();
- fail("IllegalArgumentException should have been thrown");
- } catch(IllegalStateException e) {
- // success
- }
- }
-
- if(!iter.hasNext()) {
- try {
- iter.next();
- fail("NoSuchElementException should have been thrown");
- } catch(NoSuchElementException e) {
- // success
- }
- }
- }
-
- assertEquals(Arrays.asList("baz11", "baz11-2"), expectedData);
-
- expectedData = new ArrayList<String>();
- for(Row row : cursor.newIterable().setColumnNames(
- Arrays.asList("otherfk1", "data"))) {
- if(row.get("otherfk1").equals(1)) {
- expectedData.add(row.getString("data"));
- }
- }
-
- assertTrue(expectedData.isEmpty());
-
- db.close();
- }
- }
-
- public void testFindByRowId() throws Exception {
- for (final FileFormat fileFormat : JetFormatTest.SUPPORTED_FILEFORMATS) {
- Database db = createTestTable(fileFormat);
-
- Table table = db.getTable("test");
- Cursor cursor = CursorBuilder.createCursor(table);
- doTestFindByRowId(cursor);
- db.close();
- }
- }
-
- public void testFindByRowIdIndex() throws Exception {
- for (final TestDB indexCursorDB : INDEX_CURSOR_DBS) {
- Database db = createTestIndexTable(indexCursorDB);
-
- Table table = db.getTable("test");
- Index idx = table.getIndexes().get(0);
-
- assertTable(createUnorderedTestTableData(), table);
-
- Cursor cursor = CursorBuilder.createCursor(idx);
- doTestFindByRowId(cursor);
-
- db.close();
- }
- }
-
- private static void doTestFindByRowId(Cursor cursor)
- throws Exception
- {
- for(int i = 0; i < 3; ++i) {
- cursor.moveToNextRow();
- }
-
- Row r1 = cursor.getCurrentRow();
-
- for(int i = 0; i < 3; ++i) {
- cursor.moveToNextRow();
- }
-
- Row r2 = cursor.getCurrentRow();
-
- doTestFindByRowId(cursor, r1, 2);
-
- doTestFindByRowId(cursor, r2, 5);
- }
-
- private static void doTestFindByRowId(Cursor cursor, Row row, int id)
- throws Exception
- {
- cursor.reset();
- assertTrue(cursor.findRow(row.getId()));
- Row rFound = cursor.getCurrentRow();
- assertEquals(id, rFound.get("id"));
- assertEquals(row, rFound);
- Cursor.Savepoint save = cursor.getSavepoint();
-
- assertTrue(cursor.moveToNextRow());
- assertEquals(id + 1, cursor.getCurrentRow().get("id"));
-
- cursor.restoreSavepoint(save);
-
- assertTrue(cursor.moveToPreviousRow());
- assertEquals(id - 1, cursor.getCurrentRow().get("id"));
-
- assertFalse(cursor.findRow(RowIdImpl.FIRST_ROW_ID));
-
- assertEquals(id - 1, cursor.getCurrentRow().get("id"));
- }
-
- public void testIterationEarlyExit() throws Exception {
- for (final FileFormat fileFormat : JetFormatTest.SUPPORTED_FILEFORMATS) {
-
- Database db = createMem(fileFormat);
-
- Table table = newTable("test")
- .addColumn(newColumn("id", DataType.LONG))
- .addColumn(newColumn("value", DataType.TEXT))
- .addColumn(newColumn("memo", DataType.MEMO))
- .addIndex(newIndex("value_idx")
- .addColumns("value"))
- .toTable(db);
-
- for(int i = 0; i < 20; ++i) {
- Object memo = "memo-" + i;
- table.addRow(i, "val-" + (i/2), memo);
- }
-
- // generate an "invalid" memo
- byte[] b = new byte[12];
- b[3] = (byte)0xC0;
- table.addRow(20, "val-9", ColumnImpl.rawDataWrapper(b));
-
- IndexCursor cursor = CursorBuilder.createCursor(
- table.getIndex("value_idx"));
-
- try {
- cursor.newIterable()
- .addMatchPattern("value", "val-9")
- .addMatchPattern("memo", "anything")
- .iterator().hasNext();
- fail("RuntimeIOException should have been thrown");
- } catch(RuntimeIOException ignored) {
- // success
- }
-
- List<Row> rows = new ArrayList<Row>();
- for (Row row : cursor.newIterable()
- .addMatchPattern("value", "val-5")
- .addMatchPattern("memo", "memo-11")) {
- rows.add(row);
- }
-
- assertEquals(rows, createExpectedTable(
- createExpectedRow("id", 11,
- "value", "val-5",
- "memo", "memo-11")));
-
- assertFalse(cursor.newIterable()
- .addMatchPattern("value", "val-31")
- .addMatchPattern("memo", "anything")
- .iterator().hasNext());
-
- db.close();
- }
- }
-
- public void testPartialIndexFind() throws Exception
- {
- for (final FileFormat fileFormat : JetFormatTest.SUPPORTED_FILEFORMATS) {
-
- Database db = createMem(fileFormat);
-
- TableImpl t = (TableImpl)newTable("Test")
- .addColumn(newColumn("id", DataType.LONG))
- .addColumn(newColumn("data1", DataType.TEXT))
- .addColumn(newColumn("num2", DataType.LONG))
- .addColumn(newColumn("key3", DataType.TEXT))
- .addColumn(newColumn("value", DataType.TEXT))
- .addIndex(newIndex("idx3").addColumns("data1", "num2", "key3"))
- .toTable(db);
-
- Index idx = t.findIndexForColumns(Arrays.asList("data1"),
- TableImpl.IndexFeature.ANY_MATCH);
- assertEquals("idx3", idx.getName());
-
- idx = t.findIndexForColumns(Arrays.asList("data1", "num2"),
- TableImpl.IndexFeature.ANY_MATCH);
- assertEquals("idx3", idx.getName());
-
- idx = t.findIndexForColumns(Arrays.asList("data1", "num2", "key3"),
- TableImpl.IndexFeature.ANY_MATCH);
- assertEquals("idx3", idx.getName());
-
- assertNull(t.findIndexForColumns(Arrays.asList("num2"),
- TableImpl.IndexFeature.ANY_MATCH));
- assertNull(t.findIndexForColumns(Arrays.asList("data1", "key3"),
- TableImpl.IndexFeature.ANY_MATCH));
- assertNull(t.findIndexForColumns(Arrays.asList("data1"),
- TableImpl.IndexFeature.EXACT_MATCH));
-
-
- newIndex("idx2")
- .addColumns("data1", "num2")
- .addToTable(t);
-
- idx = t.findIndexForColumns(Arrays.asList("data1"),
- TableImpl.IndexFeature.ANY_MATCH);
- assertEquals("idx2", idx.getName());
-
- idx = t.findIndexForColumns(Arrays.asList("data1", "num2"),
- TableImpl.IndexFeature.ANY_MATCH);
- assertEquals("idx2", idx.getName());
-
- idx = t.findIndexForColumns(Arrays.asList("data1", "num2", "key3"),
- TableImpl.IndexFeature.ANY_MATCH);
- assertEquals("idx3", idx.getName());
-
- assertNull(t.findIndexForColumns(Arrays.asList("num2"),
- TableImpl.IndexFeature.ANY_MATCH));
- assertNull(t.findIndexForColumns(Arrays.asList("data1", "key3"),
- TableImpl.IndexFeature.ANY_MATCH));
- assertNull(t.findIndexForColumns(Arrays.asList("data1"),
- TableImpl.IndexFeature.EXACT_MATCH));
-
-
- newIndex("idx1")
- .addColumns("data1")
- .addToTable(t);
-
- idx = t.findIndexForColumns(Arrays.asList("data1"),
- TableImpl.IndexFeature.ANY_MATCH);
- assertEquals("idx1", idx.getName());
-
- idx = t.findIndexForColumns(Arrays.asList("data1", "num2"),
- TableImpl.IndexFeature.ANY_MATCH);
- assertEquals("idx2", idx.getName());
-
- idx = t.findIndexForColumns(Arrays.asList("data1", "num2", "key3"),
- TableImpl.IndexFeature.ANY_MATCH);
- assertEquals("idx3", idx.getName());
-
- assertNull(t.findIndexForColumns(Arrays.asList("num2"),
- TableImpl.IndexFeature.ANY_MATCH));
- assertNull(t.findIndexForColumns(Arrays.asList("data1", "key3"),
- TableImpl.IndexFeature.ANY_MATCH));
-
- db.close();
- }
- }
-
- public void testPartialIndexLookup() throws Exception
- {
- for (final FileFormat fileFormat : JetFormatTest.SUPPORTED_FILEFORMATS) {
-
- Database db = createMem(fileFormat);
-
- TableImpl t = (TableImpl)newTable("Test")
- .addColumn(newColumn("id", DataType.LONG))
- .addColumn(newColumn("data1", DataType.TEXT))
- .addColumn(newColumn("num2", DataType.LONG))
- .addColumn(newColumn("key3", DataType.TEXT))
- .addColumn(newColumn("value", DataType.TEXT))
- .addIndex(newIndex("idx3")
- .addColumns(true, "data1")
- .addColumns(false, "num2")
- .addColumns(true, "key3")
- )
- .toTable(db);
-
- int id = 1;
- for(String str : Arrays.asList("A", "B", "C", "D")) {
- for(int i = 4; i >= 0; --i) {
- // for(int i = 0; i < 5; ++i) {
- for(int j = 1; j < 3; ++j) {
- t.addRow(id, str, i, "K" + j, "value" + id);
- ++id;
- }
- }
- }
-
- Index idx = t.getIndex("idx3");
- doPartialIndexLookup(idx);
-
- idx = newIndex("idx2")
- .addColumns(true, "data1")
- .addColumns(false, "num2")
- .addToTable(t);
- doPartialIndexLookup(idx);
-
- idx = newIndex("idx1")
- .addColumns(true, "data1")
- .addToTable(t);
- doPartialIndexLookup(idx);
-
- db.close();
- }
- }
-
- private static void doPartialIndexLookup(Index idx) throws Exception
- {
- int colCount = idx.getColumnCount();
- IndexCursor c = idx.newCursor().toIndexCursor();
-
- doFindFirstByEntry(c, 21, "C");
- doFindFirstByEntry(c, null, "Z");
-
- if(colCount > 1) {
- doFindFirstByEntry(c, 23, "C", 3);
- doFindFirstByEntry(c, null, "C", 20);
- }
-
- if(colCount > 2) {
- doFindFirstByEntry(c, 27, "C", 1, "K1");
- doFindFirstByEntry(c, null, "C", 4, "K3");
- }
-
- try {
- if(colCount > 2) {
- c.findFirstRowByEntry("C", 4, "K1", 14);
- } else if(colCount > 1) {
- c.findFirstRowByEntry("C", 4, "K1");
- } else {
- c.findFirstRowByEntry("C", 4);
- }
- fail("IllegalArgumentException should have been thrown");
- } catch(IllegalArgumentException expected) {
- // scucess
- }
-
- doFindByEntryRange(c, 11, 20, "B");
- doFindByEntry(c, new int[]{}, "Z");
-
- if(colCount > 1) {
- doFindByEntryRange(c, 13, 14, "B", 3);
- doFindByEntry(c, new int[]{}, "B", 20);
- }
-
- if(colCount > 2) {
- doFindByEntryRange(c, 14, 14, "B", 3, "K2");
- doFindByEntry(c, new int[]{}, "B", 3, "K3");
- }
-
- doFindByRow(idx, 13,
- "data1", "B", "value", "value13");
- doFindByRow(idx, 13,
- "data1", "B", "key3", "K1", "value", "value13");
- doFindByRow(idx, 13,
- "data1", "B", "num2", 3, "key3", "K1", "value", "value13");
- doFindByRow(idx, 13,
- "num2", 3, "value", "value13");
- doFindByRow(idx, 13,
- "value", "value13");
- doFindByRow(idx, null,
- "data1", "B", "num2", 5, "key3", "K1", "value", "value13");
- doFindByRow(idx, null,
- "data1", "B", "value", "value4");
-
- Column col = idx.getTable().getColumn("data1");
- doFindValue(idx, 21, col, "C");
- doFindValue(idx, null, col, "Z");
- col = idx.getTable().getColumn("value");
- doFindValue(idx, 21, col, "value21");
- doFindValue(idx, null, col, "valueZ");
- }
-
- private static void doFindFirstByEntry(IndexCursor c, Integer expectedId,
- Object... entry)
- throws Exception
- {
- if(expectedId != null) {
- assertTrue(c.findFirstRowByEntry(entry));
- assertEquals(expectedId, c.getCurrentRow().get("id"));
- } else {
- assertFalse(c.findFirstRowByEntry(entry));
- }
- }
-
- private static void doFindByEntryRange(IndexCursor c, int start, int end,
- Object... entry)
- {
- List<Integer> expectedIds = new ArrayList<Integer>();
- for(int i = start; i <= end; ++i) {
- expectedIds.add(i);
- }
- doFindByEntry(c, expectedIds, entry);
- }
-
- private static void doFindByEntry(IndexCursor c, int[] ids,
- Object... entry)
- {
- List<Integer> expectedIds = new ArrayList<Integer>();
- for(int id : ids) {
- expectedIds.add(id);
- }
- doFindByEntry(c, expectedIds, entry);
- }
-
- private static void doFindByEntry(IndexCursor c, List<Integer> expectedIds,
- Object... entry)
- {
- List<Integer> foundIds = new ArrayList<Integer>();
- for(Row row : c.newEntryIterable(entry)) {
- foundIds.add((Integer)row.get("id"));
- }
- assertEquals(expectedIds, foundIds);
- }
-
- private static void doFindByRow(Index idx, Integer id, Object... rowPairs)
- throws Exception
- {
- Map<String,Object> map = createExpectedRow(
- rowPairs);
- Row r = CursorBuilder.findRow(idx, map);
- if(id != null) {
- assertEquals(id, r.get("id"));
- } else {
- assertNull(r);
- }
- }
-
- private static void doFindValue(Index idx, Integer id,
- Column columnPattern, Object valuePattern)
- throws Exception
- {
- Object value = CursorBuilder.findValue(
- idx, idx.getTable().getColumn("id"), columnPattern, valuePattern);
- if(id != null) {
- assertEquals(id, value);
- } else {
- assertNull(value);
- }
- }
- }
|