@@ -2110,46 +2110,47 @@ absl::StatusOr<DataSliceImpl> DataBagImpl::GetDictSize(
21102110}
21112111
21122112template <class AllocCheckFn >
2113- absl::StatusOr<DataSliceImpl> DataBagImpl::GetFromDictNoFallback (
2114- const arolla::DenseArray<ObjectId>& dicts,
2115- const DataSliceImpl& keys ) const {
2113+ absl::Status DataBagImpl::GetFromDictNoFallback (
2114+ const arolla::DenseArray<ObjectId>& dicts, const DataSliceImpl& keys,
2115+ SliceBuilder& bldr ) const {
21162116 if (dicts.size () != keys.size ()) {
21172117 return absl::InvalidArgumentError (
21182118 absl::StrFormat (" dicts and keys sizes don't match: %d vs %d" ,
21192119 dicts.size (), keys.size ()));
21202120 }
21212121
21222122 ReadOnlyDictGetter<AllocCheckFn> dict_getter (this );
2123- SliceBuilder bldr (dicts.size ());
21242123
21252124 if (keys.is_mixed_dtype ()) {
21262125 dicts.ForEachPresent ([&](int64_t offset, ObjectId dict_id) {
2127- bldr.InsertIfNotSetAndUpdateAllocIds (
2128- offset, dict_getter (dict_id).Get (keys[offset]));
2126+ if (auto val = dict_getter (dict_id).Get (keys[offset]); val.has_value ()) {
2127+ bldr.InsertIfNotSetAndUpdateAllocIds (offset, *val);
2128+ }
21292129 });
21302130 } else {
21312131 absl::Status status = absl::OkStatus ();
21322132 keys.VisitValues ([&](const auto & vec) {
21332133 using T = typename std::decay_t <decltype (vec)>::base_type;
21342134 status = arolla::DenseArraysForEachPresent (
21352135 [&](int64_t offset, ObjectId dict_id, arolla::view_type_t <T> key) {
2136- bldr.InsertIfNotSetAndUpdateAllocIds (
2137- offset, dict_getter (dict_id).Get (DataItem::View<T>{key}));
2136+ if (auto val = dict_getter (dict_id).Get (DataItem::View<T>{key});
2137+ val.has_value ()) {
2138+ bldr.InsertIfNotSetAndUpdateAllocIds (offset, *val);
2139+ }
21382140 },
21392141 dicts, vec);
21402142 });
21412143 RETURN_IF_ERROR (status);
21422144 }
21432145
2144- RETURN_IF_ERROR (dict_getter.status ());
2145- return std::move (bldr).Build ();
2146+ return dict_getter.status ();
21462147}
21472148
21482149template <class AllocCheckFn >
2149- absl::StatusOr<DataSliceImpl> DataBagImpl::GetFromDictNoFallback (
2150- const arolla::DenseArray<ObjectId>& dicts, const DataItem& keys) const {
2150+ absl::Status DataBagImpl::GetFromDictNoFallback (
2151+ const arolla::DenseArray<ObjectId>& dicts, const DataItem& keys,
2152+ SliceBuilder& bldr) const {
21512153 ReadOnlyDictGetter<AllocCheckFn> dict_getter (this );
2152- SliceBuilder bldr (dicts.size ());
21532154
21542155 keys.VisitValue ([&](const auto & val) {
21552156 using T = typename std::decay_t <decltype (val)>;
@@ -2159,29 +2160,25 @@ absl::StatusOr<DataSliceImpl> DataBagImpl::GetFromDictNoFallback(
21592160 });
21602161 });
21612162
2162- RETURN_IF_ERROR (dict_getter.status ());
2163- return std::move (bldr).Build ();
2163+ return dict_getter.status ();
21642164}
21652165
21662166template <class AllocCheckFn , class DataSliceImplT >
21672167inline absl::StatusOr<DataSliceImpl> DataBagImpl::GetFromDictImpl (
21682168 const DataSliceImpl& dicts, const DataSliceImplT& keys,
21692169 FallbackSpan fallbacks) const {
21702170 const auto & dict_objects = dicts.values <ObjectId>();
2171- ASSIGN_OR_RETURN (auto result,
2172- GetFromDictNoFallback<AllocCheckFn>(dict_objects, keys));
2173- if (fallbacks.empty ()) {
2174- return result;
2175- }
2176-
2171+ SliceBuilder bldr (dicts.size ());
2172+ RETURN_IF_ERROR (
2173+ GetFromDictNoFallback<AllocCheckFn>(dict_objects, keys, bldr));
21772174 for (const DataBagImpl* fallback : fallbacks) {
2178- // TODO: avoid requesting already known objects.
2179- ASSIGN_OR_RETURN (
2180- auto fb_result,
2181- fallback->GetFromDictNoFallback <AllocCheckFn>(dict_objects, keys));
2182- ASSIGN_OR_RETURN (result, PresenceOrOp{}(result, fb_result ));
2175+ if (bldr. is_finalized ()) {
2176+ break ;
2177+ }
2178+ RETURN_IF_ERROR ( fallback->GetFromDictNoFallback <AllocCheckFn>(dict_objects,
2179+ keys, bldr ));
21832180 }
2184- return result ;
2181+ return std::move (bldr). Build () ;
21852182}
21862183
21872184absl::StatusOr<DataSliceImpl> DataBagImpl::GetFromDict (
@@ -2387,7 +2384,10 @@ ABSL_ATTRIBUTE_ALWAYS_INLINE DataItem
23872384DataBagImpl::GetFromDictObject (ObjectId dict_id, const Key& key) const {
23882385 AllocationId alloc_id (dict_id);
23892386 if (const auto * dicts = GetConstDictsOrNull (alloc_id); dicts != nullptr ) {
2390- return (**dicts)[dict_id.Offset ()].Get (key);
2387+ if (auto res_opt = (**dicts)[dict_id.Offset ()].Get (key);
2388+ res_opt.has_value ()) {
2389+ return *res_opt;
2390+ }
23912391 }
23922392 return DataItem ();
23932393}
@@ -2401,21 +2401,20 @@ DataBagImpl::GetFromDictObjectWithFallbacks(ObjectId dict_id, const Key& key,
24012401 }
24022402 AllocationId alloc_id (dict_id);
24032403 size_t alloc_hash = absl::HashOf (alloc_id);
2404- size_t key_hash = DataItem::Hash ()(key);
24052404 int64_t offset = dict_id.Offset ();
24062405 if (const auto * dicts = GetConstDictsOrNull (alloc_id, alloc_hash);
24072406 dicts != nullptr ) {
2408- DataItem res = (**dicts)[offset].Get (key, key_hash );
2407+ auto res = (**dicts)[offset].Get (key);
24092408 if (res.has_value () || fallbacks.empty ()) {
2410- return res;
2409+ return * res;
24112410 }
24122411 }
24132412 for (const DataBagImpl* fallback : fallbacks) {
24142413 if (const auto * dicts = fallback->GetConstDictsOrNull (alloc_id, alloc_hash);
24152414 dicts != nullptr ) {
2416- DataItem res = (**dicts)[offset].Get (key, key_hash );
2415+ auto res = (**dicts)[offset].Get (key);
24172416 if (res.has_value ()) {
2418- return res;
2417+ return * res;
24192418 }
24202419 }
24212420 }
@@ -3177,23 +3176,24 @@ absl::Status DataBagImpl::MergeDictsInplace(const DataBagImpl& other,
31773176 auto & this_dict = this_dicts[i];
31783177 for (const DataItem& key : other_dict.GetKeys ()) {
31793178 if (conflict_policy == MergeOptions::kOverwrite ) {
3180- this_dict.Set (key, other_dict.Get (key));
3179+ this_dict.Set (key, * other_dict.Get (key));
31813180 continue ;
31823181 }
3183- const DataItem& other_value = other_dict.Get (key);
3182+ auto other_value = other_dict.Get (key);
31843183 if (!other_value.has_value ()) {
31853184 continue ;
31863185 }
3187- const DataItem& this_value = this_dict.GetOrAssign (key, other_value);
3186+ const DataItem& this_value =
3187+ this_dict.GetOrAssign (key, other_value->get ());
31883188 if (conflict_policy == MergeOptions::kRaiseOnConflict &&
3189- this_value != other_value) {
3189+ this_value != other_value-> get () ) {
31903190 internal::ObjectId object_id = alloc_id.ObjectByOffset (i);
31913191 return internal::WithErrorPayload (
31923192 absl::FailedPreconditionError (absl::StrCat (
31933193 " conflicting dict values for " , object_id, " key" , key,
3194- " : " , this_value, " vs " , other_value)),
3194+ " : " , this_value, " vs " , * other_value)),
31953195 MakeSchemaOrDictMergeError (object_id, key, this_value,
3196- other_value));
3196+ * other_value));
31973197 }
31983198 }
31993199 }
@@ -3318,7 +3318,7 @@ void DataBagImpl::AddDictToContent(
33183318 std::vector<DataItem> values;
33193319 values.reserve (keys.size ());
33203320 for (size_t ki = 0 ; ki < keys.size (); ++ki) {
3321- values.push_back (dict.Get (keys[ki]));
3321+ values.push_back (* dict.Get (keys[ki]));
33223322 }
33233323 res.push_back ({dict_id, std::move (keys), std::move (values)});
33243324}
0 commit comments