/* * Copyright (C) 2017 The Android Open Source Project * * 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 android.database; import java.util.Date; import java.util.UUID; /** * Helper class for creating and querying data from a database in performance tests. * * Subclasses can define different table/query formats. */ public abstract class TableHelper { public interface CursorReader { void read(); } public abstract String createSql(); public abstract String insertSql(); public abstract Object[] createItem(int id); public abstract String readSql(); public abstract CursorReader createReader(Cursor cursor); /** * 1 column, single integer */ public static TableHelper INT_1 = new TableHelper() { @Override public String createSql() { return "CREATE TABLE `Int1` (" + "`a` INTEGER," + " PRIMARY KEY(`a`))"; } @Override public String insertSql() { return "INSERT INTO `Int1`(`a`)" + " VALUES (?)"; } @Override public Object[] createItem(int id) { return new Object[] { id, }; } @Override public String readSql() { return "SELECT * from Int1"; } @Override public CursorReader createReader(final Cursor cursor) { final int cursorIndexOfA = cursor.getColumnIndexOrThrow("a"); return () -> { cursor.getInt(cursorIndexOfA); }; } }; /** * 10 columns of integers */ public static TableHelper INT_10 = new TableHelper() { @Override public String createSql() { return "CREATE TABLE `Int10` (" + "`a` INTEGER," + " `b` INTEGER," + " `c` INTEGER," + " `d` INTEGER," + " `e` INTEGER," + " `f` INTEGER," + " `g` INTEGER," + " `h` INTEGER," + " `i` INTEGER," + " `j` INTEGER," + " PRIMARY KEY(`a`))"; } @Override public String insertSql() { return "INSERT INTO `Int10`(`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`i`,`j`)" + " VALUES (?,?,?,?,?,?,?,?,?,?)"; } @Override public Object[] createItem(int id) { return new Object[] { id, id + 1, id + 2, id + 3, id + 4, id + 5, id + 6, id + 7, id + 8, id + 9, }; } @Override public String readSql() { return "SELECT * from Int10"; } @Override public CursorReader createReader(final Cursor cursor) { final int cursorIndexOfA = cursor.getColumnIndexOrThrow("a"); final int cursorIndexOfB = cursor.getColumnIndexOrThrow("b"); final int cursorIndexOfC = cursor.getColumnIndexOrThrow("c"); final int cursorIndexOfD = cursor.getColumnIndexOrThrow("d"); final int cursorIndexOfE = cursor.getColumnIndexOrThrow("e"); final int cursorIndexOfF = cursor.getColumnIndexOrThrow("f"); final int cursorIndexOfG = cursor.getColumnIndexOrThrow("g"); final int cursorIndexOfH = cursor.getColumnIndexOrThrow("h"); final int cursorIndexOfI = cursor.getColumnIndexOrThrow("i"); final int cursorIndexOfJ = cursor.getColumnIndexOrThrow("j"); return () -> { cursor.getInt(cursorIndexOfA); cursor.getInt(cursorIndexOfB); cursor.getInt(cursorIndexOfC); cursor.getInt(cursorIndexOfD); cursor.getInt(cursorIndexOfE); cursor.getInt(cursorIndexOfF); cursor.getInt(cursorIndexOfG); cursor.getInt(cursorIndexOfH); cursor.getInt(cursorIndexOfI); cursor.getInt(cursorIndexOfJ); }; } }; /** * Mock up of 'user' table with various ints/strings */ public static TableHelper USER = new TableHelper() { @Override public String createSql() { return "CREATE TABLE `User` (" + "`mId` INTEGER," + " `mName` TEXT," + " `mLastName` TEXT," + " `mAge` INTEGER," + " `mAdmin` INTEGER," + " `mWeight` DOUBLE," + " `mBirthday` INTEGER," + " `mMoreText` TEXT," + " PRIMARY KEY(`mId`))"; } @Override public String insertSql() { return "INSERT INTO `User`(`mId`,`mName`,`mLastName`,`mAge`," + "`mAdmin`,`mWeight`,`mBirthday`,`mMoreText`) VALUES (?,?,?,?,?,?,?,?)"; } @Override public Object[] createItem(int id) { return new Object[] { id, UUID.randomUUID().toString(), UUID.randomUUID().toString(), (int) (10 + Math.random() * 50), 0, (float)0, new Date().getTime(), UUID.randomUUID().toString(), }; } @Override public String readSql() { return "SELECT * from User"; } @Override public CursorReader createReader(final Cursor cursor) { final int cursorIndexOfMId = cursor.getColumnIndexOrThrow("mId"); final int cursorIndexOfMName = cursor.getColumnIndexOrThrow("mName"); final int cursorIndexOfMLastName = cursor.getColumnIndexOrThrow("mLastName"); final int cursorIndexOfMAge = cursor.getColumnIndexOrThrow("mAge"); final int cursorIndexOfMAdmin = cursor.getColumnIndexOrThrow("mAdmin"); final int cursorIndexOfMWeight = cursor.getColumnIndexOrThrow("mWeight"); final int cursorIndexOfMBirthday = cursor.getColumnIndexOrThrow("mBirthday"); final int cursorIndexOfMMoreTextField = cursor.getColumnIndexOrThrow("mMoreText"); return () -> { cursor.getInt(cursorIndexOfMId); cursor.getString(cursorIndexOfMName); cursor.getString(cursorIndexOfMLastName); cursor.getInt(cursorIndexOfMAge); cursor.getInt(cursorIndexOfMAdmin); cursor.getFloat(cursorIndexOfMWeight); if (!cursor.isNull(cursorIndexOfMBirthday)) { cursor.getLong(cursorIndexOfMBirthday); } cursor.getString(cursorIndexOfMMoreTextField); }; } }; public static TableHelper[] TABLE_HELPERS = new TableHelper[] { INT_1, INT_10, USER, }; }