Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
QueryOperator.cs
Go to the documentation of this file.
4
6
7internal abstract class QueryOperator<TOutput> : ParallelQuery<TOutput>
8{
9 protected bool _outputOrdered;
10
11 internal bool OutputOrdered => _outputOrdered;
12
13 internal abstract bool LimitsParallelism { get; }
14
15 internal abstract OrdinalIndexState OrdinalIndexState { get; }
16
17 internal QueryOperator(QuerySettings settings)
18 : this(isOrdered: false, settings)
19 {
20 }
21
22 internal QueryOperator(bool isOrdered, QuerySettings settings)
23 : base(settings)
24 {
26 }
27
28 internal abstract QueryResults<TOutput> Open(QuerySettings settings, bool preferStriping);
29
31 {
32 return GetEnumerator(null, suppressOrderPreservation: false);
33 }
34
39
44
46 {
47 if (querySettings.ExecutionMode.Value == ParallelExecutionMode.Default && LimitsParallelism)
48 {
49 IEnumerable<TOutput> source = AsSequentialQuery(querySettings.CancellationState.ExternalCancellationToken);
50 return ExceptionAggregator.WrapEnumerable(source, querySettings.CancellationState).GetEnumerator();
51 }
53 if (!mergeOptions.HasValue)
54 {
55 mergeOptions = querySettings.MergeOptions;
56 }
57 if (querySettings.CancellationState.MergedCancellationToken.IsCancellationRequested)
58 {
59 querySettings.CancellationState.ExternalCancellationToken.ThrowIfCancellationRequested();
61 }
64 queryResults.GivePartitionedStream(partitionedStreamMerger);
65 if (forEffect)
66 {
67 return null;
68 }
69 return partitionedStreamMerger.MergeExecutor.GetEnumerator();
70 }
71
76
77 internal TOutput[] ExecuteAndGetResultsAsArray()
78 {
79 QuerySettings querySettings = base.SpecifiedQuerySettings.WithPerExecutionSettings().WithDefaults();
81 try
82 {
83 if (querySettings.ExecutionMode.Value == ParallelExecutionMode.Default && LimitsParallelism)
84 {
85 IEnumerable<TOutput> source = AsSequentialQuery(querySettings.CancellationState.ExternalCancellationToken);
86 IEnumerable<TOutput> source2 = CancellableEnumerable.Wrap(source, querySettings.CancellationState.ExternalCancellationToken);
87 return ExceptionAggregator.WrapEnumerable(source2, querySettings.CancellationState).ToArray();
88 }
90 if (querySettings.CancellationState.MergedCancellationToken.IsCancellationRequested)
91 {
92 querySettings.CancellationState.ExternalCancellationToken.ThrowIfCancellationRequested();
94 }
95 if (queryResults.IsIndexible && OutputOrdered)
96 {
98 arrayMergeHelper.Execute();
99 TOutput[] resultsAsArray = arrayMergeHelper.GetResultsAsArray();
100 querySettings.CleanStateAtQueryEnd();
101 return resultsAsArray;
102 }
104 queryResults.GivePartitionedStream(partitionedStreamMerger);
105 TOutput[] resultsAsArray2 = partitionedStreamMerger.MergeExecutor.GetResultsAsArray();
106 querySettings.CleanStateAtQueryEnd();
107 return resultsAsArray2;
108 }
109 finally
110 {
112 }
113 }
114
116
123
133}
static void LogicalQueryExecutionEnd(int queryID)
static void LogicalQueryExecutionBegin(int queryID)
IEnumerator< TOutput > GetEnumerator(ParallelMergeOptions? mergeOptions)
QueryResults< TOutput > Open(QuerySettings settings, bool preferStriping)
IEnumerator< TOutput > GetOpenedEnumerator(ParallelMergeOptions? mergeOptions, bool suppressOrder, bool forEffect, QuerySettings querySettings)
IEnumerable< TOutput > AsSequentialQuery(CancellationToken token)
static ListQueryResults< TOutput > ExecuteAndCollectResults< TKey >(PartitionedStream< TOutput, TKey > openedChild, int partitionCount, bool outputOrdered, bool useStriping, QuerySettings settings)
QueryOperator(bool isOrdered, QuerySettings settings)
virtual IEnumerator< TOutput > GetEnumerator(ParallelMergeOptions? mergeOptions, bool suppressOrderPreservation)
QueryOperator(QuerySettings settings)
override IEnumerator< TOutput > GetEnumerator()
QueryResults< TOutput > GetQueryResults(QuerySettings querySettings)
static QueryOperator< TOutput > AsQueryOperator(IEnumerable< TOutput > source)