示例#1
0
        public JoinReader(IReference reference)
        {
            IReferenceMetadata metadata = reference.List ?? reference.Find(ReferenceFlags.Child).Metadata;

            this.Metadata = metadata.Identity.Require <IBindingMetadata>();
            this.Identity = this.Metadata.Identity;
        }
        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);
        }
示例#3
0
        private void AddNullKeys(IEnumerable <MetadataNode> itemNodes)
        {
            foreach (MetadataNode itemNode in itemNodes)
            {
                foreach (MetadataNode node in itemNode.Tree())
                {
                    IReferenceMetadata metadata = node.GetMetadata <IReferenceMetadata>();
                    IEnumerable <IReferenceMetadata> properties = metadata?.Properties.Where(m => m.HasFlag(ReferenceMetadataFlags.PrimaryKey)) ?? Array.Empty <IReferenceMetadata>();

                    IList <MetadataNode> keyValues = properties.Select(m => itemNode.FindNode(m)).NotNull().ToList();

                    if (keyValues.Any())
                    {
                        node.NullKey = new KeyNode()
                        {
                            Value = keyValues,
                        };

                        foreach (MetadataNode keyValue in keyValues)
                        {
                            keyValue.Flags |= NodeFlags.Key;
                        }
                    }
                }
            }
        }
示例#4
0
        private IEnumerable <IReference> GetValidReferences(IBindingMetadata metadata)
        {
            IReferenceMetadata referenceMetadata = metadata.Identity.Lookup <IReferenceMetadata>();

            if (referenceMetadata != null)
            {
                return(referenceMetadata.References.Where(IsValid).OrderBy(r => r.Priority));
            }

            return(Array.Empty <IReference>());

            bool IsValid(IReference reference)
            {
                if (!reference.HasFlag(ReferenceFlags.Many) && !reference.Other.HasFlag(ReferenceFlags.Many))
                {
                    return(false);
                }

                IBindingMetadata metadata = reference.Find(ReferenceFlags.Child).Metadata.Identity.Lookup <IBindingMetadata>();

                if (this.QueryType == QueryType.Aggregate && this.IsAggregateList(metadata))
                {
                    return(false);
                }

                return(true);
            }
        }
示例#5
0
        private bool HasJoinKeyOverride(NewReader reader, KeyReader joinKey)
        {
            IReference         childReference = joinKey.Reference.Find(ReferenceFlags.Child);
            IReferenceMetadata targetMetadata = childReference.List ?? childReference.Metadata;

            return(reader.Properties.Any(r => r.Metadata.Identity.Equals(targetMetadata.Identity)));
        }
示例#6
0
        private static bool HasValidReference(IBindingMetadata metadata)
        {
            IReferenceMetadata referenceMetadata = metadata.Identity.Lookup <IReferenceMetadata>();

            if (referenceMetadata != null)
            {
                IEnumerable <IReference> childReferences = referenceMetadata.References.Where(r => r.HasFlag(ReferenceFlags.Child));

                return(childReferences.Any(r => r.HasFlag(ReferenceFlags.Many) || r.Other.HasFlag(ReferenceFlags.Many)));
            }

            return(false);
        }
示例#7
0
        private IReference GetRecursiveReference(IReference reference)
        {
            IReferenceMetadata metadata = reference.Metadata;

            foreach (IReference otherReference in metadata.References.Where(r => r.HasFlag(ReferenceFlags.Child) && !r.HasFlag(ReferenceFlags.Self)))
            {
                if (reference.Other.Key.Equals(otherReference.Key) || reference.Key.Equals(otherReference.Key))
                {
                    return(otherReference);
                }
            }

            return(null);
        }
示例#8
0
        private void AddPrimaryKey(NewReader binder)
        {
            IReferenceMetadata          metadata    = binder.Metadata.Identity.Lookup <IReferenceMetadata>();
            IEnumerable <IReferenceKey> primaryKeys = metadata?.Keys.Where(k => k.HasFlag(ReferenceKeyFlags.Primary)).ToList();
            IEnumerable <KeyReader>     keys        = primaryKeys?.Select(k => this.FindPrimaryKey(binder, k)).ToList();

            binder.PrimaryKey = keys?.NotNull().FirstOrDefault();

            if (binder.PrimaryKey != null)
            {
                foreach (DataReader valueReader in binder.PrimaryKey.Values)
                {
                    valueReader.CanBeDbNull = false;
                }
            }
        }
示例#9
0
        private IEnumerable <KeyNode> GetChildKeys(MetadataNode itemNode)
        {
            IList <MetadataNode> allNodes = itemNode.Tree().ToList();

            IReferenceMetadata       metadata   = itemNode.GetMetadata <IReferenceMetadata>();
            IEnumerable <IReference> references = metadata?.References.Where(r => r.HasFlag(ReferenceFlags.Child)) ?? Array.Empty <IReference>();

            foreach (IReference reference in references.Where(this.IsValidJoinReference))
            {
                KeyNode childKey = this.CreateKey(allNodes, reference);

                if (childKey != null)
                {
                    yield return(childKey);
                }
            }
        }
示例#10
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);
        }
示例#11
0
 public static bool HasAnyFlag(this IReferenceMetadata metadata, RelationMetadataFlags flag) => metadata.Relation.HasAnyFlag(flag);
示例#12
0
 public static bool HasAnyFlag(this IReferenceMetadata metadata, ReferenceMetadataFlags flag) => (metadata.Flags & flag) != ReferenceMetadataFlags.None;
示例#13
0
 public static bool HasFlag(this IReferenceMetadata metadata, ReferenceMetadataFlags flag) => (metadata.Flags & flag) == flag;
示例#14
0
 public bool Equals(IReferenceMetadata other) => Equality.Combine(this.Identity, other?.Identity);
示例#15
0
 public NewReader(IReferenceMetadata metadata)
     : this(metadata.Identity.Require <IBindingMetadata>())
 {
 }