package org.araqne.logdb;
import java.util.Collections;
import java.util.Map;
public class MemLookupHandler implements LookupHandler2 {
private String keyField;
private Map<String, Map<String, Object>> mappings;
public MemLookupHandler(String keyField, Map<String, Map<String, Object>> mappings) {
this.keyField = keyField;
this.mappings = mappings;
}
public String getKeyField() {
return keyField;
}
public Map<String, Map<String, Object>> getMappings() {
return Collections.unmodifiableMap(mappings);
}
@Override
public Object lookup(String srcField, String dstField, Object value) {
Map<String, Object> row = mappings.get(value);
if (row == null)
return null;
return row.get(dstField);
}
@Override
public LookupTable newTable(String keyField, Map<String, String> outputFields) {
return new MemLookupTable(keyField, outputFields);
}
private class MemLookupTable implements LookupTable {
private String keyField;
private Map<String, String> outputFields;
public MemLookupTable(String keyField, Map<String, String> outputFields) {
this.keyField = keyField;
this.outputFields = outputFields;
}
@Override
public void lookup(Row row) {
lookupRow(row);
}
@Override
public void lookup(RowBatch rowBatch) {
if (rowBatch.selectedInUse) {
for (int i = 0; i < rowBatch.size; i++) {
int p = rowBatch.selected[i];
Row row = rowBatch.rows[p];
lookupRow(row);
}
} else {
for (int i = 0; i < rowBatch.size; i++) {
Row row = rowBatch.rows[i];
lookupRow(row);
}
}
}
private void lookupRow(Row row) {
Object key = row.get(keyField);
if (key == null)
return;
Map<String, Object> m = mappings.get(key);
if (m == null)
return;
for (String name : outputFields.keySet()) {
String renamed = outputFields.get(name);
row.put(renamed, m.get(name));
}
}
}
}