예제 #1
0
 private static void ProcessReference(MappingSet set, Reference reference)
 {
     // Figure out what type of reference it is, process each type differently.
     if (Cardinality.IsOneToMany(reference.Cardinality1, reference.Cardinality2))
     {
         ProcessOneToManyReference(set, reference);
     }
     else if (Cardinality.IsOneToOne(reference.Cardinality1, reference.Cardinality2))
     {
         ProcessOneToOneReference(set, reference);
     }
     else if (Cardinality.IsManyToMany(reference.Cardinality1, reference.Cardinality2))
     {
         ProcessManyToManyReference(set, reference);
     }
 }
예제 #2
0
        private void BuildCardinalityAndConformance(StringBuilder sb)
        {
            if (_cardinality != null)
            {
                string op = "=";

                if (_cardinality.Right != Cardinality.MANY)
                {
                    var rhs = _cardinality.Right;
                    if ((_cardinality.Left == 0) && (!_cardinality.IsZeroToZero()))
                    {
                        op = " < ";
                        rhs++; //right-hand side (rhs) needs to be increment b/c we are doing a "less than", e.g. less than 2 is 0 and 1, however _cardinality.Right will be 1
                    }
                    else if (_cardinality.IsZeroToZero())
                    {
                        op  = "=";
                        rhs = 0;
                    }

                    if ((_attribute != null) && (_attribute.GetNumberOfValuesDefined() <= 1)) //1 to 1, or 0 to 1, on an attribute, just give the name, no need for count. if an attribute has more than one value then it'll be prepended with current()
                    {
                        //cardinality on attribute could only be 0..0, 0..1, or 1..1
                        if (_cardinality.Right == 1)
                        {
                            if (_cardinality.Left == 0)  //0..1
                            {
                                if (_attribute != null && _hasOptionalParentContext)
                                {
                                    if ((_conformance == Conformance.SHOULD) || (_conformance == Conformance.MAY))
                                    {
                                        sb.AppendFormat("not({0}{1}{2}{3}{4}) or {0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN,
                                                        Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN);
                                    }
                                    else
                                    {
                                        sb.AppendFormat("{0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN,
                                                        Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN);
                                    }
                                }
                                else
                                {
                                    sb.AppendFormat("not({0}{1}{5}) or {0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN,
                                                    Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN, Sentinels.ATTRIBUTE_IMMUTABLE_TOKEN);
                                }
                            }
                            else //1..1
                            {
                                sb.AppendFormat("{0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN,
                                                Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN);
                            }
                        }
                        else if (_cardinality.IsZeroToZero()) //0..0
                        {
                            sb.AppendFormat("not({0}{1}{2}{3}{4})", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN,
                                            Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN);
                        }
                        else  //unexpected cardinality, but database could have it as a bad value so output valid xpath
                        {
                            sb.AppendFormat("{0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN,
                                            Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN);
                        }
                    }
                    else
                    {
                        if (_cardinality.IsOneToOne() || (_cardinality.Left == 0))
                        {
                            if (_outputPathOnly)
                            {
                                sb.AppendFormat("{0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN,
                                                Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN);
                            }
                            else
                            {
                                sb.AppendFormat("count({0}{1}{2}{3}{4}){5}{6}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN,
                                                Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN, op, rhs);
                            }
                        }
                        else
                        {
                            if (_outputPathOnly)
                            {
                                sb.AppendFormat("{0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN,
                                                Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN);
                            }
                            else
                            {
                                sb.AppendFormat("count({0}{1}{2}{3}{4})[. >= {5}] <= {6}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN,
                                                Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN, _cardinality.Left, _cardinality.Right);
                            }
                        }
                    }
                }
                else
                {
                    if (_cardinality.IsZeroToMany())
                    {
                        if (_isBranchRoot)
                        {
                            sb.AppendFormat("not({0}{1}{2}{3}{4}) or {0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN,
                                            Sentinels.ATTRIBUTE_TOKEN, Sentinels.VALUESET_TOKEN, Sentinels.CHILDELEMENT_TOKEN);
                        }
                        else
                        {
                            sb.AppendFormat("not({0}{1}) or {0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN,
                                            Sentinels.ATTRIBUTE_TOKEN, Sentinels.VALUESET_TOKEN, Sentinels.CHILDELEMENT_TOKEN);
                        }
                    }
                    else
                    {
                        if (_cardinality.IsOneToMany())
                        {
                            if (_outputPathOnly)
                            {
                                sb.AppendFormat("{0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN);
                            }
                            else
                            {
                                sb.AppendFormat("count({0}{1}{2}{3}{4}) > 0", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN, Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN);
                            }
                        }
                        else
                        {
                            if (_outputPathOnly)
                            {
                                sb.AppendFormat("{0}{1}{2}{3}{4}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN,
                                                Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN);
                            }
                            else
                            {
                                sb.AppendFormat("count({0}{1}{2}{3}{4}){5}", Sentinels.CONTEXT_TOKEN, Sentinels.ELEMENT_TOKEN, Sentinels.ATTRIBUTE_TOKEN,
                                                Sentinels.CHILDELEMENT_TOKEN, Sentinels.VALUESET_TOKEN, op);
                            }
                        }
                    }
                }

                if (((_conformance == Conformance.SHALL_NOT) ||
                     (_conformance == Conformance.SHOULD_NOT) ||
                     (_conformance == Conformance.MAY_NOT)) && (!_cardinality.IsZeroToMany()) && (!_cardinality.IsZeroToZero()))
                {
                    sb.Insert(0, "not(");
                    sb.Append(")");
                }
            }
        }
        /// <summary>
        /// Gets possible association tables between this entity and the supplied entity.
        /// </summary>
        /// <param name="entity1"></param>
        /// <param name="secondEntity"></param>
        /// <param name="CardinalityPrimary"></param>
        /// <param name="CardinalityForeign"></param>
        /// <returns></returns>
        public static ITable GetAssociationTable(this Entity entity1, Entity secondEntity, out Cardinality CardinalityPrimary, out Cardinality CardinalityForeign, out IKey mainKey, out IKey associationKey)
        {
            CardinalityPrimary = null;
            CardinalityForeign = null;
            mainKey            = null;
            associationKey     = null;

            ITable associationTable = null;

            foreach (ITable table in entity1.GetMappingSet().Database.AssociationTables())
            {
                //ITable primaryTable = table.Relationships.FirstOrDefault(r => entity1.MappedTables().Contains(r.PrimaryTable));
                bool primaryFound = false;
                bool foreignFound = false;

                #region Primary
                foreach (Relationship relationship in table.Relationships)
                {
                    if (entity1.MappedTables().Contains(relationship.PrimaryTable))
                    {
                        associationTable   = table;
                        CardinalityPrimary = relationship.ForeignKey.IsUnique ? Cardinality.One : Cardinality.Many;                        // relationship.PrimaryCardinality;
                        //CardinalityForeign = relationship.ForeignCardinality;
                        mainKey = relationship.PrimaryKey;
                        //associationKey = relationship.ForeignKey;
                        primaryFound = true;
                        break;
                    }
                    else if (entity1.MappedTables().Contains(relationship.ForeignTable))
                    {
                        associationTable   = table;                                                                 // relationship.ForeignTable;
                        CardinalityPrimary = relationship.PrimaryKey.IsUnique ? Cardinality.One : Cardinality.Many; // relationship.ForeignCardinality;
                        //CardinalityForeign = relationship.PrimaryCardinality;
                        mainKey = relationship.ForeignKey;
                        //associationKey = relationship.PrimaryKey;
                        primaryFound = true;
                        break;
                    }
                }
                #endregion

                #region Foreign
                foreach (Relationship relationship in table.Relationships)
                {
                    if (secondEntity.MappedTables().Contains(relationship.ForeignTable))
                    {
                        associationTable = table;
                        //CardinalityPrimary = relationship.PrimaryCardinality;
                        CardinalityForeign = relationship.PrimaryKey.IsUnique ? Cardinality.One : Cardinality.Many;                        // relationship.ForeignCardinality;
                        //mainKey = relationship.PrimaryKey;
                        associationKey = relationship.ForeignKey;
                        foreignFound   = true;
                        break;
                    }
                    else if (secondEntity.MappedTables().Contains(relationship.PrimaryTable))
                    {
                        //associationTable = table;// relationship.ForeignTable;
                        //CardinalityPrimary = relationship.ForeignCardinality;
                        CardinalityForeign = relationship.ForeignKey.IsUnique ? Cardinality.One : Cardinality.Many;                        // relationship.PrimaryCardinality;
                        //mainKey = relationship.ForeignKey;
                        associationKey = relationship.PrimaryKey;
                        foreignFound   = true;
                        break;
                    }
                }
                #endregion

                if (primaryFound && foreignFound)
                {
                    break;
                }
                else
                {
                    associationTable   = null;
                    CardinalityPrimary = null;
                    CardinalityForeign = null;
                    mainKey            = null;
                    associationKey     = null;
                }

                //                if (entity1.MappedTables().Contains(relationship.PrimaryTable))// &&
                //                //secondEntity.MappedTables().Contains(relationship.ForeignTable))
                //                {
                //                    associationTable = table;// relationship.PrimaryTable;
                //                    CardinalityPrimary = relationship.PrimaryCardinality;
                //                    CardinalityForeign = relationship.ForeignCardinality;
                //                    mainKey = relationship.PrimaryKey;
                //                    associationKey = relationship.ForeignKey;

                //                    if (oneFound)
                //                        break;
                //                    else
                //                        oneFound = true;
                //                }
                //                else if (entity1.MappedTables().Contains(relationship.ForeignTable) &&
                //secondEntity.MappedTables().Contains(relationship.PrimaryTable))
                //                {
                //                    associationTable = table;// relationship.ForeignTable;
                //                    CardinalityPrimary = relationship.ForeignCardinality;
                //                    CardinalityForeign = relationship.PrimaryCardinality;
                //                    mainKey = relationship.ForeignKey;
                //                    associationKey = relationship.PrimaryKey;

                //                    if (oneFound)
                //                        break;
                //                    else
                //                        oneFound = true;
                //                }
                //}
            }
            if (associationTable != null)
            {
                return(associationTable);
            }

            ITable unpureAssociationTable = null;

            if (associationTable == null)
            {
                foreach (ITable table in entity1.MappedTables())
                {
                    foreach (Relationship relationship in table.Relationships)
                    {
                        ITable possibleAssociationTable = null;

                        if (entity1.MappedTables().Contains(relationship.PrimaryTable) &&
                            Cardinality.IsOneToMany(relationship.ForeignCardinality, relationship.PrimaryCardinality))
                        {
                            possibleAssociationTable = relationship.ForeignTable;
                            CardinalityPrimary       = relationship.PrimaryCardinality;
                            mainKey = relationship.ForeignKey;
                        }
                        else if (entity1.MappedTables().Contains(relationship.ForeignTable) &&
                                 Cardinality.IsOneToMany(relationship.PrimaryCardinality, relationship.ForeignCardinality))
                        {
                            possibleAssociationTable = relationship.PrimaryTable;
                            CardinalityPrimary       = relationship.ForeignCardinality;
                            mainKey = relationship.PrimaryKey;
                        }
                        if (possibleAssociationTable != null)
                        {
                            foreach (ITable otherTable in secondEntity.MappedTables())
                            {
                                foreach (Relationship otherRelationship in otherTable.Relationships.Where(r => r.PrimaryTable == possibleAssociationTable || r.ForeignTable == possibleAssociationTable))
                                {
                                    if (otherRelationship.PrimaryTable == otherTable &&
                                        Cardinality.IsOneToMany(otherRelationship.ForeignCardinality, otherRelationship.PrimaryCardinality) &&
                                        possibleAssociationTable.Relationships.Where(r => r.PrimaryTable == otherRelationship.ForeignTable || r.ForeignTable == otherRelationship.ForeignTable).Count() > 0)
                                    {
                                        unpureAssociationTable = otherRelationship.ForeignTable;
                                        CardinalityForeign     = otherRelationship.PrimaryCardinality;
                                        associationKey         = otherRelationship.ForeignKey;
                                        return(unpureAssociationTable);
                                    }
                                    else if (otherRelationship.ForeignTable == otherTable &&
                                             Cardinality.IsOneToMany(otherRelationship.PrimaryCardinality, otherRelationship.ForeignCardinality) &&
                                             possibleAssociationTable.Relationships.Where(r => r.PrimaryTable == otherRelationship.PrimaryTable || r.ForeignTable == otherRelationship.PrimaryTable).Count() > 0)
                                    {
                                        unpureAssociationTable = otherRelationship.PrimaryTable;
                                        CardinalityForeign     = otherRelationship.ForeignCardinality;
                                        associationKey         = otherRelationship.PrimaryKey;
                                        return(unpureAssociationTable);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return(null);
        }