private ProjectionMetadataFlags GetFlags(ProjectionMetadata metadata)
        {
            IdAttribute  id   = metadata.Relation.Annotations?.OfType <IdAttribute>().FirstOrDefault();
            OutAttribute out0 = metadata.Relation.Annotations?.OfType <OutAttribute>().FirstOrDefault();
            InAttribute  in0  = metadata.Relation.Annotations?.OfType <InAttribute>().FirstOrDefault();

            IReferenceMetadata      reference = metadata.Identity.GetMetadata <IReferenceMetadata>();
            ProjectionMetadataFlags flags     = ProjectionMetadataFlags.None;

            if (id != null)
            {
                flags |= ProjectionMetadataFlags.Identity;
            }

            if (in0 != null || out0 != null)
            {
                flags |= in0 != null ? ProjectionMetadataFlags.Input : ProjectionMetadataFlags.None;
                flags |= out0 != null ? ProjectionMetadataFlags.Output : ProjectionMetadataFlags.None;
            }
            else if (id != null)
            {
                flags |= ProjectionMetadataFlags.Output;
            }
            else if (reference != null && reference.HasAnyFlag(ReferenceMetadataFlags.Key))
            {
                flags |= ProjectionMetadataFlags.Input | ProjectionMetadataFlags.Output;
            }
            else
            {
                flags |= ProjectionMetadataFlags.Input;
            }

            return(flags);
        }
        private ProjectionMetadata CreateAndAddMetadata(IMetadataBuilderContext context, IRelationMetadata relation)
        {
            ProjectionMetadata metadata = this.CreateBaseMetadata(context, relation);

            context.AddMetadata <IProjectionMetadata>(metadata);

            return(metadata);
        }
        private ProjectionMetadata CreateBaseMetadata(IMetadataBuilderContext context, IRelationMetadata relation)
        {
            ProjectionMetadata metadata = new ProjectionMetadata(relation);

            metadata.Properties = this.CreateLazy(() => this.CreateProperties(context, metadata));
            metadata.Item       = this.CreateItem(context, metadata);
            metadata.Flags      = this.GetFlags(metadata);

            return(metadata);
        }
Exemple #4
0
        private void CreateTableMetadata(ProjectionMetadata metadata)
        {
            ITableMetadata table = metadata.Identity.Lookup <ITableMetadata>();

            if (table != null)
            {
                metadata.Table  = table.HasFlag(TableMetadataFlags.Table) ? table : table.Owner;
                metadata.Column = table.HasFlag(TableMetadataFlags.Column) ? table : null;
            }
        }
Exemple #5
0
        private ProjectionMetadata CreateItem(IMetadataBuilderContext context, ProjectionMetadata parent)
        {
            if (parent.Relation.Item != null)
            {
                ProjectionMetadata metadata = this.GetMetadata(context, parent.Relation.Item, parent);

                metadata.List = parent;

                return(metadata);
            }

            return(null);
        }
        private ProjectionMetadata CreateItem(IMetadataBuilderContext context, ProjectionMetadata parent)
        {
            if (parent.Relation.Item != null)
            {
                ProjectionMetadata metadata = this.CreateBaseMetadata(context, parent.Relation.Item);

                metadata.List = parent;

                context.AddMetadata <IProjectionMetadata>(metadata);

                return(metadata);
            }

            return(null);
        }
Exemple #7
0
        private ProjectionMetadata GetMetadata(IMetadataBuilderContext context, IRelationMetadata relation, IProjectionMetadata parent)
        {
            ProjectionMetadata metadata = new ProjectionMetadata(relation);

            context.AddMetadata <IProjectionMetadata>(metadata);

            metadata.Properties = this.CreateLazy(() => this.CreateProperties(context, metadata));
            metadata.Item       = this.CreateItem(context, metadata);
            metadata.Flags      = this.GetFlags(metadata);

            this.CreateTableMetadata(metadata);
            this.CreateInputMetadata(context, metadata, parent);

            return(metadata);
        }
Exemple #8
0
        private void CreateInputMetadata(IMetadataBuilderContext context, ProjectionMetadata metadata, IProjectionMetadata parent)
        {
            if (parent?.Reference != null)
            {
                IEnumerable <IReference> references = parent.Reference.References.Where(r => r.HasFlag(ReferenceFlags.Foreign) && !r.HasFlag(ReferenceFlags.Self));

                foreach (IReference reference in references.OrderBy(r => r.Priority))
                {
                    int valueIndex = reference.Key.Properties.IndexOf(m => m.Identity.Equals(metadata.Identity));

                    if (valueIndex > -1 && !reference.Other.Metadata.Relation.HasFlag(RelationMetadataFlags.Recursive))
                    {
                        IReferenceMetadata valueMetadata = reference.Other.Key.Properties[valueIndex];

                        metadata.Input  = new Lazy <IProjectionMetadata>(() => this.GetMetadata(context, valueMetadata.Relation));
                        metadata.Flags |= ProjectionMetadataFlags.Cascade;

                        return;
                    }
                }
            }

            metadata.Input = new Lazy <IProjectionMetadata>(() => metadata);
        }
 private IEnumerable <ProjectionMetadata> CreateProperties(IMetadataBuilderContext context, ProjectionMetadata parent)
 {
     foreach (IRelationMetadata property in parent.Relation.Properties)
     {
         yield return(this.CreateAndAddMetadata(context, property));
     }
 }