예제 #1
0
        private int RemoveMany(OrQuery query)
        {
            if (query.IsEmpty()) // an empty query means truncate the table
            {
                var all = _dataStore.DataByPrimaryKey.Values.ToList();

                _transactionLog?.NewTransaction(new DeleteDurableTransaction
                {
                    ItemsToDelete = all
                });

                var count = all.Count;
                _dataStore.Truncate();

                return(count);
            }

            var queryManager = new QueryManager(_dataStore);

            var toRemove = queryManager.ProcessQuery(query);

            _transactionLog?.NewTransaction(new DeleteDurableTransaction
            {
                ItemsToDelete = toRemove
            });

            _dataStore.RemoveMany(toRemove);

            return(toRemove.Count);
        }
예제 #2
0
        private IList <PackedObject> InternalProcessQuery(OrQuery query)
        {
            var executionPlan = new ExecutionPlan();

            try
            {
                executionPlan.Begin();

                // an empty query should return everything
                if (query.IsEmpty())
                {
                    var all = _dataStore.PrimaryIndex.GetAll().ToList();


                    if (query.OrderByProperty != null)
                    {
                        return(OrderBy(all.ToHashSet(), query.OrderByProperty, query.OrderByIsDescending, executionPlan));
                    }


                    return(all);
                }

                // simplified processing if it is an atomic query
                var atomicQuery = AsAtomic(query);

                if (atomicQuery != null)
                {
                    var res = ProcessSimpleQuery(atomicQuery, executionPlan);


                    if (query.OrderByProperty != null)
                    {
                        return(OrderBy(res.ToHashSet(), query.OrderByProperty, query.OrderByIsDescending, executionPlan));
                    }
                    else
                    {
                        return(res);
                    }
                }


                // if only one AndQuery, process sequentially
                if (query.Elements.Count == 1)
                {
                    var andQuery = query.Elements[0];

                    var set = ProcessAndQuery(andQuery, executionPlan);

                    if (query.OrderByProperty != null)
                    {
                        return(OrderBy(set.ToHashSet(), query.OrderByProperty, query.OrderByIsDescending, executionPlan));
                    }

                    return(set.ToList());
                }

                // if multiple AndQueries run in parallel
                HashSet <PackedObject> orResult = null;

                var results = new IList <PackedObject> [query.Elements.Count];

                Parallel.For(0, query.Elements.Count, i =>
                {
                    var andQuery = query.Elements[i];
                    results[i]   = ProcessAndQuery(andQuery, executionPlan);
                });

                executionPlan.BeginMerge();

                // merge the results (they may contain duplicates)
                foreach (var result in results)
                {
                    if (orResult == null)
                    {
                        orResult = new HashSet <PackedObject>(result);
                    }
                    else
                    {
                        orResult.UnionWith(result);
                    }
                }

                executionPlan.EndMerge();

                if (query.OrderByProperty != null)
                {
                    return(OrderBy(orResult, query.OrderByProperty, query.OrderByIsDescending, executionPlan));
                }


                return(orResult !.ToList());
            }
            finally
            {
                executionPlan.End();
                ExecutionPlan = executionPlan;

                _log?.LogActivity("QUERY", query.CollectionName, executionPlan.TotalTimeInMicroseconds, query.ToString(), query.Description(), executionPlan);
            }
        }