package scs.demos.bigtable.servant; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Set; import java.util.Map.Entry; import org.omg.CORBA.Any; import scs.demos.bigtable.AllEntriesHolder; import scs.demos.bigtable.Entries; import scs.demos.bigtable.EntriesHolder; import scs.demos.bigtable.IteratorHolder; import scs.demos.bigtable.KeysHolder; import scs.demos.bigtable.SorterPOA; /** * Armazena o hash com chave e par para cada entrada do big table * Oferece interface para entrada e saida de valores * @author hubert * */ public class SorterServant extends SorterPOA { private BigTableComponent component; private int numReducers; private int currentRequesterReducer = 0; boolean started = false; private HashMap<Integer, Integer> groups; // former int defines char, latter defines the group private HashMap<Any, ArrayList<Any>> rows = null; public SorterServant(BigTableComponent component) { this.component = component; } @Override public void get(Any key, IteratorHolder values) { ArrayList<Any> val = null; Set<Entry<Any,ArrayList<Any>>> keySet = rows.entrySet(); Iterator<Entry<Any,ArrayList<Any>>> it = keySet.iterator(); while (it.hasNext()) { Entry<Any,ArrayList<Any>> currEntry = it.next(); if (currEntry.getKey().extract_string().equals(key.extract_string())) { val = currEntry.getValue(); break; } } if (val != null) values.value = val.toArray(new Any[val.size()]); else values.value = new Any[0]; } @Override public void put(Any key, Any value) { if (key != null && value != null) { boolean added = false; if (rows == null) rows = new HashMap<Any, ArrayList<Any>>(); ArrayList<Any> val = null; Set<Entry<Any,ArrayList<Any>>> keySet = rows.entrySet(); Iterator<Entry<Any,ArrayList<Any>>> it = keySet.iterator(); while (it.hasNext()) { Entry<Any,ArrayList<Any>> currEntry = it.next(); if (currEntry.getKey().extract_string().equals(key.extract_string())) { val = currEntry.getValue(); val.add(value); rows.put(currEntry.getKey(), val); added = true; break; } } if (!added) { val = new ArrayList<Any>(); val.add(value); rows.put(key, val); } } } @Override public void getEntriesOnRange(AllEntriesHolder allEntries) { if (rows != null) { Set<Entry<Any,ArrayList<Any>>> keySet = rows.entrySet(); ArrayList<Entries> entriesArray = new ArrayList<Entries>(); Iterator<Entry<Any,ArrayList<Any>>> it = keySet.iterator(); while (it.hasNext()) { Entry<Any,ArrayList<Any>> entry = it.next(); int j = 0; try { char ch = entry.getKey().extract_string().charAt(0); j = groups.get(new Integer(ch)).intValue(); } catch (Exception e) {j = 0;} if (j == currentRequesterReducer) { Entries element = new Entries(); element.key = entry.getKey(); element.values = entry.getValue().toArray(new Any[entry.getValue().size()]); entriesArray.add(element); } } if (entriesArray != null && entriesArray.size() > 0) { allEntries.value = entriesArray.toArray(new Entries[entriesArray.size()]); } else { allEntries.value = new Entries[0]; } } currentRequesterReducer++; } @Override public void setNumberOfReducers(int numReducers) { this.numReducers = numReducers; String constellation = "abcdefghijklmnopqrstuvwxyz0123456789"; int symbols = constellation.length(); groups = new HashMap<Integer,Integer>(); for (int i = 0; i < constellation.length(); i++) { groups.put(new Integer(constellation.charAt(i)), (symbols / ((i > 0)?i:1) ) % numReducers); } } }