@@ -29,72 +29,59 @@ TConclusion<bool> TStreamLogicProcessor::OnInputReady(
29
29
const ui32 inputId, const TProcessorContext& context, const TExecutionNodeContext& /* nodeContext*/ ) const {
30
30
auto accInput = context.GetResources ()->GetAccessorVerified (inputId);
31
31
32
- std::shared_ptr<arrow::Scalar> monoValue;
33
32
AFL_VERIFY (!context.GetResources ()->HasMarker (FinishMarker));
34
33
const auto accResult = context.GetResources ()->GetAccessorOptional (GetOutputColumnIdOnce ());
35
34
36
- const auto isMonoValue = accInput->CheckOneValueAccessor (monoValue);
37
- if (isMonoValue && *isMonoValue) {
38
- const auto isFalseConclusion = ScalarIsFalse (monoValue);
39
- if (isFalseConclusion.IsFail ()) {
40
- return isFalseConclusion;
41
- }
42
- const auto isTrueConclusion = ScalarIsTrue (monoValue);
43
- if (isTrueConclusion.IsFail ()) {
44
- return isTrueConclusion;
45
- }
46
- AFL_VERIFY (*isFalseConclusion || *isTrueConclusion);
35
+ TConclusion<std::optional<bool >> isMonoInput = GetMonoInput (accInput);
36
+ if (isMonoInput.IsFail ()) {
37
+ return isMonoInput;
38
+ }
39
+
40
+ if (isMonoInput.GetResult ()) {
41
+ const bool monoValue = *isMonoInput.GetResult ();
47
42
if (Operation == NKernels::EOperation::And) {
48
- if (*isTrueConclusion ) {
43
+ if (monoValue ) {
49
44
if (!accResult) {
50
45
context.GetResources ()->AddVerified (GetOutputColumnIdOnce (),
51
- std::make_shared<NAccessor::TSparsedArray>(
52
- std::make_shared<arrow::UInt8Scalar>(1 ), arrow::uint8 (), context.GetResources ()->GetRecordsCountActualVerified ()),
53
- false );
46
+ NAccessor::TSparsedArray::BuildTrueArrayUI8 (context.GetResources ()->GetRecordsCountActualVerified ()), false );
54
47
}
55
48
return false ;
56
49
} else {
57
- if (accResult) {
58
- context.GetResources ()->Remove (GetOutputColumnIdOnce (), true );
59
- }
60
- context.GetResources ()->AddVerified (GetOutputColumnIdOnce (),
61
- std::make_shared<NAccessor::TSparsedArray>(
62
- std::make_shared<arrow::UInt8Scalar>(0 ), arrow::uint8 (), context.GetResources ()->GetRecordsCountActualVerified ()),
63
- false );
50
+ context.GetResources ()->Upsert (GetOutputColumnIdOnce (),
51
+ NAccessor::TSparsedArray::BuildFalseArrayUI8 (context.GetResources ()->GetRecordsCountActualVerified ()), false );
64
52
return true ;
65
53
}
66
54
} else if (Operation == NKernels::EOperation::Or) {
67
- if (*isFalseConclusion ) {
55
+ if (!monoValue ) {
68
56
if (!accResult) {
69
57
context.GetResources ()->AddVerified (GetOutputColumnIdOnce (),
70
- std::make_shared<NAccessor::TSparsedArray>(
71
- std::make_shared<arrow::UInt8Scalar>(0 ), arrow::uint8 (), context.GetResources ()->GetRecordsCountActualVerified ()),
72
- false );
58
+ NAccessor::TSparsedArray::BuildFalseArrayUI8 (context.GetResources ()->GetRecordsCountActualVerified ()), false );
73
59
}
74
60
return false ;
75
61
} else {
76
- if (accResult) {
77
- context.GetResources ()->Remove (GetOutputColumnIdOnce (), true );
78
- }
79
- context.GetResources ()->AddVerified (GetOutputColumnIdOnce (),
80
- std::make_shared<NAccessor::TSparsedArray>(
81
- std::make_shared<arrow::UInt8Scalar>(1 ), arrow::uint8 (), context.GetResources ()->GetRecordsCountActualVerified ()),
82
- false );
62
+ context.GetResources ()->Upsert (GetOutputColumnIdOnce (),
63
+ NAccessor::TSparsedArray::BuildTrueArrayUI8 (context.GetResources ()->GetRecordsCountActualVerified ()), false );
83
64
return true ;
84
65
}
85
66
}
86
67
}
87
68
88
69
if (!accResult) {
70
+ AFL_VERIFY (accInput->GetDataType ()->id () == arrow::uint8 ()->id ())(" type" , accInput->GetDataType ()->ToString ());
89
71
context.GetResources ()->AddVerified (GetOutputColumnIdOnce (), accInput, false );
90
72
} else {
91
73
auto result = Function->Call (TColumnChainInfo::BuildVector ({ GetOutputColumnIdOnce (), inputId }), context.GetResources ());
92
74
if (result.IsFail ()) {
93
75
return result;
94
76
}
77
+ auto datum = result.DetachResult ();
95
78
context.GetResources ()->Remove (GetOutputColumnIdOnce ());
96
- context.GetResources ()->AddVerified (GetOutputColumnIdOnce (), std::move (*result), false );
79
+ context.GetResources ()->AddVerified (GetOutputColumnIdOnce (), datum, false );
80
+ if (IsFinishDatum (datum)) {
81
+ return true ;
82
+ }
97
83
}
84
+
98
85
return false ;
99
86
}
100
87
@@ -162,4 +149,57 @@ NJson::TJsonValue TStreamLogicProcessor::DoDebugJson() const {
162
149
return result;
163
150
}
164
151
152
+ bool TStreamLogicProcessor::IsFinishDatum (const arrow::Datum& datum) const {
153
+ const auto arrChecker = [&](const arrow::Array& arr) {
154
+ AFL_VERIFY (arr.type ()->id () == arrow::uint8 ()->id ());
155
+ const arrow::UInt8Array& ui8Arr = static_cast <const arrow::UInt8Array&>(arr);
156
+ const ui8* values = ui8Arr.raw_values ();
157
+ if (Operation == NKernels::EOperation::And) {
158
+ for (ui32 i = 0 ; i < ui8Arr.length (); ++i) {
159
+ if (values[i] != 0 ) {
160
+ return false ;
161
+ }
162
+ }
163
+ } else if (Operation == NKernels::EOperation::Or) {
164
+ for (ui32 i = 0 ; i < ui8Arr.length (); ++i) {
165
+ if (values[i] == 0 ) {
166
+ return false ;
167
+ }
168
+ }
169
+ } else {
170
+ AFL_VERIFY (false )(" op" , Operation);
171
+ }
172
+ return true ;
173
+ };
174
+ if (datum.is_array ()) {
175
+ auto arr = datum.make_array ();
176
+ return arrChecker (*arr);
177
+ } else if (datum.is_arraylike ()) {
178
+ auto arr = datum.chunked_array ();
179
+ AFL_VERIFY (arr->type ()->id () == arrow::uint8 ()->id ());
180
+ for (auto && chunk : arr->chunks ()) {
181
+ if (!arrChecker (*chunk)) {
182
+ return false ;
183
+ }
184
+ }
185
+ return true ;
186
+ } else {
187
+ AFL_VERIFY (false )(" kind" , (ui32)datum.kind ());
188
+ return false ;
189
+ }
190
+ }
191
+
192
+ TConclusion<std::optional<bool >> TStreamLogicProcessor::GetMonoInput (const std::shared_ptr<IChunkedArray>& inputArray) const {
193
+ std::shared_ptr<arrow::Scalar> monoValue;
194
+ const auto isMonoValue = inputArray->CheckOneValueAccessor (monoValue);
195
+ if (!isMonoValue || !*isMonoValue) {
196
+ return std::optional<bool >();
197
+ }
198
+ const auto isFalseConclusion = ScalarIsFalse (monoValue);
199
+ if (isFalseConclusion.IsFail ()) {
200
+ return isFalseConclusion;
201
+ }
202
+ return !*isFalseConclusion;
203
+ }
204
+
165
205
} // namespace NKikimr::NArrow::NSSA
0 commit comments