public void Modify(QueryMatchID id, int index, SetChildArgs args)
        {
            Assert.IsTrue(MatchIdToIndex.ContainsKey(id) &&
                          QueryMatchIds[index].Equals(id) &&
                          ValidIndices.Contains(index),
                          $"Invalid query match id {id} or invalid index {index}");

            Exclusivities[index]       = args.tryBestMatchArgs.exclusivity;
            Required[index]            = args.required;
            BestMatchDataIds[index]    = (int)ReservedDataIDs.Invalid;
            CachedTraits[index]        = new CachedTraitCollection(args.tryBestMatchArgs.conditions);
            Conditions[index]          = args.tryBestMatchArgs.conditions;
            TraitRequirements[index]   = args.TraitRequirements;
            RelationMemberships[index] = null;
            ConditionRatings[index].Recycle();
            ConditionRatings[index] = Pools.ConditionRatings.Get().Initialize(args.tryBestMatchArgs.conditions);
            ReducedConditionRatings[index].Clear();
            ConditionMatchSets[index].Clear();
            QueryResults[index] = new QueryResult {
                queryMatchId = id
            };

            AcquiringIndices.Add(index);
            UpdatingIndices.Remove(index);
        }
        public int Register(QueryMatchID id, IMRObject obj, SetChildArgs args)
        {
            var index = Add(id,
                            obj,
                            args.tryBestMatchArgs.exclusivity,
                            (int)ReservedDataIDs.Invalid,
                            args.required,
                            new CachedTraitCollection(args.tryBestMatchArgs.conditions),
                            args.tryBestMatchArgs.conditions,
                            args.TraitRequirements,
                            Pools.ConditionRatings.Get().Initialize(args.tryBestMatchArgs.conditions),
                            Pools.DataIdHashSets.Get(),
                            Pools.Ratings.Get(),
                            new QueryResult {
                queryMatchId = id
            });

            AcquiringIndices.Add(index);

            List <int> tempIndices;

            if (MatchIdToIndex.TryGetValue(id, out tempIndices))
            {
                tempIndices.Add(index);
            }
            else
            {
                tempIndices = new List <int> {
                    index
                };
                MatchIdToIndex[id] = tempIndices;
            }

            return(index);
        }
        static Relations MakeBaseSet(out SetQueryResult result, Dictionary <IMRObject, ChildMatchInfo> childrenExpectedMatchInfo)
        {
            var gameObject = new GameObject("Set");

            gameObject.AddComponent <ProxyGroup>();
            k_ToDestroy.Add(gameObject);

            // Make child MR objects and give them ordinary relations
            var children = new Dictionary <IMRObject, SetChildArgs>();

            for (var i = 0; i < k_RelationCount + 1; ++i)
            {
                var childGameObject = new GameObject("Child" + i);
                k_ToDestroy.Add(childGameObject);
                childGameObject.transform.SetParent(gameObject.transform);
                var conditionsRoot    = childGameObject.AddComponent <TestMRObject>();
                var expectedMatchInfo = new ChildMatchInfo();
                childrenExpectedMatchInfo[conditionsRoot] = expectedMatchInfo;

                var hasTraitCondition = childGameObject.AddComponent <SemanticTagCondition>();
                hasTraitCondition.SetTraitName(k_CommonTrait);
                expectedMatchInfo.semanticTagTraits.Add(k_CommonTrait, true);

                var conditions = ProxyConditions.FromGenericIMRObject(conditionsRoot);
                var childArgs  = new SetChildArgs(conditions);
                children[conditionsRoot] = childArgs;
            }

            // Make relations and store the expected trait values that will match them
            var childrenList = new List <IMRObject>(children.Keys);

            for (var i = 0; i < k_RelationCount; ++i)
            {
                var child1 = childrenList[i];
                var child2 = childrenList[i + 1];

                var floatRelation = gameObject.AddComponent <FloatRelation>();
                floatRelation.Initialize(child1, child2, k_FloatTrait1, k_FloatTrait2);
                childrenExpectedMatchInfo[child1].floatTraits[floatRelation.child1TraitName] = i;
                childrenExpectedMatchInfo[child2].floatTraits[floatRelation.child2TraitName] = i + 1f;

                var vector2Relation = gameObject.AddComponent <Vector2Relation>();
                vector2Relation.Initialize(child1, child2, k_Vector2Trait1, k_Vector2Trait2);
                childrenExpectedMatchInfo[child1].vector2Traits[vector2Relation.child1TraitName] = new Vector2(i, 0f);
                childrenExpectedMatchInfo[child2].vector2Traits[vector2Relation.child2TraitName] = new Vector2(i + 1f, 0f);
            }

            result = new SetQueryResult(QueryMatchID.Generate(), childrenList);

            var relations = new Relations(gameObject, children);

            s_SetArgs = new SetQueryArgs {
                relations = relations
            };
            return(relations);
        }