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