in src/internal/Router.ts [363:396]
async _determineNodeId(cacheAffinityMap: CacheAffinityMap, key: object, keyType: PRIMITIVE_TYPE | CompositeType): Promise<number[] | null> {
const partitionMap: Map<number, number[]> = cacheAffinityMap.partitionMapping;
if (partitionMap.size == 0) {
return null;
}
const keyAffinityMap = cacheAffinityMap.keyConfig;
const affinityKeyInfo = await this._affinityKeyInfo(key, keyType);
let affinityKey = affinityKeyInfo.key;
let affinityKeyTypeCode = affinityKeyInfo.typeCode;
if ('typeId' in affinityKeyInfo && keyAffinityMap.has(affinityKeyInfo.typeId)) {
const affinityKeyTypeId = keyAffinityMap.get(affinityKeyInfo.typeId);
if (affinityKey instanceof BinaryObject &&
((<BinaryObject>affinityKey).fields.has(affinityKeyTypeId))) {
const field = affinityKey.fields.get(affinityKeyTypeId);
affinityKey = await field.getValue();
affinityKeyTypeCode = field.typeCode;
}
}
const keyHash = await BinaryUtils.hashCode(affinityKey, this._communicator, affinityKeyTypeCode);
const partition = RendezvousAffinityFunction.calcPartition(keyHash, partitionMap.size);
Logger.logDebug('Partition = ' + partition);
const nodeId: number[] = partitionMap.get(partition);
Logger.logDebug('Node ID = ' + nodeId);
return nodeId;
}