1
1
using KustoCopyConsole . Entity . RowItems ;
2
+ using KustoCopyConsole . Storage ;
2
3
using System ;
3
4
using System . Collections . Generic ;
4
5
using System . Collections . Immutable ;
5
6
using System . Linq ;
6
7
using System . Text ;
7
8
using System . Threading . Tasks ;
9
+ using System . Threading . Tasks . Dataflow ;
8
10
9
11
namespace KustoCopyConsole . Entity . InMemory
10
12
{
@@ -30,14 +32,40 @@ public RowItemInMemoryCache(IEnumerable<RowItemBase> items)
30
32
public IImmutableDictionary < string , ActivityCache > ActivityMap
31
33
=> _activityMap ;
32
34
35
+ public IEnumerable < ActivityFlatHierarchy > GetActivityFlatHierarchy (
36
+ Func < ActivityCache , bool > activityPredicate ,
37
+ Func < IterationCache , bool > iterationPredicate )
38
+ {
39
+ return ActivityMap
40
+ . Values
41
+ . Where ( a => activityPredicate ( a ) )
42
+ . SelectMany ( a => a . IterationMap . Values . Where ( i => iterationPredicate ( i ) ) . Select ( i => new
43
+ {
44
+ Activity = a ,
45
+ Iteration = i ,
46
+ TempTableItem = i . TempTable
47
+ } ) )
48
+ . SelectMany ( o => o . Iteration . BlockMap . Values . Select ( b => new ActivityFlatHierarchy (
49
+ o . Activity . RowItem ,
50
+ o . Iteration . RowItem ,
51
+ o . TempTableItem ,
52
+ b . RowItem ,
53
+ b . UrlMap . Values . Select ( u => u . RowItem ) ) ) ) ;
54
+ }
55
+
33
56
public IEnumerable < RowItemBase > GetItems ( )
34
57
{
35
- foreach ( var sourceTable in ActivityMap . Values )
58
+ foreach ( var activity in ActivityMap . Values )
36
59
{
37
- foreach ( var sourceTableIteration in sourceTable . IterationMap . Values )
60
+ yield return activity . RowItem ;
61
+ foreach ( var iteration in activity . IterationMap . Values )
38
62
{
39
- yield return sourceTableIteration . RowItem ;
40
- foreach ( var block in sourceTableIteration . BlockMap . Values )
63
+ yield return iteration . RowItem ;
64
+ if ( iteration . TempTable != null )
65
+ {
66
+ yield return iteration . TempTable ;
67
+ }
68
+ foreach ( var block in iteration . BlockMap . Values )
41
69
{
42
70
yield return block . RowItem ;
43
71
foreach ( var url in block . UrlMap . Values )
@@ -54,8 +82,8 @@ public void AppendItem(RowItemBase item)
54
82
lock ( _lock )
55
83
{
56
84
Interlocked . Exchange ( ref _activityMap , AppendItemToCache ( item ) ) ;
57
- OnRowItemAppended ( item ) ;
58
85
}
86
+ OnRowItemAppended ( item ) ;
59
87
}
60
88
61
89
private void OnRowItemAppended ( RowItemBase item )
@@ -75,10 +103,12 @@ private IImmutableDictionary<string, ActivityCache> AppendItemToCache(
75
103
return AppendActivity ( a ) ;
76
104
case IterationRowItem i :
77
105
return AppendIteration ( i ) ;
106
+ case TempTableRowItem t :
107
+ return AppendTempTable ( t ) ;
78
108
case BlockRowItem sb :
79
- return AppendSourceBlock ( sb ) ;
109
+ return AppendBlock ( sb ) ;
80
110
case UrlRowItem url :
81
- return AppendSourceUrl ( url ) ;
111
+ return AppendUrl ( url ) ;
82
112
default :
83
113
throw new NotSupportedException (
84
114
$ "Not supported row item type: { item . GetType ( ) . Name } ") ;
@@ -120,7 +150,7 @@ private IImmutableDictionary<string, ActivityCache> AppendIteration(
120
150
return _activityMap . SetItem (
121
151
activityName ,
122
152
table . AppendIteration (
123
- new IterationCache ( item , iteration . BlockMap ) ) ) ;
153
+ new IterationCache ( item , iteration . TempTable , iteration . BlockMap ) ) ) ;
124
154
}
125
155
else
126
156
{
@@ -135,35 +165,62 @@ private IImmutableDictionary<string, ActivityCache> AppendIteration(
135
165
}
136
166
}
137
167
138
- private IImmutableDictionary < string , ActivityCache > AppendSourceBlock (
139
- BlockRowItem item )
168
+ private IImmutableDictionary < string , ActivityCache > AppendTempTable ( TempTableRowItem item )
140
169
{
141
170
var activityName = item . ActivityName ;
142
171
143
172
if ( _activityMap . ContainsKey ( activityName ) )
144
173
{
145
- var sourceTable = _activityMap [ activityName ] ;
174
+ var activity = _activityMap [ activityName ] ;
146
175
147
- if ( sourceTable . IterationMap . ContainsKey ( item . IterationId ) )
176
+ if ( activity . IterationMap . ContainsKey ( item . IterationId ) )
148
177
{
149
- var sourceIteration = sourceTable . IterationMap [ item . IterationId ] ;
178
+ var iteration = activity . IterationMap [ item . IterationId ] ;
150
179
151
- if ( sourceIteration . BlockMap . ContainsKey ( item . BlockId ) )
180
+ return _activityMap . SetItem (
181
+ activityName ,
182
+ activity . AppendIteration (
183
+ new IterationCache ( iteration . RowItem , item , iteration . BlockMap ) ) ) ;
184
+ }
185
+ else
186
+ {
187
+ throw new NotSupportedException ( "Iteration should come before block in logs" ) ;
188
+ }
189
+ }
190
+ else
191
+ {
192
+ throw new NotSupportedException ( "Activity should come before block in logs" ) ;
193
+ }
194
+ }
195
+
196
+ private IImmutableDictionary < string , ActivityCache > AppendBlock ( BlockRowItem item )
197
+ {
198
+ var activityName = item . ActivityName ;
199
+
200
+ if ( _activityMap . ContainsKey ( activityName ) )
201
+ {
202
+ var activity = _activityMap [ activityName ] ;
203
+
204
+ if ( activity . IterationMap . ContainsKey ( item . IterationId ) )
205
+ {
206
+ var iteration = activity . IterationMap [ item . IterationId ] ;
207
+
208
+ if ( iteration . BlockMap . ContainsKey ( item . BlockId ) )
152
209
{
153
- var sourceBlock = sourceIteration . BlockMap [ item . BlockId ] ;
210
+ var sourceBlock = iteration . BlockMap [ item . BlockId ] ;
154
211
155
212
return _activityMap . SetItem (
156
213
activityName ,
157
- sourceTable . AppendIteration (
158
- sourceIteration . AppendBlock (
214
+ activity . AppendIteration (
215
+ iteration . AppendBlock (
159
216
new BlockCache ( item , sourceBlock . UrlMap ) ) ) ) ;
160
217
}
161
218
else
162
219
{
163
220
return _activityMap . SetItem (
164
221
activityName ,
165
- sourceTable . AppendIteration (
166
- sourceIteration . AppendBlock ( new BlockCache ( item ) ) ) ) ;
222
+ activity . AppendIteration (
223
+ iteration . AppendBlock ( new BlockCache ( item ) ) ) ) ;
167
224
}
168
225
}
169
226
else
@@ -177,26 +234,26 @@ private IImmutableDictionary<string, ActivityCache> AppendSourceBlock(
177
234
}
178
235
}
179
236
180
- private IImmutableDictionary < string , ActivityCache > AppendSourceUrl ( UrlRowItem item )
237
+ private IImmutableDictionary < string , ActivityCache > AppendUrl ( UrlRowItem item )
181
238
{
182
239
var activityName = item . ActivityName ;
183
240
184
241
if ( _activityMap . ContainsKey ( activityName ) )
185
242
{
186
- var sourceTable = _activityMap [ activityName ] ;
243
+ var activity = _activityMap [ activityName ] ;
187
244
188
- if ( sourceTable . IterationMap . ContainsKey ( item . IterationId ) )
245
+ if ( activity . IterationMap . ContainsKey ( item . IterationId ) )
189
246
{
190
- var sourceIteration = sourceTable . IterationMap [ item . IterationId ] ;
247
+ var iteration = activity . IterationMap [ item . IterationId ] ;
191
248
192
- if ( sourceIteration . BlockMap . ContainsKey ( item . BlockId ) )
249
+ if ( iteration . BlockMap . ContainsKey ( item . BlockId ) )
193
250
{
194
- var block = sourceIteration . BlockMap [ item . BlockId ] ;
251
+ var block = iteration . BlockMap [ item . BlockId ] ;
195
252
196
253
return _activityMap . SetItem (
197
254
activityName ,
198
- sourceTable . AppendIteration (
199
- sourceIteration . AppendBlock (
255
+ activity . AppendIteration (
256
+ iteration . AppendBlock (
200
257
block . AppendUrl ( new UrlCache ( item ) ) ) ) ) ;
201
258
}
202
259
else
0 commit comments