1 5 package org.h2.test.db; 6 7 import java.sql.Connection ; 8 import java.sql.PreparedStatement ; 9 import java.sql.ResultSet ; 10 import java.sql.Statement ; 11 import java.util.Random ; 12 13 import org.h2.test.TestBase; 14 import org.h2.tools.MultiDimension; 15 16 public class TestMultiDimension extends TestBase { 17 18 public void test() throws Exception { 19 Random rand = new Random (10); 20 for(int i=0; i<1000; i++) { 21 int x = rand.nextInt(1000), y = rand.nextInt(1000), z = rand.nextInt(1000); 22 MultiDimension tool = MultiDimension.getInstance(); 23 long xyz = tool.interleave(new int[]{x, y, z}); 24 check(x, tool.deinterleave(xyz, 3, 0)); 25 check(y, tool.deinterleave(xyz, 3, 1)); 26 check(z, tool.deinterleave(xyz, 3, 2)); 27 } 28 29 deleteDb("multiDimension"); 30 Connection conn; 31 conn = getConnection("multiDimension"); 32 Statement stat = conn.createStatement(); 33 stat.execute("CREATE ALIAS MAP FOR \"" + getClass().getName() + ".interleave\""); 34 stat.execute("CREATE TABLE TEST(X INT NOT NULL, Y INT NOT NULL, Z INT NOT NULL, XYZ BIGINT AS MAP(X, Y, Z), DATA VARCHAR)"); 35 stat.execute("CREATE INDEX IDX_X ON TEST(X, Y, Z)"); 36 stat.execute("CREATE INDEX IDX_XYZ ON TEST(XYZ)"); 37 PreparedStatement prep = conn.prepareStatement("INSERT INTO TEST(X, Y, Z, DATA) VALUES(?, ?, ?, ?)"); 38 39 int max = 10; 41 long time = System.currentTimeMillis(); 42 for(int x=0; x<max; x++) { 43 for(int y=0; y<max; y++) { 44 for(int z=0; z<max; z++) { 45 long t2 = System.currentTimeMillis(); 46 if(t2 - time > 1000) { 47 int percent = (int)(100.0 * ((double)x*x*x) / ((double)max * max * max)); 48 trace(percent + "%"); 49 time = t2; 50 try { 51 Thread.sleep(10); 52 } catch(Exception e) {} 53 } 54 prep.setInt(1, x); 55 prep.setInt(2, y); 56 prep.setInt(3, z); 57 prep.setString(4, "Test data"); 58 prep.execute(); 59 } 60 } 61 } 62 for(int i=0; i<50; i++) { 63 int size = rand.nextInt(max / 10); 64 int minX = rand.nextInt(max-size); 65 int minY = rand.nextInt(max-size); 66 int minZ = rand.nextInt(max-size); 67 int maxX = minX+size, maxY = minY+size, maxZ = minZ+size; 68 69 long time1 = System.currentTimeMillis(); 70 String query1 = MultiDimension.getInstance().getMultiDimensionalQuery( 71 "TEST", "XYZ", 72 new String []{"X", "Y", "Z"}, 73 new int[]{minX, minY, minZ}, 74 new int[]{minX+size, minY+size, minZ+size}); 75 ResultSet rs1 = conn.createStatement().executeQuery(query1 + " ORDER BY X, Y, Z"); 76 time1 = System.currentTimeMillis() - time1; 77 78 long time2 = System.currentTimeMillis(); 79 String query2 = "SELECT * FROM TEST WHERE " 80 +"X BETWEEN " + minX + " AND " + maxX + " AND " 81 +"Y BETWEEN " + minY + " AND " + maxY + " AND " 82 +"Z BETWEEN " + minZ + " AND " + maxZ; 83 84 PreparedStatement prep2 = conn.prepareStatement(query2 + " ORDER BY X, Y, Z"); 85 ResultSet rs2 = prep2.executeQuery(); 86 time2 = System.currentTimeMillis() - time2; 87 while(rs1.next()) { 88 check(rs2.next()); 89 check(rs1.getInt(1), rs2.getInt(1)); 90 check(rs1.getInt(2), rs2.getInt(2)); 91 } 92 checkFalse(rs2.next()); 93 trace("t1="+time1+" t2="+time2+" size="+size); 94 } 95 conn.close(); 96 } 97 98 public static long interleave(int x, int y, int z) { 99 return MultiDimension.getInstance().interleave(new int[]{x, y, z}); 100 } 101 } 102 | Popular Tags |