Esempio n. 1
0
 public void RequestWeightedSimilarAndThen(SimilarQuery query, CategoryRatio ratio,
                                           Action <List <MultimediaObject> > handler)
 {
     logger.Debug("RequestWeightedSimilarAndThen");
     queryFinishedCallback = handler;
     StartCoroutine(ExecuteMultiQuery(query, ratio));
 }
Esempio n. 2
0
        public void SendQueryRequest()
        {
            CollectTimeTerm();

            List <TermsObject> terms = new List <TermsObject>();

            if (locationTerm != null)
            {
                terms.Add(locationTerm);
            }

            if (exampleTerm != null)
            {
                terms.Add(exampleTerm);
            }

            if (timeTerm != null)
            {
                terms.Add(timeTerm);
            }

            SimilarQuery query = QueryFactory.BuildMultiTermQuery(terms.ToArray());

            controller.GoMultiTermQuery(query);
        }
        /// <summary>
        /// Performs an asynchronous request based on the similarity query provided.
        /// </summary>
        /// <param name="query">The query to query cineast</param>
        /// <param name="handler">The handler for handling success / failure</param>
        public void RequestAsync(SimilarQuery query, CineastResponseHandler <List <MultimediaObject> > handler)
        {
            Guid guid = new Guid();

            _guidHandlerMap.Add(guid.ToString(), handler);
            StartCoroutine(ExecuteQuery(query, guid.ToString()));
        }
Esempio n. 4
0
 public void GoQuery(SimilarQuery query)
 {
     logger.Debug("GoQuery");
     ChangeState(State.CINEAST_REQUEST);
     Clean();
     ResetSession();
     cineast.RequestSimilarAndThen(query, HandleCineastResult);
 }
Esempio n. 5
0
        public void GoMultiTermQuery(SimilarQuery query)
        {
            logger.Debug("GoMultiQuery");
            ChangeState(State.CINEAST_REQUEST);
            Clean();
            ResetSession();
            uiManager.panelManager.ShowPanel("waiting");
            CategoryRatio cr = CineastUtils.CreateUniformRatio(query);

            logger.Debug("Ratios: " + cr.ToString());
            cineast.RequestWeightedSimilarAndThen(query, cr, HandleCineastResult);
        }
Esempio n. 6
0
        public void CreateAndPassQuery()
        {
            logger.Debug("CreateAndPassQuery");
            controller.uiManager.panelManager.ShowPanel("waiting");
            SimilarQuery spatialQuery = null;

            if (TargetLocation != null)
            {
                logger.Debug("Found spatial input, building spatial query");
                spatialQuery = QueryFactory.BuildSpatialSimilarQuery(TargetLocation.latitude, TargetLocation.longitude);
            }
            SimilarQuery temporalQuery = null;

            logger.Debug("Start and End time input s:{0}, e:{1}", startInput.text, endInput.text);

            if (!string.IsNullOrEmpty(startInput.text))
            {
                int lower = int.Parse(startInput.text);
                int upper = !string.IsNullOrEmpty(endInput.text) ? int.Parse(endInput.text) : 9990;

                controller.SetTemporalRange(lower, upper);

                logger.Debug("Found at least start input, building termporal query");
                temporalQuery = QueryFactory.BuildTemporalSimilarQuery(ConvertYearToISO8601((lower + upper) / 2));

                /*if (spatialQuery != null)
                 * {
                 *  temporalQuery.With(spatialQuery);
                 * }*/
            }



            logger.Debug("Sending query to controller");
            if (temporalQuery != null)
            {
                controller.GoQuery(temporalQuery);
            }
            else
            {
                if (maxDistProvider.IsModified())
                {
                    controller.SetMaxDistance(maxDistProvider.GetMaxDistance());
                }
                controller.GoQuery(spatialQuery);
            }
        }
Esempio n. 7
0
        public static CategoryRatio CreateUniformRatio(SimilarQuery query)
        {
            CategoryRatio cr = new CategoryRatio();

            List <string> categories = new List <string>();

            foreach (TermContainer tc in query.containers)
            {
                foreach (TermsObject to in tc.terms)
                {
                    categories.AddRange(to.categories);
                }
            }

            foreach (string category in categories)
            {
                cr.AddWeight(category, 1d / categories.Count);
            }

            return(cr);
        }
Esempio n. 8
0
        public static WWW BuildSimilarRequest(string url, string utcTime)
        {
            SimilarQuery sq = QueryFactory.BuildTemporalSimilarQuery(utcTime);

            return(GenerateJSONPostRequest(url, JsonUtility.ToJson(sq)));
        }
Esempio n. 9
0
        /**
         * Builds a SimilarQuery and sends a request to the specified url.
         *
         * @param url - The url to the server
         * @param lat - The latitude of the query
         * @param lon - The longitude of the query
         */
        public static WWW BuildSimilarRequest(string url, double lat, double lon)
        {
            SimilarQuery sQuery = QueryFactory.BuildSpatialSimilarQuery(lat, lon);

            return(GenerateJSONPostRequest(url, JsonUtility.ToJson(sQuery)));
        }
Esempio n. 10
0
        private IEnumerator ExecuteMultiQuery(SimilarQuery query, CategoryRatio ratio)
        {
            // === SIMILAR ===
            // Initial SimilarQuery

            yield return(similarRequest =
                             CineastUtils.BuildSimilarRequest(CineastUtils.Configuration.FindSimilarSegmentsUrl(), query));


            // Parse response
            earlyBreak = !Parse(similarRequest.text, out similarResult);
            yield return(similarResult);

            if (earlyBreak)
            {
                yield break;
            }


            // Check if empty
            if (similarResult.IsEmpty())
            {
                earlyBreak = true;
                yield break; // Stop and
            }

            ContentObject[] tempResult = CineastUtils.ExtractContentObjects(similarResult);

            if (ratio != null && similarResult.results.Length > 1)
            {
                foreach (ResultObject ro in similarResult.results)
                {
                    ContentObject.ArrayToStrig(ro.content);
                }

                ResultMerger merger = new ResultMerger();
                tempResult = merger.Merge(similarResult.results, ratio)
                             .ToArray();
                ContentObject.ArrayToStrig(tempResult);
            }

            // === SEGMENTS ===
            // segments
            yield return(segmentRequest =
                             CineastUtils.BuildSegmentRequest(CineastUtils.Configuration.FindSegmentsByIdUrl(),
                                                              CineastUtils.ExtractIdArray(tempResult)));

            // parse response
            earlyBreak = !Parse(segmentRequest.text, out segmentResult);
            yield return(segmentResult);

            if (earlyBreak)
            {
                yield break;
            }


            // === METAS ===
            yield return(metaRequest =
                             CineastUtils.BuildMetadataRequest(CineastUtils.Configuration.FindMetadataUrl(),
                                                               CineastUtils.ExtractIdArray(segmentResult.content)));

            earlyBreak = !Parse(metaRequest.text, out metaResult);
            yield return(metaResult);

            if (earlyBreak)
            {
                yield break;
            }

            // meta->mmo

            objectList = CineastUtils.Convert(metaResult.content);


            // === OBJECTS ===
            yield return(objectRequest =
                             CineastUtils.BuildObjectsRequest(CineastUtils.Configuration.FindObjectsUrl(),
                                                              CineastUtils.ExtractIdArray(objectList.ToArray())));

            yield return(objectsResult = JsonUtility.FromJson <ObjectsResult>(objectRequest.text));


            // merge results
            List <MultimediaObject> objects = CineastUtils.Convert(objectsResult.content);

            foreach (MultimediaObject mmo in objects)
            {
                if (objectList.Contains(mmo))
                {
                    objectList.Find(o => o.Equals(mmo)).Merge(mmo);
                }
            }


            results = new List <MultimediaObject>(objectList);

            // === WRAPUP ===
            foreach (MultimediaObject mmo in objectList)
            {
                mmo.resultIndex = CineastUtils.GetIndexOf(mmo, similarResult) + 1;
            }


            // === SORT LIST ===
            objectList.Sort(
                Comparison);

            List <MultimediaObject> transferList;

            if (filterEngine != null)
            {
                transferList = filterEngine.ApplyFilters(objectList);
            }
            else
            {
                transferList = objectList;
            }


            // cleanup
            finished = true;
            if (queryFinishedCallback != null)
            {
                queryFinishedCallback.Invoke(transferList);
            }

            yield return(true);
        }
Esempio n. 11
0
 public void RequestSimilarAndThen(SimilarQuery query, Action <List <MultimediaObject> > handler)
 {
     queryFinishedCallback = handler;
     StartCoroutine(ExecuteQuery(query));
 }
Esempio n. 12
0
        private IEnumerator ExecuteQuery(SimilarQuery query, string guid = null)
        {
            // === SIMILAR ===
            // Initial SimilarQuery
//            logger.Debug("Starting initial similar request.\n" + JsonUtility.ToJson(query));
            yield return(similarRequest = CineastUtils.BuildSimilarRequest(CineastUtils.Configuration.FindSimilarSegmentsUrl(), query));

//            logger.Debug("Received similar response: " + similarRequest.text);

            // Parse response
            earlyBreak = !Parse(similarRequest.text, out similarResult);
            yield return(similarResult);

            if (earlyBreak)
            {
//                logger.Error("HTTP error upon similar response");
                yield break;
            }

//            logger.Info("Successfully parsed similar response");

            // Check if empty
            if (similarResult.IsEmpty())
            {
                earlyBreak = true;
//                logger.Error("Empty similar result");
                yield break; // Stop and
            }

            // === SEGMENTS ===
            // segments
//            logger.Debug("Starting segments query");
            yield return(segmentRequest =
                             CineastUtils.BuildSegmentRequest(CineastUtils.Configuration.FindSegmentsByIdUrl(),
                                                              CineastUtils.ExtractIdArray(CineastUtils.ExtractContentObjects(similarResult))));

//            logger.Debug("Received segments response:\n" + segmentRequest.text);
            // parse response
            earlyBreak = !Parse(segmentRequest.text, out segmentResult);
            yield return(segmentResult);

            if (earlyBreak)
            {
//                logger.Error("HTTP error upon segments response");
                yield break;
            }

//            logger.Info("Successfully parsed segments response");

            // === METAS ===
//            logger.Debug("Starting metadata request");
            yield return(metaRequest =
                             CineastUtils.BuildMetadataRequest(CineastUtils.Configuration.FindMetadataUrl(),
                                                               CineastUtils.ExtractIdArray(segmentResult.content)));

//            logger.Debug("Received metadata response:\n" + metaRequest.text);
            earlyBreak = !Parse(metaRequest.text, out metaResult);
            yield return(metaResult);

            if (earlyBreak)
            {
//                logger.Error("HTTP error upon metadata response");
                yield break;
            }

//            logger.Info("Successfully parsed metadata response");
            // meta->mmo

            objectList = CineastUtils.Convert(metaResult.content);
//            logger.Info("Successfully converted metadata result to MultimediaObjects");


            // === OBJECTS ===
//            logger.Debug("Starting object query");
            yield return(objectRequest =
                             CineastUtils.BuildObjectsRequest(CineastUtils.Configuration.FindObjectsUrl(),
                                                              CineastUtils.ExtractIdArray(objectList.ToArray())));

//            logger.Debug("Received objects response:\n" + objectRequest.text);

            yield return(objectsResult = JsonUtility.FromJson <ObjectsResult>(objectRequest.text));

//            logger.Info("Successfully parsed objects response");

            // merge results
            List <MultimediaObject> objects = CineastUtils.Convert(objectsResult.content);

//            logger.Debug("Successfully converted object result to MultimediaObjects");
            foreach (MultimediaObject mmo in objects)
            {
                if (objectList.Contains(mmo))
                {
                    objectList.Find(o => o.Equals(mmo)).Merge(mmo);
                }
            }

//            logger.Info("Finished merging different MultimediaObject lists");

            results = new List <MultimediaObject>(objectList);

            // === WRAPUP ===
//            logger.Debug("Applying result index to MultimediaObject list");
            foreach (MultimediaObject mmo in objectList)
            {
                mmo.resultIndex = CineastUtils.GetIndexOf(mmo, similarResult) + 1;
            }

//            logger.Info("Result contains " + objectList.Count + " entities");
//            logger.Debug("Full result list:\n" + DumpMMOList(objectList));


            // === SORT LIST ===
//            logger.Debug("Sorting list");
            objectList.Sort(
                Comparison);
//            logger.Debug("Sorted list: \n" + DumpMMOList(objectList));

            List <MultimediaObject> transferList;

            if (filterEngine != null)
            {
//                logger.Debug("FilterEngine installed with " + filterEngine.GetFilterCount() + " filters.");
                transferList = filterEngine.ApplyFilters(objectList);
            }
            else
            {
//                logger.Debug("No FilterEngine installed - no filtering");
                transferList = objectList;
            }


            // cleanup
            finished = true;
            if (guid == null)
            {
                // LEGACY
                if (queryFinishedCallback != null)
                {
                    //                logger.Info("Query completed, passing resulting MultimediaObject list to callback");
                    queryFinishedCallback.Invoke(transferList);
                }
            }
            else
            {
                CineastResponseHandler <List <MultimediaObject> > handler = _guidHandlerMap[guid];
                if (handler != null)
                {
                    handler.onSuccess(transferList);
                }
            }

            yield return(true);
        }
Esempio n. 13
0
 public void RequestSimilarThanMasterpiece(SimilarQuery query, Action <List <MultimediaObject> > handler)
 {
     queryFinishedCallback = handler;
     StartCoroutine(ExecuteQueryMoreLikeMasterpiece(query));
 }
Esempio n. 14
0
        /*
         *  Query For Masteroiece ( Draw picture)
         */
        private IEnumerator ExecuteQueryMoreLikeMasterpiece(SimilarQuery query)
        {
            // Since api is used several times it has to be set false on call
            finished = false;


            // === SIMILAR ===
            // Initial SimilarQuery
            yield return(similarRequest =
                             CineastUtils.BuildSimilarRequest(CineastUtils.Configuration.FindSimilarSegmentsUrl(), query));


            // Parse response
            earlyBreak = !Parse(similarRequest.text, out similarResult);
            yield return(similarResult);

            if (earlyBreak)
            {
                yield break;
            }


            // Check if empty
            if (similarResult.IsEmpty())
            {
                earlyBreak = true;
                yield break; // Stop and
            }

            // === SEGMENTS ===
            // segments
            yield return(segmentRequest =
                             CineastUtils.BuildSegmentRequest(CineastUtils.Configuration.FindSegmentsByIdUrl(),
                                                              CineastUtils.ExtractIdArray(CineastUtils.ExtractContentObjects(similarResult))));

            // parse response
            earlyBreak = !Parse(segmentRequest.text, out segmentResult);
            yield return(segmentResult);

            if (earlyBreak)
            {
                yield break;
            }


            yield return(objectRequest =
                             CineastUtils.BuildObjectsRequest(CineastUtils.Configuration.FindObjectsUrl(),
                                                              CineastUtils.ExtractIdArray(segmentResult.content)));

            yield return(objectsResult = JsonUtility.FromJson <ObjectsResult>(objectRequest.text));



            objectList = CineastUtils.Convert(objectsResult.content);


            // merge results
            var objects = CineastUtils.Convert(objectsResult.content);

            foreach (var mmo in objects)
            {
                if (objectList.Contains(mmo))
                {
                    objectList.Find(o => o.Equals(mmo)).Merge(mmo);
                }
            }


            results = new List <MultimediaObject>(objectList);

            // === WRAPUP ===
            foreach (var mmo in objectList)
            {
                mmo.resultIndex = CineastUtils.GetIndexOf(mmo, similarResult) + 1;
            }


            // === SORT LIST ===
            objectList.Sort(
                Comparison);

            List <MultimediaObject> transferList;

            if (filterEngine != null)
            {
                transferList = filterEngine.ApplyFilters(objectList);
            }
            else
            {
                transferList = objectList;
            }


            // cleanup
            finished = true;
            if (queryFinishedCallback != null)
            {
                queryFinishedCallback.Invoke(transferList);
            }

            yield return(true);
        }
Esempio n. 15
0
        private IEnumerator ExecuteMultiQuery(SimilarQuery query, CategoryRatio ratio)
        {
            // === SIMILAR ===
            // Initial SimilarQuery
            logger.Debug("Starting initial similar request.\n" + JsonUtility.ToJson(query));
            yield return(similarRequest = CineastUtils.BuildSimilarRequest(CineastUtils.Configuration.FindSimilarSegmentsUrl(), query));

            logger.Debug("Received similar response: " + similarRequest.text);

            // Parse response
            earlyBreak = !Parse(similarRequest.text, out similarResult);
            yield return(similarResult);

            if (earlyBreak)
            {
                logger.Error("HTTP error upon similar response");
                yield break;
            }

            logger.Info("Successfully parsed similar response");

            // Check if empty
            if (similarResult.IsEmpty())
            {
                earlyBreak = true;
                logger.Error("Empty similar result");
                yield break; // Stop and
            }

            ContentObject[] tempResult = CineastUtils.ExtractContentObjects(similarResult);

            if (ratio != null && similarResult.results.Length > 1)
            {
                logger.Debug("Merging...");
                foreach (ResultObject ro in similarResult.results)
                {
                    logger.Debug("Result for category {0} contains {1} entries.\n\t{2}", ro.category, ro.content.Length,
                                 ContentObject.ArrayToStrig(ro.content));
                }

                ResultMerger merger = new ResultMerger();
                tempResult = merger.Merge(similarResult.results, ratio)
                             .ToArray();
                logger.Debug("After merge: {0} unique entries\n\t{1}", tempResult.Length,
                             ContentObject.ArrayToStrig(tempResult));
            }

            // === SEGMENTS ===
            // segments
            logger.Debug("Starting segments query");
            yield return(segmentRequest =
                             CineastUtils.BuildSegmentRequest(CineastUtils.Configuration.FindSegmentsByIdUrl(),
                                                              CineastUtils.ExtractIdArray(tempResult)));

            logger.Debug("Received segments response:\n" + segmentRequest.text);
            // parse response
            earlyBreak = !Parse(segmentRequest.text, out segmentResult);
            yield return(segmentResult);

            if (earlyBreak)
            {
                logger.Error("HTTP error upon segments response");
                yield break;
            }

            logger.Info("Successfully parsed segments response");

            // === METAS ===
            logger.Debug("Starting metadata request");
            yield return(metaRequest =
                             CineastUtils.BuildMetadataRequest(CineastUtils.Configuration.FindMetadataUrl(),
                                                               CineastUtils.ExtractIdArray(segmentResult.content)));

            logger.Debug("Received metadata response:\n" + metaRequest.text);
            earlyBreak = !Parse(metaRequest.text, out metaResult);
            yield return(metaResult);

            if (earlyBreak)
            {
                logger.Error("HTTP error upon metadata response");
                yield break;
            }

            logger.Info("Successfully parsed metadata response");
            // meta->mmo

            objectList = CineastUtils.Convert(metaResult.content);
            logger.Info("Successfully converted metadata result to MultimediaObjects");


            // === OBJECTS ===
            logger.Debug("Starting object query");
            yield return(objectRequest =
                             CineastUtils.BuildObjectsRequest(CineastUtils.Configuration.FindObjectsUrl(),
                                                              CineastUtils.ExtractIdArray(objectList.ToArray())));

            logger.Debug("Received objects response:\n" + objectRequest.text);

            yield return(objectsResult = JsonUtility.FromJson <ObjectsResult>(objectRequest.text));

            logger.Info("Successfully parsed objects response");

            // merge results
            List <MultimediaObject> objects = CineastUtils.Convert(objectsResult.content);

            logger.Debug("Successfully converted object result to MultimediaObjects");
            foreach (MultimediaObject mmo in objects)
            {
                if (objectList.Contains(mmo))
                {
                    objectList.Find(o => o.Equals(mmo)).Merge(mmo);
                }
            }

            logger.Info("Finished merging different MultimediaObject lists");

            results = new List <MultimediaObject>(objectList);

            // === WRAPUP ===
            logger.Debug("Applying result index to MultimediaObject list");
            foreach (MultimediaObject mmo in objectList)
            {
                mmo.resultIndex = CineastUtils.GetIndexOf(mmo, similarResult) + 1;
            }

            logger.Info("Result contains " + objectList.Count + " entities");
            logger.Debug("Full result list:\n" + DumpMMOList(objectList));


            // === SORT LIST ===
            logger.Debug("Sorting list");
            objectList.Sort(
                Comparison);
            logger.Debug("Sorted list: \n" + DumpMMOList(objectList));

            List <MultimediaObject> transferList;

            if (filterEngine != null)
            {
                logger.Debug("FilterEngine installed with " + filterEngine.GetFilterCount() + " filters.");
                transferList = filterEngine.ApplyFilters(objectList);
            }
            else
            {
                logger.Debug("No FilterEngine installed - no filtering");
                transferList = objectList;
            }


            // cleanup
            finished = true;
            if (queryFinishedCallback != null)
            {
                logger.Info("Query completed, passing resulting MultimediaObject list to callback");
                queryFinishedCallback.Invoke(transferList);
            }

            yield return(true);
        }
Esempio n. 16
0
 public static WWW BuildSimilarRequest(string url, SimilarQuery query)
 {
     return(GenerateJSONPostRequest(url, JsonUtility.ToJson(query)));
 }
Esempio n. 17
0
        private IEnumerator ExecuteMultiQuery(SimilarQuery query, CategoryRatio ratio, string guid = null)
        {
            // === SIMILAR ===
            // Initial SimilarQuery
            yield return(similarRequest = CineastUtils.BuildSimilarRequest(CineastUtils.Configuration.FindSimilarSegmentsUrl(), query));

            // Parse response
            earlyBreak = !Parse(similarRequest.text, out similarResult);
            yield return(similarResult);

            if (earlyBreak)
            {
                yield break;
            }

            // Check if empty
            if (similarResult.IsEmpty())
            {
                earlyBreak = true;
                yield break; // Stop and
            }

            ContentObject[] tempResult = CineastUtils.ExtractContentObjects(similarResult);

            if (ratio != null && similarResult.results.Length > 1)
            {
                ResultMerger merger = new ResultMerger();
                tempResult = merger.Merge(similarResult.results, ratio)
                             .ToArray();
            }

            // === SEGMENTS ===
            // segments
            yield return(segmentRequest =
                             CineastUtils.BuildSegmentRequest(CineastUtils.Configuration.FindSegmentsByIdUrl(),
                                                              CineastUtils.ExtractIdArray(tempResult)));

            // parse response
            earlyBreak = !Parse(segmentRequest.text, out segmentResult);
            yield return(segmentResult);

            if (earlyBreak)
            {
                yield break;
            }

            // === METAS ===
            yield return(metaRequest =
                             CineastUtils.BuildMetadataRequest(CineastUtils.Configuration.FindMetadataUrl(),
                                                               CineastUtils.ExtractIdArray(segmentResult.content)));

            earlyBreak = !Parse(metaRequest.text, out metaResult);
            yield return(metaResult);

            if (earlyBreak)
            {
                yield break;
            }
            // meta->mmo
            objectList = CineastUtils.Convert(metaResult.content);

            // === OBJECTS ===
            yield return(objectRequest =
                             CineastUtils.BuildObjectsRequest(CineastUtils.Configuration.FindObjectsUrl(),
                                                              CineastUtils.ExtractIdArray(objectList.ToArray())));

            yield return(objectsResult = JsonUtility.FromJson <ObjectsResult>(objectRequest.text));

            // merge results
            List <MultimediaObject> objects = CineastUtils.Convert(objectsResult.content);

            foreach (MultimediaObject mmo in objects)
            {
                if (objectList.Contains(mmo))
                {
                    objectList.Find(o => o.Equals(mmo)).Merge(mmo);
                }
            }

            results = new List <MultimediaObject>(objectList);

            // === WRAPUP ===
            foreach (MultimediaObject mmo in objectList)
            {
                mmo.resultIndex = CineastUtils.GetIndexOf(mmo, similarResult) + 1;
            }

            // === SORT LIST ===
            objectList.Sort(Comparison);

            List <MultimediaObject> transferList;

            if (filterEngine != null)
            {
//                logger.Debug("FilterEngine installed with " + filterEngine.GetFilterCount() + " filters.");
                transferList = filterEngine.ApplyFilters(objectList);
            }
            else
            {
//                logger.Debug("No FilterEngine installed - no filtering");
                transferList = objectList;
            }


            // cleanup
            finished = true;
            if (guid == null)
            {
                // LEGACY
                if (queryFinishedCallback != null)
                {
                    //                logger.Info("Query completed, passing resulting MultimediaObject list to callback");
                    queryFinishedCallback.Invoke(transferList);
                }
            }
            else
            {
                CineastResponseHandler <List <MultimediaObject> > handler = _guidHandlerMap[guid];
                if (handler != null)
                {
                    handler.onSuccess(transferList);
                }
            }

            yield return(true);
        }
Esempio n. 18
0
 public void With(SimilarQuery query)
 {
     TermContainer[] tc = new[] { containers[0], query.containers[0] };
     containers = tc;
 }