private void addToCache( RowMetaInterface keyMeta, Object[] keyData, RowMetaInterface valueMeta, Object[] valueData) throws KettleValueException { if (meta.isMemoryPreservationActive()) { if (meta.isUsingSortedList()) { KeyValue keyValue = new KeyValue(keyData, valueData); int idx = Collections.binarySearch(data.list, keyValue, data.comparator); if (idx < 0) { int index = -idx - 1; // this is the insertion point data.list.add(index, keyValue); // insert to keep sorted. } else { data.list.set(idx, keyValue); // Overwrite to simulate Hashtable behaviour } } else { if (meta.isUsingIntegerPair()) { if (!data.metadataVerifiedIntegerPair) { data.metadataVerifiedIntegerPair = true; if (keyMeta.size() != 1 || valueMeta.size() != 1 || !keyMeta.getValueMeta(0).isInteger() || !valueMeta.getValueMeta(0).isInteger()) { throw new KettleValueException( BaseMessages.getString( PKG, "StreamLookup.Exception.CanNotUseIntegerPairAlgorithm")); } } Long key = keyMeta.getInteger(keyData, 0); Long value = valueMeta.getInteger(valueData, 0); data.longIndex.put(key, value); } else { if (data.hashIndex == null) { data.hashIndex = new ByteArrayHashIndex(keyMeta); } data.hashIndex.put( RowMeta.extractData(keyMeta, keyData), RowMeta.extractData(valueMeta, valueData)); } } } else { // We can't just put Object[] in the map // The compare function is not in it. // We need to wrap in and use that. // Let's use RowMetaAndData for this one. // data.look.put(new RowMetaAndData(keyMeta, keyData), valueData); } }
private Object[] getFromCache(RowMetaInterface keyMeta, Object[] keyData) throws KettleValueException { if (meta.isMemoryPreservationActive()) { if (meta.isUsingSortedList()) { KeyValue keyValue = new KeyValue(keyData, null); int idx = Collections.binarySearch(data.list, keyValue, data.comparator); if (idx < 0) return null; // nothing found keyValue = (KeyValue) data.list.get(idx); return keyValue.getValue(); } else { if (meta.isUsingIntegerPair()) { Long value = data.longIndex.get(keyMeta.getInteger(keyData, 0)); if (value == null) return null; return new Object[] { value, }; } else { try { byte[] value = data.hashIndex.get(RowMeta.extractData(keyMeta, keyData)); if (value == null) return null; return RowMeta.getRow(data.valueMeta, value); } catch (Exception e) { logError("Oops", e); throw new RuntimeException(e); } } } } else { return (Object[]) data.look.get(new RowMetaAndData(keyMeta, keyData)); } }