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); }
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); } }