/// <returns>null if eval invalid type</returns> private static int?Calculate(object eval, PartitionUtil partitionUtil, int keyType, int hashSliceStart, int hashSliceEnd) { if (eval == ExpressionConstants.Unevaluatable || eval == null) { return(null); } switch (keyType) { case PartitionKeyTypeLong: { long longVal; if (eval is Number) { longVal = (long)(Number)eval; } else if (eval is string) { longVal = long.Parse((string)eval); } else { throw new ArgumentException("unsupported data type for partition key: " + eval.GetType()); } return(partitionUtil.Partition(longVal)); } case PartitionKeyTypeString: { var key = eval.ToString(); var start = hashSliceStart >= 0 ? hashSliceStart : key.Length + hashSliceStart; var end = hashSliceEnd > 0 ? hashSliceEnd : key.Length + hashSliceEnd; var hash = StringUtil.Hash(key, start, end); return(partitionUtil.Partition(hash)); } default: { throw new ArgumentException("unsupported partition key type: " + keyType); } } }
protected internal virtual int PartitionIndex(long hash) { return(PartitionUtil.Partition(hash)); }