KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > h2 > test > db > TestMultiDimension


1 /*
2  * Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
3  * Initial Developer: H2 Group
4  */

5 package org.h2.test.db;
6
7 import java.sql.Connection JavaDoc;
8 import java.sql.PreparedStatement JavaDoc;
9 import java.sql.ResultSet JavaDoc;
10 import java.sql.Statement JavaDoc;
11 import java.util.Random JavaDoc;
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 JavaDoc {
19         Random JavaDoc rand = new Random JavaDoc(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 JavaDoc conn;
31         conn = getConnection("multiDimension");
32         Statement JavaDoc 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 JavaDoc prep = conn.prepareStatement("INSERT INTO TEST(X, Y, Z, DATA) VALUES(?, ?, ?, ?)");
38         
39         // a reasonable value to see the performance difference is 60
40
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 JavaDoc 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 JavaDoc query1 = MultiDimension.getInstance().getMultiDimensionalQuery(
71                         "TEST", "XYZ",
72                         new String JavaDoc[]{"X", "Y", "Z"},
73                         new int[]{minX, minY, minZ},
74                         new int[]{minX+size, minY+size, minZ+size});
75             ResultSet JavaDoc rs1 = conn.createStatement().executeQuery(query1 + " ORDER BY X, Y, Z");
76             time1 = System.currentTimeMillis() - time1;
77             
78             long time2 = System.currentTimeMillis();
79             String JavaDoc 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 JavaDoc prep2 = conn.prepareStatement(query2 + " ORDER BY X, Y, Z");
85             ResultSet JavaDoc 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