示例#1
0
 /// <summary>
 /// Recupera a chave simples que representa o registro.
 /// </summary>
 /// <param name="record">Instancia do registro.</param>
 /// <returns></returns>
 public string GetSimpleKey(Query.IRecord record)
 {
     if (record != null)
     {
         return(record.GetHashCode().ToString());
     }
     return(string.Empty);
 }
示例#2
0
            /// <summary>
            /// Método usado para notificar que o registro foi alterado.
            /// </summary>
            /// <param name="record"></param>
            public void OnChanged(Query.IRecord record)
            {
                var    bindingStrategy   = _entityDescriptor._entityLoader.GetEntityDescriptorBindStrategy();
                object instance          = _entityDescriptor;
                var    propertiesChanged = bindingStrategy.Bind(record, Query.BindStrategyMode.Differences, ref instance).ToArray();

                _entityDescriptor.RaisePropertyChanged(propertiesChanged);
            }
        /// <summary>
        /// Executa a vinculação dos dados contidos no registro para o objeto informado.
        /// </summary>
        /// <typeparam name="T">Tipo que será usado na operação.</typeparam>
        /// <param name="record">Registro da consulta.</param>
        /// <param name="mode">Modo da estratégia.</param>
        /// <param name="instance">Instancia onde será vinculado os dados.</param>
        /// <returns>Relação das propriedade na qual o bind foi aplicado.</returns>
        public IEnumerable <string> Bind <T>(Query.IRecord record, Query.BindStrategyMode mode, ref T instance)
        {
            record.Require("record").NotNull();
            object instance2        = instance;
            var    recordKeyFactory = _entityLoader.GetRecordKeyFactory();
            var    result           = Bind(record, mode, recordKeyFactory, ref instance2);

            instance = (T)instance2;
            return(result);
        }
 /// <summary>
 /// Avalia se o registro contém dados associados
 /// com a lista dos filhos..
 /// </summary>
 /// <param name="record"></param>
 /// <param name="parent">Instancia do pai.</param>
 /// <returns></returns>
 public override bool Evaluate(Query.IRecord record, IEntity parent)
 {
     if (record.Descriptor.Contains(this.ForeignPropertyName) && this.ParentUidGetter != null)
     {
         var parentUid   = this.ParentUidGetter(((TParentEntity)parent).DataModel);
         var recordValue = record.GetInt32(this.ForeignPropertyName);
         return(parentUid == recordValue);
     }
     return(false);
 }
            /// <summary>
            /// Verifica se o registor é compatível com o observer.
            /// </summary>
            /// <param name="record"></param>
            /// <returns></returns>
            public override bool Evaluate(Query.IRecord record)
            {
                if (!IsAlive)
                {
                    return(false);
                }
                var entity = Collection as IEntity;

                if (entity != null && entity.Owner != null)
                {
                    return(_childInfo.Evaluate(record, entity.Owner));
                }
                return(false);
            }
示例#6
0
        /// <summary>
        /// Vincula os dados adicionais.
        /// </summary>
        /// <param name="record"></param>
        /// <param name="mode"></param>
        /// <returns></returns>
        public virtual IEnumerable <string> Bind(Query.IRecord record, Query.BindStrategyMode mode)
        {
            IEnumerable <string> fields = new string[0];

            if (_entityLoader != null)
            {
                if (_entityLoader.FindNameProperties != null)
                {
                    fields = fields.Concat(_entityLoader.FindNameProperties);
                }
                if (!string.IsNullOrEmpty(_entityLoader.DescriptionPropertyName))
                {
                    fields = fields.Concat(new string[] {
                        _entityLoader.DescriptionPropertyName
                    });
                }
                if (!string.IsNullOrEmpty(_entityLoader.UidPropertyName))
                {
                    fields = fields.Concat(new string[] {
                        _entityLoader.UidPropertyName
                    });
                }
                if (typeof(Data.BaseTraceableModel).IsAssignableFrom(_entityLoader.DataModelType))
                {
                    fields = fields.Concat(new string[] {
                        "ActivatedDate",
                        "ExpiredDate"
                    });
                }
            }
            foreach (var field in fields)
            {
                if (record.Descriptor.Contains(field))
                {
                    var index = record.Descriptor.GetFieldPosition(field);
                    if (index >= 0)
                    {
                        Update(field, record.GetValue(index));
                    }
                }
            }
            return(new string[0]);
        }
示例#7
0
        /// <summary>
        /// Cria uma chave para o registro.
        /// </summary>
        /// <param name="typeName">Nome do tipo que representa os dados contidos no registro.</param>
        /// <param name="record">Instancia do registro com os dados.</param>
        /// <returns>Chave que representa o registro.</returns>
        public Query.RecordKey Create(Reflection.TypeName typeName, Query.IRecord record)
        {
            typeName.Require("typeName").NotNull();
            var  generator  = CreateGenerator(typeName);
            var  key        = generator.GetSimpleKey(record);
            long rowVersion = 0;
            var  index      = 0;

            for (; index < record.Descriptor.Count; index++)
            {
                if (StringComparer.InvariantCultureIgnoreCase.Equals(record.Descriptor[index].Name, "RowVersion"))
                {
                    break;
                }
            }
            if (index < record.Descriptor.Count)
            {
                rowVersion = (long)record.GetInt64(index);
            }
            return(new Query.RecordKey(key, rowVersion));
        }
示例#8
0
            /// <summary>
            /// Recupera a chave simples que representa o registro.
            /// </summary>
            /// <param name="record">Instancia do registro.</param>
            /// <returns></returns>
            public string GetSimpleKey(Query.IRecord record)
            {
                record.Require("record").NotNull();
                record.Descriptor.Require("record.Descriptor").NotNull();
                var values = new string[_fieldNames.Length];

                for (var i = 0; i < values.Length; i++)
                {
                    var indexOf = 0;
                    for (; indexOf < record.Descriptor.Count; indexOf++)
                    {
                        if (StringComparer.InvariantCultureIgnoreCase.Equals(record.Descriptor[indexOf].Name, _fieldNames[i]))
                        {
                            var value = record.GetValue(indexOf);
                            if (value != null)
                            {
                                values[i] = value.ToString();
                            }
                            break;
                        }
                    }
                }
                return(string.Join("|", values));
            }
示例#9
0
 /// <summary>
 /// Avalia se o registro contém dados associados
 /// com a lista dos filhos..
 /// </summary>
 /// <param name="record"></param>
 /// <param name="parent">Instancia do pai.</param>
 /// <returns></returns>
 public override bool Evaluate(Query.IRecord record, IEntity parent)
 {
     return(false);
 }
        /// <summary>
        /// Realiza os bind dos dados do registro informado.
        /// </summary>
        /// <param name="record">Registro contendo os dados.</param>
        /// <param name="mode"></param>
        /// <param name="recordKeyFactory">Factory responsável pela geração da chave do registro.</param>
        /// <param name="instance"></param>
        /// <returns></returns>
        private IEnumerable <string> Bind(Query.IRecord record, Query.BindStrategyMode mode, Query.IRecordKeyFactory recordKeyFactory, ref object instance)
        {
            record.Require("record").NotNull();
            var descriptor = instance as IEntityDescriptor;

            if (descriptor == null)
            {
                return(new string[0]);
            }
            var    idFieldIndex          = record.Descriptor.GetFieldPosition(_entityLoader.UidPropertyName);
            var    descriptionFieldIndex = record.Descriptor.GetFieldPosition(_entityLoader.DescriptionPropertyName);
            string nameFieldValue        = string.Empty;

            if (_entityLoader.FindNameProperties.Count() > 1)
            {
                var info = Merge(_entityLoader.FindNameProperties, descriptor, record).ToArray();
                if (info.Length == 0 && mode == Query.BindStrategyMode.Differences)
                {
                    nameFieldValue = descriptor.Name;
                }
                else
                {
                    nameFieldValue = _entityLoader.FindNameConverter.Convert(info);
                }
            }
            else
            {
                var nameFieldIndex = record.Descriptor.GetFieldPosition(_entityLoader.FindNameProperties.FirstOrDefault());
                if (nameFieldIndex >= 0)
                {
                    nameFieldValue = record[nameFieldIndex];
                }
                else if (mode == Query.BindStrategyMode.Differences)
                {
                    nameFieldValue = descriptor.Name;
                }
            }
            descriptor.Id          = idFieldIndex >= 0 ? record[idFieldIndex] : mode == Query.BindStrategyMode.Differences ? descriptor.Id : 0;
            descriptor.Name        = nameFieldValue;
            descriptor.Description = descriptionFieldIndex >= 0 ? record[descriptionFieldIndex] : mode == Query.BindStrategyMode.Differences ? descriptor.Description : string.Empty;
            if (record.Descriptor.Contains("ActivatedDate") && record.Descriptor.Contains("ExpiredDate"))
            {
                DateTimeOffset activatedDate = record["ActivatedDate"];
                DateTimeOffset?expiredDate   = record["ExpiredDate"];
                var            isActive      = activatedDate < ServerData.GetDateTimeOffSet() && !(expiredDate.HasValue && (ServerData.GetDateTimeOffSet() > expiredDate));
                var            isExpired     = expiredDate.HasValue && (ServerData.GetDateTimeOffSet() > expiredDate);
                descriptor.ConfigureStatusControl(isActive, isExpired);
            }
            if (descriptor is BusinessEntityDescriptor)
            {
                var businessDescritor = (BusinessEntityDescriptor)descriptor;
                businessDescritor.RecordKey = recordKeyFactory.Create(_entityLoader.DataModelTypeName, record);
            }
            var changedProperties = new List <string> {
                "Id",
                "Name",
                "Description",
                "IsActive",
                "IsExpired"
            };

            if (descriptor is IBindableEntityDescriptor)
            {
                changedProperties = changedProperties.Union(((IBindableEntityDescriptor)descriptor).Bind(record, mode)).ToList();
            }
            return(changedProperties.ToArray());
        }
        /// <summary>
        /// Recupera as informações dos valores de uma lista de propriedades.
        /// </summary>
        /// <param name="properties"></param>
        /// <param name="entityDescriptor"></param>
        /// <param name="record"></param>
        /// <returns></returns>
        private IEnumerable <object> Merge(string[] properties, IEntityDescriptor entityDescriptor, Query.IRecord record)
        {
            var entityDescriptorStateble = entityDescriptor as IEntityDescriptorStateble;

            foreach (var p in properties)
            {
                var index = record.Descriptor.GetFieldPosition(p);
                if (index >= 0)
                {
                    yield return(record.GetValue(record.Descriptor.GetFieldPosition(p)));
                }
                else
                {
                    if (entityDescriptorStateble != null && entityDescriptorStateble.Contains(p))
                    {
                        yield return(entityDescriptorStateble[p]);
                    }
                    else
                    {
                        yield return(null);
                    }
                }
            }
        }
        /// <summary>
        /// Realiza o bind dos dados do registro para a instancia informada.
        /// </summary>
        /// <param name="record">Registro com os dados que serão processados.</param>
        /// <param name="mode">Mode de vinculação.</param>
        /// <param name="instance">Instancia que será preenchida.</param>
        /// <returns></returns>
        public IEnumerable <string> Bind(Query.IRecord record, Query.BindStrategyMode mode, ref object instance)
        {
            var recordKeyFactory = _entityLoader.GetRecordKeyFactory();

            return(Bind(record, mode, recordKeyFactory, ref instance));
        }
 /// <summary>
 /// Avalia se o registro contém dados associados
 /// com a lista dos filhos..
 /// </summary>
 /// <param name="record"></param>
 /// <param name="parent">Instancia do pai.</param>
 /// <returns></returns>
 public abstract bool Evaluate(Query.IRecord record, IEntity parent);
示例#14
0
 /// <summary>
 /// Avalia se o registro pertence a coleção observada.
 /// </summary>
 /// <param name="record"></param>
 /// <returns></returns>
 public override bool Evaluate(Query.IRecord record)
 {
     return(IsAlive);
 }
示例#15
0
 /// <summary>
 /// Recupera a chave com base nos dados do registro informado.
 /// </summary>
 /// <param name="record"></param>
 /// <returns></returns>
 public string GetKey(Query.IRecord record)
 {
     return(string.Format("{0}:{1}", _typeName.FullName, GetSimpleKey(record)));
 }