Пример #1
0
        /// <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);
            }
            }
        }
Пример #2
0
 protected internal virtual int PartitionIndex(long hash)
 {
     return(PartitionUtil.Partition(hash));
 }