1dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar/* 2dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar * Copyright (C) 2017 The Android Open Source Project 3dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar * 4dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar * Licensed under the Apache License, Version 2.0 (the "License"); 5dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar * you may not use this file except in compliance with the License. 6dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar * You may obtain a copy of the License at 7dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar * 8dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar * http://www.apache.org/licenses/LICENSE-2.0 9dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar * 10dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar * Unless required by applicable law or agreed to in writing, software 11dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar * distributed under the License is distributed on an "AS IS" BASIS, 12dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar * See the License for the specific language governing permissions and 14dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar * limitations under the License. 15dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar */ 16dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar 17bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viverettepackage androidx.room.integration.testapp.test; 18dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar 19dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyarimport static org.hamcrest.CoreMatchers.is; 20dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyarimport static org.hamcrest.MatcherAssert.assertThat; 21dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar 22dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyarimport android.content.Context; 23dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyarimport android.support.test.InstrumentationRegistry; 24dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyarimport android.support.test.filters.SmallTest; 25dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyarimport android.support.test.runner.AndroidJUnit4; 26dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar 27bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.ColumnInfo; 28bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Dao; 29bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Database; 30bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Entity; 31bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Index; 32bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.PrimaryKey; 33bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Query; 34bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Room; 35bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.RoomDatabase; 36dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar 37dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyarimport org.junit.Test; 38dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyarimport org.junit.runner.RunWith; 39dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar 40dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyarimport java.util.List; 41dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar 42dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar@SmallTest 43dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar@RunWith(AndroidJUnit4.class) 44dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyarpublic class IndexingTest { 45dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar @Entity( 46dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar tableName = "foo_table", 47dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar indices = { 48dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar @Index({"field1", "field2"}), 49dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar @Index(value = {"field2", "mId"}, unique = true), 50dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar @Index(value = {"field2"}, unique = true, name = "customIndex"), 51dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar }) 52dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar static class Entity1 { 53dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar @PrimaryKey 54dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar public int mId; 55dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar public String field1; 56dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar public String field2; 57dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar @ColumnInfo(index = true, name = "my_field") 58dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar public String field3; 59dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar } 60dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar 61dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar static class IndexInfo { 62dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar public String name; 63dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar @ColumnInfo(name = "tbl_name") 64dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar public String tableName; 65dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar public String sql; 66dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar } 67dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar 68dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar @Dao 69dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar public interface SqlMasterDao { 70dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar @Query("SELECT * FROM sqlite_master WHERE type = 'index'") 71dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar List<IndexInfo> loadIndices(); 72dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar } 73dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar 74a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar @Database(entities = {Entity1.class}, version = 1, exportSchema = false) 75dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar abstract static class IndexingDb extends RoomDatabase { 76dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar abstract SqlMasterDao sqlMasterDao(); 77dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar } 78dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar 79dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar @Test 80dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar public void verifyIndices() { 81dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar Context context = InstrumentationRegistry.getTargetContext(); 82dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar IndexingDb db = Room.inMemoryDatabaseBuilder(context, IndexingDb.class).build(); 83dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar List<IndexInfo> indices = db.sqlMasterDao().loadIndices(); 84dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar assertThat(indices.size(), is(4)); 85dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar for (IndexInfo info : indices) { 86dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar assertThat(info.tableName, is("foo_table")); 87dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar } 88dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar assertThat(indices.get(0).sql, is("CREATE INDEX `index_foo_table_field1_field2`" 89dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar + " ON `foo_table` (`field1`, `field2`)")); 90dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar assertThat(indices.get(1).sql, is("CREATE UNIQUE INDEX `index_foo_table_field2_mId`" 91dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar + " ON `foo_table` (`field2`, `mId`)")); 92dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar assertThat(indices.get(2).sql, is("CREATE UNIQUE INDEX `customIndex`" 93dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar + " ON `foo_table` (`field2`)")); 946728af1603c6082a13533b830a9ef0bbc51ba827Yigit Boyar assertThat(indices.get(3).sql, is("CREATE INDEX `index_foo_table_my_field`" 95dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar + " ON `foo_table` (`my_field`)")); 96dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar } 97dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar} 98