@@ -71,6 +71,17 @@ NYT::TNode MakeOutputSchema() {
71
71
return NYT::TNode::CreateList ().Add (" StructType" ).Add (std::move (structMembers));
72
72
}
73
73
74
+ struct TInputType {
75
+ const TVector<ui64>& Offsets;
76
+ const TVector<const TVector<NYql::NUdf::TUnboxedValue>*>& Values;
77
+ const ui64 RowsOffset; // offset of first value
78
+ const ui64 NumberRows;
79
+
80
+ ui64 GetOffset (ui64 rowId) const {
81
+ return Offsets[rowId + RowsOffset];
82
+ }
83
+ };
84
+
74
85
class TFilterInputSpec : public NYql ::NPureCalc::TInputSpecBase {
75
86
public:
76
87
TFilterInputSpec (const NYT::TNode& schema)
@@ -85,7 +96,7 @@ class TFilterInputSpec : public NYql::NPureCalc::TInputSpecBase {
85
96
TVector<NYT::TNode> Schemas;
86
97
};
87
98
88
- class TFilterInputConsumer : public NYql ::NPureCalc::IConsumer<std::pair< const TVector<ui64>&, const TVector< const NKikimr::NMiniKQL::TUnboxedValueVector*>&> > {
99
+ class TFilterInputConsumer : public NYql ::NPureCalc::IConsumer<TInputType > {
89
100
public:
90
101
TFilterInputConsumer (
91
102
const TFilterInputSpec& spec,
@@ -123,36 +134,38 @@ class TFilterInputConsumer : public NYql::NPureCalc::IConsumer<std::pair<const T
123
134
}
124
135
}
125
136
126
- void OnObject (std::pair< const TVector<ui64>&, const TVector< const NKikimr::NMiniKQL::TUnboxedValueVector*>&> values ) override {
127
- Y_ENSURE (FieldsPositions.size () == values. second .size ());
137
+ void OnObject (TInputType input ) override {
138
+ Y_ENSURE (FieldsPositions.size () == input. Values .size ());
128
139
129
140
NKikimr::NMiniKQL::TThrowingBindTerminator bind;
130
141
with_lock (Worker->GetScopedAlloc ()) {
142
+ Y_DEFER {
143
+ // Clear cache after each object because
144
+ // values allocated on another allocator and should be released
145
+ Cache.Clear ();
146
+ Worker->GetGraph ().Invalidate ();
147
+ };
148
+
131
149
auto & holderFactory = Worker->GetGraph ().GetHolderFactory ();
132
150
133
151
// TODO: use blocks here
134
- for (size_t rowId = 0 ; rowId < values. second . front ()-> size () ; ++rowId) {
152
+ for (size_t rowId = 0 ; rowId < input. NumberRows ; ++rowId) {
135
153
NYql::NUdf::TUnboxedValue* items = nullptr ;
136
154
137
155
NYql::NUdf::TUnboxedValue result = Cache.NewArray (
138
156
holderFactory,
139
- static_cast <ui32>(values. second .size () + 1 ),
157
+ static_cast <ui32>(input. Values .size () + 1 ),
140
158
items);
141
159
142
- items[OffsetPosition] = NYql::NUdf::TUnboxedValuePod (values. first [ rowId] );
160
+ items[OffsetPosition] = NYql::NUdf::TUnboxedValuePod (input. GetOffset ( rowId) );
143
161
144
162
size_t fieldId = 0 ;
145
- for (const auto & column : values. second ) {
163
+ for (const auto column : input. Values ) {
146
164
items[FieldsPositions[fieldId++]] = column->at (rowId);
147
165
}
148
166
149
167
Worker->Push (std::move (result));
150
168
}
151
-
152
- // Clear cache after each object because
153
- // values allocated on another allocator and should be released
154
- Cache.Clear ();
155
- Worker->GetGraph ().Invalidate ();
156
169
}
157
170
}
158
171
@@ -236,7 +249,7 @@ struct NYql::NPureCalc::TInputSpecTraits<TFilterInputSpec> {
236
249
static constexpr bool IsPartial = false ;
237
250
static constexpr bool SupportPushStreamMode = true ;
238
251
239
- using TConsumerType = THolder<NYql::NPureCalc::IConsumer<std::pair< const TVector<ui64>&, const TVector< const NKikimr::NMiniKQL::TUnboxedValueVector*>&> >>;
252
+ using TConsumerType = THolder<NYql::NPureCalc::IConsumer<TInputType >>;
240
253
241
254
static TConsumerType MakeConsumer (
242
255
const TFilterInputSpec& spec,
@@ -282,9 +295,9 @@ class TJsonFilter::TImpl {
282
295
LOG_ROW_DISPATCHER_DEBUG (" Program created" );
283
296
}
284
297
285
- void Push (const TVector<ui64>& offsets, const TVector<const NKikimr::NMiniKQL::TUnboxedValueVector *>& values) {
298
+ void Push (const TVector<ui64>& offsets, const TVector<const TVector<NYql::NUdf::TUnboxedValue> *>& values, ui64 rowsOffset, ui64 numberRows ) {
286
299
Y_ENSURE (values, " Expected non empty schema" );
287
- InputConsumer->OnObject (std::make_pair ( offsets, values) );
300
+ InputConsumer->OnObject ({. Offsets = offsets, . Values = values, . RowsOffset = rowsOffset, . NumberRows = numberRows} );
288
301
}
289
302
290
303
TString GetSql () const {
@@ -305,7 +318,7 @@ class TJsonFilter::TImpl {
305
318
306
319
private:
307
320
THolder<NYql::NPureCalc::TPushStreamProgram<TFilterInputSpec, TFilterOutputSpec>> Program;
308
- THolder<NYql::NPureCalc::IConsumer<std::pair< const TVector<ui64>&, const TVector< const NKikimr::NMiniKQL::TUnboxedValueVector*>&> >> InputConsumer;
321
+ THolder<NYql::NPureCalc::IConsumer<TInputType >> InputConsumer;
309
322
const TString Sql;
310
323
};
311
324
@@ -322,8 +335,8 @@ TJsonFilter::TJsonFilter(
322
335
TJsonFilter::~TJsonFilter () {
323
336
}
324
337
325
- void TJsonFilter::Push (const TVector<ui64>& offsets, const TVector<const NKikimr::NMiniKQL::TUnboxedValueVector *>& values) {
326
- Impl->Push (offsets, values);
338
+ void TJsonFilter::Push (const TVector<ui64>& offsets, const TVector<const TVector<NYql::NUdf::TUnboxedValue> *>& values, ui64 rowsOffset, ui64 numberRows ) {
339
+ Impl->Push (offsets, values, rowsOffset, numberRows );
327
340
}
328
341
329
342
TString TJsonFilter::GetSql () {
0 commit comments