switch to spaces only..
[IRC.git] / Robust / src / Util / MultiHash.java
1 import java.util.ArrayList;\r
2 import java.util.HashSet;\r
3 import java.util.Hashtable;\r
4 import java.util.Set;\r
5 \r
6 public class MultiHash {\r
7   private int[]   views;\r
8   private Hashtable viewTable     = new Hashtable();\r
9 \r
10   public MultiHash() {\r
11   }\r
12 \r
13   // Pass in the look up map\r
14   public MultiHash(int[] bitmapArray) {\r
15     this.views      = bitmapArray;\r
16     for(int i = 0; i < views.length; i++) {\r
17       Hashtable ht = new Hashtable();\r
18       viewTable.put(views[i], ht);\r
19     }\r
20   }\r
21 \r
22   // For each view add it to its view hashtable\r
23   public void put(Tuples o) {\r
24     // Tune the Tuple for each view and add it to its designated hashtable\r
25     for(int i = 0; i < views.length; i++) {\r
26       int tupleKey    = generateTupleKey(o, views[i]);\r
27       Hashtable tuplesTable = (Hashtable) viewTable.get(views[i]);\r
28       if(tuplesTable.containsKey(tupleKey)) {\r
29         Set tupleSet = (Set) tuplesTable.get(tupleKey);\r
30         tupleSet.add(o);\r
31       } else {\r
32         Set tupleSet = new HashSet();\r
33         tupleSet.add(o);\r
34         tuplesTable.put(tupleKey, tupleSet);\r
35       }\r
36     }\r
37   }\r
38 \r
39   public int generateTupleKey(Tuples o, int viewIndex) {\r
40     ArrayList<Integer> indices = findIndices(viewIndex);\r
41     ArrayList obj     =       new ArrayList();\r
42     for(int i = 0; i < indices.size(); i++) {\r
43       obj.add(o.get(indices.get(i)));\r
44     }\r
45     return obj.hashCode()^29;\r
46   }\r
47 \r
48   private ArrayList<Integer> findIndices(int viewIndex) {\r
49     int mask = 1;\r
50     ArrayList<Integer> indices = new ArrayList<Integer>();\r
51     for(int i = 0; i < 31; i++) {\r
52       if((mask & viewIndex) != 0) {\r
53         indices.add(i);\r
54       }\r
55       mask = mask << 1;\r
56     }\r
57     return indices;\r
58   }\r
59 \r
60   public Tuples get(int bitmap, Tuple o) {\r
61     Tuples tuple = new Tuple();             //\r
62     int tupleKey    = generateTupleKey(o, bitmap);\r
63     Hashtable tuplesTable = (Hashtable) viewTable.get(bitmap);\r
64     if(tuplesTable.containsKey(tupleKey)) {\r
65       Set tupleSet = (Set) tuplesTable.get(tupleKey);\r
66       tuple = convertToTuple(tupleSet);\r
67       return tuple;\r
68     }\r
69     return null;\r
70   }\r
71 \r
72   private Tuples convertToTuple(Set tupleSet) {\r
73     Object[] tuples = tupleSet.toArray();\r
74     ArrayList o             = new ArrayList();\r
75     for(int i = 0; i < tuples.length; i++) {\r
76       o.add(tuples[i]);\r
77     }\r
78     Tuples tuple            = new Tuple(o);\r
79     return tuple;\r
80   }\r
81 \r
82   public void remove(Tuples o) {\r
83 //              System.out.println("removed called"+viewTable.toString());\r
84     for(int i = 0; i < views.length; i++) {\r
85       int tupleKey    = generateTupleKey(o, views[i]);\r
86       Hashtable tuplesTable = (Hashtable) viewTable.get(views[i]);\r
87       if(tuplesTable.containsKey(tupleKey)) {\r
88         tuplesTable.remove(tupleKey);\r
89       } else {\r
90         System.out.println("Cannot find such key");\r
91       }\r
92     }\r
93   }\r
94 \r
95   public OptimizedView getOptimizedView(int bitMapView) {\r
96     Hashtable tmp = (Hashtable) viewTable.get(bitMapView);\r
97     OptimizedView ov = new OptimizedView(bitMapView, tmp, this);\r
98     return ov;\r
99   }\r
100 \r
101   /* Debug visualizations */\r
102   public void drawTierTwoTable() {\r
103     for(int i = 0; i < views.length; i++) {\r
104       Hashtable tmp = (Hashtable) viewTable.get(views[i]);\r
105       System.out.println("Hashtable "+i+":\t"+tmp.keySet().toString());\r
106       Object[] keySets = tmp.keySet().toArray();\r
107       for(int j = 0; j < keySets.length; j++) {\r
108         System.out.println(tmp.get(keySets[j]));\r
109       }\r
110     }\r
111   }\r
112 \r
113   public int[] getViews() {\r
114     return views;\r
115   }\r
116 \r
117   public Hashtable getTable() {\r
118     return viewTable;\r
119   }\r
120 }\r