diff --git a/ydb/library/yql/providers/generic/actors/ut/yql_generic_lookup_actor_ut.cpp b/ydb/library/yql/providers/generic/actors/ut/yql_generic_lookup_actor_ut.cpp index c940fdbdbbc0..9e1d1bb5f8bd 100644 --- a/ydb/library/yql/providers/generic/actors/ut/yql_generic_lookup_actor_ut.cpp +++ b/ydb/library/yql/providers/generic/actors/ut/yql_generic_lookup_actor_ut.cpp @@ -126,6 +126,12 @@ Y_UNIT_TEST_SUITE(GenericProviderLookupActor) { .Operand().Equal().Column("optional_id").OptionalValue(100).Done().Done() .Done() .Done() + .Operand() + .Conjunction() + .Operand().Equal().Column("id").Value(2).Done().Done() + .Operand().Equal().Column("optional_id").OptionalValue(102).Done().Done() + .Done() + .Done() .Done() .Done() .Done() diff --git a/ydb/library/yql/providers/generic/actors/yql_generic_lookup_actor.cpp b/ydb/library/yql/providers/generic/actors/yql_generic_lookup_actor.cpp index e1f3854b79b6..62e8fb5e3510 100644 --- a/ydb/library/yql/providers/generic/actors/yql_generic_lookup_actor.cpp +++ b/ydb/library/yql/providers/generic/actors/yql_generic_lookup_actor.cpp @@ -414,18 +414,30 @@ namespace NYql::NDq { select.mutable_from()->Settable(LookupSource.table()); NConnector::NApi::TPredicate_TDisjunction disjunction; - for (const auto& [k, _] : *Request) { + auto addClause = [&disjunction, KeyType = this->KeyType](ui32 columns, auto&& getter) { NConnector::NApi::TPredicate_TConjunction conjunction; - for (ui32 c = 0; c != KeyType->GetMembersCount(); ++c) { + for (ui32 c = 0; c != columns; ++c) { NConnector::NApi::TPredicate_TComparison eq; eq.Setoperation(NConnector::NApi::TPredicate_TComparison_EOperation::TPredicate_TComparison_EOperation_EQ); eq.mutable_left_value()->Setcolumn(TString(KeyType->GetMemberName(c))); auto rightTypedValue = eq.mutable_right_value()->mutable_typed_value(); ExportTypeToProto(KeyType->GetMemberType(c), *rightTypedValue->mutable_type()); - ExportValueToProto(KeyType->GetMemberType(c), k.GetElement(c), *rightTypedValue->mutable_value()); + ExportValueToProto(KeyType->GetMemberType(c), getter(c), *rightTypedValue->mutable_value()); *conjunction.mutable_operands()->Add()->mutable_comparison() = eq; } *disjunction.mutable_operands()->Add()->mutable_conjunction() = conjunction; + }; + for (const auto& [k, _] : *Request) { + addClause(KeyType->GetMembersCount(), [&k = k](auto c) { + return k.GetElement(c); + }); + } + auto& k = Request->begin()->first; // Request is never empty + // Pad query with dummy clauses to improve caching + for (ui32 nRequests = Request->size(); !IsPowerOf2(nRequests) && nRequests < MaxKeysInRequest; ++nRequests) { + addClause(KeyType->GetMembersCount(), [&k = k](auto c) { + return k.GetElement(c); + }); } *select.mutable_where()->mutable_filter_typed()->mutable_disjunction() = disjunction; return {};