public void addElement(int ordinal, int hashCode) { long elementAndHash = (long)ordinal << 32 | (hashCode & 0xFFFFFFFFL); elementsAndHashes.add(elementAndHash); }
public void calculateMatches() { fromIdx = new HollowPrimaryKeyIndex(fromTypeState.getStateEngine(), fromTypeState.getSchema().getName(), matchPaths.toArray(new String[matchPaths.size()])); toIdx = new HollowPrimaryKeyIndex(toTypeState.getStateEngine(), toTypeState.getSchema().getName(), matchPaths.toArray(new String[matchPaths.size()])); BitSet fromPopulatedOrdinals = fromTypeState.getListener(PopulatedOrdinalListener.class).getPopulatedOrdinals(); BitSet fromUnmatchedOrdinals = new BitSet(fromPopulatedOrdinals.length()); fromUnmatchedOrdinals.or(fromPopulatedOrdinals); BitSet toPopulatedOrdinals = toTypeState.getListener(PopulatedOrdinalListener.class).getPopulatedOrdinals(); int candidateToMatchOrdinal = toPopulatedOrdinals.nextSetBit(0); while(candidateToMatchOrdinal != -1) { Object key[] = toIdx.getRecordKey(candidateToMatchOrdinal); int matchedOrdinal = fromIdx.getMatchingOrdinal(key); if(matchedOrdinal != -1) { matchedOrdinals.add(((long)matchedOrdinal << 32) | candidateToMatchOrdinal); fromUnmatchedOrdinals.clear(matchedOrdinal); } else { extraInTo.add(candidateToMatchOrdinal); } candidateToMatchOrdinal = toPopulatedOrdinals.nextSetBit(candidateToMatchOrdinal + 1); } int unmatchedFromOrdinal = fromUnmatchedOrdinals.nextSetBit(0); while(unmatchedFromOrdinal != -1) { extraInFrom.add(unmatchedFromOrdinal); unmatchedFromOrdinal = fromUnmatchedOrdinals.nextSetBit(unmatchedFromOrdinal + 1); } }
private void indexOrdinal(HollowObjectTypeReadState keyTypeState, int ordinal, int[] hashedRecordKeys, int[][] hashedFieldKeys, LongList hashedFieldKeyChains) { int bucketMask = hashedRecordKeys.length - 1; int bucket = hashKeyRecord(keyTypeState, ordinal) & bucketMask; while(hashedRecordKeys[bucket] != -1) bucket = (bucket + 1) & bucketMask; hashedRecordKeys[bucket] = ordinal; indexFields: for(int j=0;j<primaryKey.numFields();j++) { if(keyFieldIsIndexed[j]) { int fieldBucket = HashCodes.hashInt(HollowReadFieldUtils.fieldHashCode(keyTypeState, ordinal, j)) & bucketMask; int chainStartIndex = hashedFieldKeys[j][fieldBucket]; while(chainStartIndex != -1) { int representativeOrdinal = (int)hashedFieldKeyChains.get(chainStartIndex); if(HollowReadFieldUtils.fieldsAreEqual(keyTypeState, ordinal, j, keyTypeState, representativeOrdinal, j)) { hashedFieldKeyChains.add(((long)chainStartIndex << 32) | ordinal); hashedFieldKeys[j][fieldBucket] = hashedFieldKeyChains.size() - 1; break indexFields; } fieldBucket = (fieldBucket + 1) & bucketMask; chainStartIndex = hashedFieldKeys[j][fieldBucket]; } hashedFieldKeyChains.add(((long)Integer.MAX_VALUE << 32) | ordinal); hashedFieldKeys[j][fieldBucket] = hashedFieldKeyChains.size() - 1; } } }
public boolean recordsAreEqual(int ordinal) { int size = fromMapState.size(ordinal); if(toMapState.size(ordinal) != size) return false; fromScratch.clear(); toScratch.clear(); HollowMapEntryOrdinalIterator iter = fromMapState.ordinalIterator(ordinal); while(iter.next()) fromScratch.add((iter.getKey() << 32) | iter.getValue()); iter = toMapState.ordinalIterator(ordinal); while(iter.next()) toScratch.add((iter.getKey() << 32) | iter.getValue()); fromScratch.sort(); toScratch.sort(); return fromScratch.equals(toScratch); } };
while(hashedToOrdinals[bucket] != -1) { if(equalityDeterminer.recordsAreEqual(t, hashedToOrdinals[bucket])) { matchPairResults[threadNumber].add(((long) t << 32) | hashedToOrdinals[bucket]);