Esempio n. 1
0
        private RedisKey FilterToKey(Filter filter)
        {
            var member = _typeDefinition.IndexedFields.Where(f => f.Name == filter.OperandName).FirstOrDefault();

            if (member == null)
            {
                throw new InvalidFilterExpression($"{filter.OperandName} is not indexed");
            }

            RedisValue value;

            if (member.Type.GetTypeInfo().IsEnum)
            {
                value = _valueConverter.FromObject(Enum.ToObject(member.Type, (int)filter.RightValue), member.Type);
            }
            else
            {
                value = _valueConverter.FromObject(filter.RightValue, member.Type);
            }

            if (filter.Operator == FilterOperator.NotEquals)
            {
                if (member.Type != typeof(bool))
                {
                    throw new InvalidFilterExpression($"The 'Not Equals' operation is only supported on booleans.");
                }

                value = !(bool)value;
            }

            return(_storageKeyGenerator.GetFieldIndexKey(_typeDefinition, member, value));
        }
Esempio n. 2
0
        public List <HashEntry> HashFor <T>(ITypeDefinition <T> definition, T instance, bool isNew, HashEntry[] existingRecord)
        {
            // make a check for indexed fields that are ignored

            var changedList = new List <HashEntry>();

            foreach (var field in definition.AllFields)
            {
                if (isNew && definition.IgnoreOnCreateFields.Any(f => f.Name == field.Name))
                {
                    continue;
                }
                else if (!isNew && definition.IgnoreOnUpdateFields.Any(f => f.Name == field.Name))
                {
                    continue;
                }

                var value      = definition.Accessor[instance, field.Name];
                var redisValue = _redisValueConverter.FromObject(value, field.Type);

                if (definition.RequiredFields.Any(f => f.Name == field.Name) && !redisValue.HasValue)
                {
                    throw new FieldRequiredException(field);
                }

                if (definition.IndexedFields.Contains(field) || redisValue != existingRecord.FirstOrDefault(h => h.Name == field.Name).Value)
                {
                    changedList.Add(new HashEntry(definition.GetHashName(field), redisValue));
                }
            }

            return(changedList);
        }