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