Home | History | Annotate | Download | only in database
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.database;
     18 
     19 import java.util.Date;
     20 import java.util.UUID;
     21 
     22 /**
     23  * Helper class for creating and querying data from a database in performance tests.
     24  *
     25  * Subclasses can define different table/query formats.
     26  */
     27 public abstract class TableHelper {
     28 
     29     public interface CursorReader {
     30         void read();
     31     }
     32 
     33     public abstract String createSql();
     34     public abstract String insertSql();
     35     public abstract Object[] createItem(int id);
     36     public abstract String readSql();
     37     public abstract CursorReader createReader(Cursor cursor);
     38 
     39     /**
     40      * 1 column, single integer
     41      */
     42     public static TableHelper INT_1 = new TableHelper() {
     43         @Override
     44         public String createSql() {
     45             return "CREATE TABLE `Int1` ("
     46                     + "`a` INTEGER,"
     47                     + " PRIMARY KEY(`a`))";
     48         }
     49 
     50         @Override
     51         public String insertSql() {
     52             return "INSERT INTO `Int1`(`a`)"
     53                     + " VALUES (?)";
     54         }
     55 
     56         @Override
     57         public Object[] createItem(int id) {
     58             return new Object[] {
     59                     id,
     60             };
     61         }
     62 
     63         @Override
     64         public String readSql() {
     65             return "SELECT * from Int1";
     66         }
     67 
     68         @Override
     69         public CursorReader createReader(final Cursor cursor) {
     70             final int cursorIndexOfA = cursor.getColumnIndexOrThrow("a");
     71             return () -> {
     72                 cursor.getInt(cursorIndexOfA);
     73             };
     74         }
     75     };
     76     /**
     77      * 10 columns of integers
     78      */
     79     public static TableHelper INT_10 = new TableHelper() {
     80         @Override
     81         public String createSql() {
     82             return "CREATE TABLE `Int10` ("
     83                     + "`a` INTEGER,"
     84                     + " `b` INTEGER,"
     85                     + " `c` INTEGER,"
     86                     + " `d` INTEGER,"
     87                     + " `e` INTEGER,"
     88                     + " `f` INTEGER,"
     89                     + " `g` INTEGER,"
     90                     + " `h` INTEGER,"
     91                     + " `i` INTEGER,"
     92                     + " `j` INTEGER,"
     93                     + " PRIMARY KEY(`a`))";
     94         }
     95 
     96         @Override
     97         public String insertSql() {
     98             return "INSERT INTO `Int10`(`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`i`,`j`)"
     99                     + " VALUES (?,?,?,?,?,?,?,?,?,?)";
    100         }
    101 
    102         @Override
    103         public Object[] createItem(int id) {
    104             return new Object[] {
    105                     id,
    106                     id + 1,
    107                     id + 2,
    108                     id + 3,
    109                     id + 4,
    110                     id + 5,
    111                     id + 6,
    112                     id + 7,
    113                     id + 8,
    114                     id + 9,
    115             };
    116         }
    117 
    118         @Override
    119         public String readSql() {
    120             return "SELECT * from Int10";
    121         }
    122 
    123         @Override
    124         public CursorReader createReader(final Cursor cursor) {
    125             final int cursorIndexOfA = cursor.getColumnIndexOrThrow("a");
    126             final int cursorIndexOfB = cursor.getColumnIndexOrThrow("b");
    127             final int cursorIndexOfC = cursor.getColumnIndexOrThrow("c");
    128             final int cursorIndexOfD = cursor.getColumnIndexOrThrow("d");
    129             final int cursorIndexOfE = cursor.getColumnIndexOrThrow("e");
    130             final int cursorIndexOfF = cursor.getColumnIndexOrThrow("f");
    131             final int cursorIndexOfG = cursor.getColumnIndexOrThrow("g");
    132             final int cursorIndexOfH = cursor.getColumnIndexOrThrow("h");
    133             final int cursorIndexOfI = cursor.getColumnIndexOrThrow("i");
    134             final int cursorIndexOfJ = cursor.getColumnIndexOrThrow("j");
    135             return () -> {
    136                 cursor.getInt(cursorIndexOfA);
    137                 cursor.getInt(cursorIndexOfB);
    138                 cursor.getInt(cursorIndexOfC);
    139                 cursor.getInt(cursorIndexOfD);
    140                 cursor.getInt(cursorIndexOfE);
    141                 cursor.getInt(cursorIndexOfF);
    142                 cursor.getInt(cursorIndexOfG);
    143                 cursor.getInt(cursorIndexOfH);
    144                 cursor.getInt(cursorIndexOfI);
    145                 cursor.getInt(cursorIndexOfJ);
    146             };
    147         }
    148     };
    149 
    150     /**
    151      * Mock up of 'user' table with various ints/strings
    152      */
    153     public static TableHelper USER = new TableHelper() {
    154         @Override
    155         public String createSql() {
    156             return "CREATE TABLE `User` ("
    157                     + "`mId` INTEGER,"
    158                     + " `mName` TEXT,"
    159                     + " `mLastName` TEXT,"
    160                     + " `mAge` INTEGER,"
    161                     + " `mAdmin` INTEGER,"
    162                     + " `mWeight` DOUBLE,"
    163                     + " `mBirthday` INTEGER,"
    164                     + " `mMoreText` TEXT,"
    165                     + " PRIMARY KEY(`mId`))";
    166         }
    167 
    168         @Override
    169         public String insertSql() {
    170             return "INSERT INTO `User`(`mId`,`mName`,`mLastName`,`mAge`,"
    171                     + "`mAdmin`,`mWeight`,`mBirthday`,`mMoreText`) VALUES (?,?,?,?,?,?,?,?)";
    172         }
    173 
    174         @Override
    175         public Object[] createItem(int id) {
    176             return new Object[] {
    177                     id,
    178                     UUID.randomUUID().toString(),
    179                     UUID.randomUUID().toString(),
    180                     (int) (10 + Math.random() * 50),
    181                     0,
    182                     (float)0,
    183                     new Date().getTime(),
    184                     UUID.randomUUID().toString(),
    185             };
    186         }
    187 
    188         @Override
    189         public String readSql() {
    190             return "SELECT * from User";
    191         }
    192 
    193         @Override
    194         public CursorReader createReader(final Cursor cursor) {
    195             final int cursorIndexOfMId = cursor.getColumnIndexOrThrow("mId");
    196             final int cursorIndexOfMName = cursor.getColumnIndexOrThrow("mName");
    197             final int cursorIndexOfMLastName = cursor.getColumnIndexOrThrow("mLastName");
    198             final int cursorIndexOfMAge = cursor.getColumnIndexOrThrow("mAge");
    199             final int cursorIndexOfMAdmin = cursor.getColumnIndexOrThrow("mAdmin");
    200             final int cursorIndexOfMWeight = cursor.getColumnIndexOrThrow("mWeight");
    201             final int cursorIndexOfMBirthday = cursor.getColumnIndexOrThrow("mBirthday");
    202             final int cursorIndexOfMMoreTextField = cursor.getColumnIndexOrThrow("mMoreText");
    203             return () -> {
    204                 cursor.getInt(cursorIndexOfMId);
    205                 cursor.getString(cursorIndexOfMName);
    206                 cursor.getString(cursorIndexOfMLastName);
    207                 cursor.getInt(cursorIndexOfMAge);
    208                 cursor.getInt(cursorIndexOfMAdmin);
    209                 cursor.getFloat(cursorIndexOfMWeight);
    210                 if (!cursor.isNull(cursorIndexOfMBirthday)) {
    211                     cursor.getLong(cursorIndexOfMBirthday);
    212                 }
    213                 cursor.getString(cursorIndexOfMMoreTextField);
    214             };
    215         }
    216     };
    217 
    218     public static TableHelper[] TABLE_HELPERS = new TableHelper[] {
    219             INT_1,
    220             INT_10,
    221             USER,
    222     };
    223 }
    224