public void dispose(StepMetaInterface smi, StepDataInterface sdi) { // Recover memory immediately, allow in-memory data to be garbage collected // data.look = null; data.list = null; data.hashIndex = null; data.longIndex = null; super.dispose(smi, sdi); }
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); } }