1 import java.util.ArrayList;
\r
2 import java.util.HashSet;
\r
3 import java.util.Hashtable;
\r
4 import java.util.Set;
\r
6 public class MultiHash {
\r
8 private Hashtable viewTable = new Hashtable();
\r
10 public MultiHash() {
\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
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
32 Set tupleSet = new HashSet();
\r
34 tuplesTable.put(tupleKey, tupleSet);
\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
45 return obj.hashCode()^29;
\r
48 private ArrayList<Integer> findIndices(int viewIndex) {
\r
50 ArrayList<Integer> indices = new ArrayList<Integer>();
\r
51 for(int i = 0; i < 31; i++) {
\r
52 if((mask & viewIndex) != 0) {
\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
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
78 Tuples tuple = new Tuple(o);
\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
90 System.out.println("Cannot find such key");
\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
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
113 public int[] getViews() {
\r
117 public Hashtable getTable() {
\r