Skip to content

Commit c712d0b

Browse files
committed
Extract Builder from Trace
1 parent 617ac52 commit c712d0b

File tree

15 files changed

+186
-143
lines changed

15 files changed

+186
-143
lines changed

examples/monoid-bfs.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ where G::Timestamp: Lattice+Ord {
131131

132132
use differential_dataflow::operators::iterate::SemigroupVariable;
133133
use differential_dataflow::operators::reduce::ReduceCore;
134-
use differential_dataflow::trace::implementations::KeySpine;
134+
use differential_dataflow::trace::implementations::{KeySpine, KeyBuilder};
135135

136136

137137
use timely::order::Product;
@@ -146,7 +146,7 @@ where G::Timestamp: Lattice+Ord {
146146
.join_map(&edges, |_k,&(),d| *d)
147147
.concat(&roots)
148148
.map(|x| (x,()))
149-
.reduce_core::<_,KeySpine<_,_,_>>("Reduce", |_key, input, output, updates| {
149+
.reduce_core::<_,KeyBuilder<_,_,_>,KeySpine<_,_,_>>("Reduce", |_key, input, output, updates| {
150150
if output.is_empty() || input[0].1 < output[0].1 {
151151
updates.push(((), input[0].1));
152152
}

examples/spines.rs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,46 +28,46 @@ fn main() {
2828

2929
match mode.as_str() {
3030
"new" => {
31-
use differential_dataflow::trace::implementations::ord_neu::{ColKeyBatcher, ColKeySpine};
32-
let data = data.arrange::<ColKeyBatcher<_,_,_>, ColKeySpine<_,_,_>>();
33-
let keys = keys.arrange::<ColKeyBatcher<_,_,_>, ColKeySpine<_,_,_>>();
31+
use differential_dataflow::trace::implementations::ord_neu::{ColKeyBatcher, ColKeyBuilder, ColKeySpine};
32+
let data = data.arrange::<ColKeyBatcher<_,_,_>, ColKeyBuilder<_,_,_>, ColKeySpine<_,_,_>>();
33+
let keys = keys.arrange::<ColKeyBatcher<_,_,_>, ColKeyBuilder<_,_,_>, ColKeySpine<_,_,_>>();
3434
keys.join_core(&data, |_k, &(), &()| Option::<()>::None)
3535
.probe_with(&mut probe);
3636
},
3737
"old" => {
38-
use differential_dataflow::trace::implementations::ord_neu::{OrdKeyBatcher, OrdKeySpine};
39-
let data = data.arrange::<OrdKeyBatcher<_,_,_>, OrdKeySpine<_,_,_>>();
40-
let keys = keys.arrange::<OrdKeyBatcher<_,_,_>, OrdKeySpine<_,_,_>>();
38+
use differential_dataflow::trace::implementations::ord_neu::{OrdKeyBatcher, RcOrdKeyBuilder, OrdKeySpine};
39+
let data = data.arrange::<OrdKeyBatcher<_,_,_>, RcOrdKeyBuilder<_,_,_>, OrdKeySpine<_,_,_>>();
40+
let keys = keys.arrange::<OrdKeyBatcher<_,_,_>, RcOrdKeyBuilder<_,_,_>, OrdKeySpine<_,_,_>>();
4141
keys.join_core(&data, |_k, &(), &()| Option::<()>::None)
4242
.probe_with(&mut probe);
4343
},
4444
"rhh" => {
45-
use differential_dataflow::trace::implementations::rhh::{HashWrapper, VecBatcher, VecSpine};
46-
let data = data.map(|x| HashWrapper { inner: x }).arrange::<VecBatcher<_,(),_,_>, VecSpine<_,(),_,_>>();
47-
let keys = keys.map(|x| HashWrapper { inner: x }).arrange::<VecBatcher<_,(),_,_>, VecSpine<_,(),_,_>>();
45+
use differential_dataflow::trace::implementations::rhh::{HashWrapper, VecBatcher, VecBuilder, VecSpine};
46+
let data = data.map(|x| HashWrapper { inner: x }).arrange::<VecBatcher<_,(),_,_>, VecBuilder<_,(),_,_>, VecSpine<_,(),_,_>>();
47+
let keys = keys.map(|x| HashWrapper { inner: x }).arrange::<VecBatcher<_,(),_,_>, VecBuilder<_,(),_,_>, VecSpine<_,(),_,_>>();
4848
keys.join_core(&data, |_k, &(), &()| Option::<()>::None)
4949
.probe_with(&mut probe);
5050
},
5151
"slc" => {
5252

53-
use differential_dataflow::trace::implementations::ord_neu::{PreferredBatcher, PreferredSpine};
53+
use differential_dataflow::trace::implementations::ord_neu::{PreferredBatcher, PreferredBuilder, PreferredSpine};
5454

5555
let data =
5656
data.map(|x| (x.clone().into_bytes(), x.into_bytes()))
57-
.arrange::<PreferredBatcher<[u8],[u8],_,_>, PreferredSpine<[u8],[u8],_,_>>()
58-
.reduce_abelian::<_, _, _, PreferredSpine<[u8],(),_,_>>("distinct", |_,_,output| output.push(((), 1)));
57+
.arrange::<PreferredBatcher<[u8],[u8],_,_>, PreferredBuilder<[u8],[u8],_,_>, PreferredSpine<[u8],[u8],_,_>>()
58+
.reduce_abelian::<_, _, _, PreferredBuilder<[u8],(),_,_>, PreferredSpine<[u8],(),_,_>>("distinct", |_,_,output| output.push(((), 1)));
5959
let keys =
6060
keys.map(|x| (x.clone().into_bytes(), 7))
61-
.arrange::<PreferredBatcher<[u8],u8,_,_>, PreferredSpine<[u8],u8,_,_>>()
62-
.reduce_abelian::<_, _, _, PreferredSpine<[u8],(),_,_>>("distinct", |_,_,output| output.push(((), 1)));
61+
.arrange::<PreferredBatcher<[u8],u8,_,_>, PreferredBuilder<[u8],u8,_,_>, PreferredSpine<[u8],u8,_,_>>()
62+
.reduce_abelian::<_, _, _, PreferredBuilder<[u8],(),_,_>,PreferredSpine<[u8],(),_,_>>("distinct", |_,_,output| output.push(((), 1)));
6363

6464
keys.join_core(&data, |_k, &(), &()| Option::<()>::None)
6565
.probe_with(&mut probe);
6666
},
6767
"flat" => {
68-
use differential_dataflow::trace::implementations::ord_neu::{FlatKeyBatcherDefault, FlatKeySpineDefault};
69-
let data = data.arrange::<FlatKeyBatcherDefault<String,usize,isize,_>, FlatKeySpineDefault<String,usize,isize>>();
70-
let keys = keys.arrange::<FlatKeyBatcherDefault<String,usize,isize,_>, FlatKeySpineDefault<String,usize,isize>>();
68+
use differential_dataflow::trace::implementations::ord_neu::{FlatKeyBatcherDefault, FlatKeyBuilderDefault, FlatKeySpineDefault};
69+
let data = data.arrange::<FlatKeyBatcherDefault<String,usize,isize,_>, FlatKeyBuilderDefault<String,usize,isize>, FlatKeySpineDefault<String,usize,isize>>();
70+
let keys = keys.arrange::<FlatKeyBatcherDefault<String,usize,isize,_>, FlatKeyBuilderDefault<String,usize,isize>, FlatKeySpineDefault<String,usize,isize>>();
7171
keys.join_core(&data, |_k, (), ()| Option::<()>::None)
7272
.probe_with(&mut probe);
7373
}

src/algorithms/graphs/propagate.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ where
8484

8585
use crate::operators::reduce::ReduceCore;
8686
use crate::operators::iterate::SemigroupVariable;
87-
use crate::trace::implementations::ValSpine;
87+
use crate::trace::implementations::{ValBuilder, ValSpine};
8888

8989
use timely::order::Product;
9090

@@ -96,7 +96,7 @@ where
9696
let labels =
9797
proposals
9898
.concat(&nodes)
99-
.reduce_abelian::<_,ValSpine<_,_,_,_>>("Propagate", |_, s, t| t.push((s[0].0.clone(), R::from(1_i8))));
99+
.reduce_abelian::<_,ValBuilder<_,_,_,_>,ValSpine<_,_,_,_>>("Propagate", |_, s, t| t.push((s[0].0.clone(), R::from(1_i8))));
100100

101101
let propagate: Collection<_, (N, L), R> =
102102
labels

src/operators/arrange/arrangement.rs

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use crate::{Data, ExchangeData, Collection, AsCollection, Hashable};
3030
use crate::difference::Semigroup;
3131
use crate::lattice::Lattice;
3232
use crate::trace::{self, Trace, TraceReader, Batch, BatchReader, Batcher, Builder, Cursor};
33-
use crate::trace::implementations::{KeyBatcher, KeySpine, ValBatcher, ValSpine};
33+
use crate::trace::implementations::{KeyBatcher, KeyBuilder, KeySpine, ValBatcher, ValBuilder, ValSpine};
3434

3535
use trace::wrappers::enter::{TraceEnter, BatchEnter,};
3636
use trace::wrappers::enter_at::TraceEnter as TraceEnterAt;
@@ -289,7 +289,7 @@ where
289289
T1: TraceReader + Clone + 'static,
290290
{
291291
/// A direct implementation of `ReduceCore::reduce_abelian`.
292-
pub fn reduce_abelian<L, K, V, T2>(&self, name: &str, mut logic: L) -> Arranged<G, TraceAgent<T2>>
292+
pub fn reduce_abelian<L, K, V, Bu, T2>(&self, name: &str, mut logic: L) -> Arranged<G, TraceAgent<T2>>
293293
where
294294
for<'a> T1::Key<'a>: IntoOwned<'a, Owned = K>,
295295
T2: for<'a> Trace<Key<'a>= T1::Key<'a>, Time=T1::Time>+'static,
@@ -298,10 +298,11 @@ where
298298
for<'a> T2::Val<'a> : IntoOwned<'a, Owned = V>,
299299
T2::Diff: Abelian,
300300
T2::Batch: Batch,
301-
<T2::Builder as Builder>::Input: Container + PushInto<((K, V), T2::Time, T2::Diff)>,
301+
Bu: Builder<Time=G::Timestamp, Output = T2::Batch>,
302+
Bu::Input: Container + PushInto<((K, V), T2::Time, T2::Diff)>,
302303
L: FnMut(T1::Key<'_>, &[(T1::Val<'_>, T1::Diff)], &mut Vec<(V, T2::Diff)>)+'static,
303304
{
304-
self.reduce_core::<_,K,V,T2>(name, move |key, input, output, change| {
305+
self.reduce_core::<_,K,V,Bu,T2>(name, move |key, input, output, change| {
305306
if !input.is_empty() {
306307
logic(key, input, change);
307308
}
@@ -311,19 +312,20 @@ where
311312
}
312313

313314
/// A direct implementation of `ReduceCore::reduce_core`.
314-
pub fn reduce_core<L, K, V, T2>(&self, name: &str, logic: L) -> Arranged<G, TraceAgent<T2>>
315+
pub fn reduce_core<L, K, V, Bu, T2>(&self, name: &str, logic: L) -> Arranged<G, TraceAgent<T2>>
315316
where
316317
for<'a> T1::Key<'a>: IntoOwned<'a, Owned = K>,
317318
T2: for<'a> Trace<Key<'a>=T1::Key<'a>, Time=T1::Time>+'static,
318319
K: Ord + 'static,
319320
V: Data,
320321
for<'a> T2::Val<'a> : IntoOwned<'a, Owned = V>,
321322
T2::Batch: Batch,
322-
<T2::Builder as Builder>::Input: Container + PushInto<((K, V), T2::Time, T2::Diff)>,
323+
Bu: Builder<Time=G::Timestamp, Output = T2::Batch>,
324+
Bu::Input: Container + PushInto<((K, V), T2::Time, T2::Diff)>,
323325
L: FnMut(T1::Key<'_>, &[(T1::Val<'_>, T1::Diff)], &mut Vec<(V, T2::Diff)>, &mut Vec<(V, T2::Diff)>)+'static,
324326
{
325327
use crate::operators::reduce::reduce_trace;
326-
reduce_trace::<_,_,_,_,V,_>(self, name, logic)
328+
reduce_trace::<_,_,Bu,_,_,V,_>(self, name, logic)
327329
}
328330
}
329331

@@ -353,23 +355,23 @@ where
353355
G::Timestamp: Lattice,
354356
{
355357
/// Arranges updates into a shared trace.
356-
fn arrange<Ba, Tr>(&self) -> Arranged<G, TraceAgent<Tr>>
358+
fn arrange<Ba, Bu, Tr>(&self) -> Arranged<G, TraceAgent<Tr>>
357359
where
358360
Ba: Batcher<Input=C, Time=G::Timestamp> + 'static,
361+
Bu: Builder<Time=G::Timestamp, Input=Ba::Output, Output = Tr::Batch>,
359362
Tr: Trace<Time=G::Timestamp> + 'static,
360363
Tr::Batch: Batch,
361-
Tr::Builder: Builder<Input=Ba::Output>,
362364
{
363-
self.arrange_named::<Ba, Tr>("Arrange")
365+
self.arrange_named::<Ba, Bu, Tr>("Arrange")
364366
}
365367

366368
/// Arranges updates into a shared trace, with a supplied name.
367-
fn arrange_named<Ba, Tr>(&self, name: &str) -> Arranged<G, TraceAgent<Tr>>
369+
fn arrange_named<Ba, Bu, Tr>(&self, name: &str) -> Arranged<G, TraceAgent<Tr>>
368370
where
369371
Ba: Batcher<Input=C, Time=G::Timestamp> + 'static,
372+
Bu: Builder<Time=G::Timestamp, Input=Ba::Output, Output = Tr::Batch>,
370373
Tr: Trace<Time=G::Timestamp> + 'static,
371374
Tr::Batch: Batch,
372-
Tr::Builder: Builder<Input=Ba::Output>,
373375
;
374376
}
375377

@@ -381,15 +383,15 @@ where
381383
V: ExchangeData,
382384
R: ExchangeData + Semigroup,
383385
{
384-
fn arrange_named<Ba, Tr>(&self, name: &str) -> Arranged<G, TraceAgent<Tr>>
386+
fn arrange_named<Ba, Bu, Tr>(&self, name: &str) -> Arranged<G, TraceAgent<Tr>>
385387
where
386388
Ba: Batcher<Input=Vec<((K, V), G::Timestamp, R)>, Time=G::Timestamp> + 'static,
389+
Bu: Builder<Time=G::Timestamp, Input=Ba::Output, Output = Tr::Batch>,
387390
Tr: Trace<Time=G::Timestamp> + 'static,
388391
Tr::Batch: Batch,
389-
Tr::Builder: Builder<Input=Ba::Output>,
390392
{
391393
let exchange = Exchange::new(move |update: &((K,V),G::Timestamp,R)| (update.0).0.hashed().into());
392-
arrange_core::<_, _, Ba, _>(&self.inner, exchange, name)
394+
arrange_core::<_, _, Ba, Bu, _>(&self.inner, exchange, name)
393395
}
394396
}
395397

@@ -398,16 +400,16 @@ where
398400
/// This operator arranges a stream of values into a shared trace, whose contents it maintains.
399401
/// It uses the supplied parallelization contract to distribute the data, which does not need to
400402
/// be consistently by key (though this is the most common).
401-
pub fn arrange_core<G, P, Ba, Tr>(stream: &StreamCore<G, Ba::Input>, pact: P, name: &str) -> Arranged<G, TraceAgent<Tr>>
403+
pub fn arrange_core<G, P, Ba, Bu, Tr>(stream: &StreamCore<G, Ba::Input>, pact: P, name: &str) -> Arranged<G, TraceAgent<Tr>>
402404
where
403405
G: Scope,
404406
G::Timestamp: Lattice,
405407
P: ParallelizationContract<G::Timestamp, Ba::Input>,
406408
Ba: Batcher<Time=G::Timestamp> + 'static,
407409
Ba::Input: Container,
410+
Bu: Builder<Time=G::Timestamp, Input=Ba::Output, Output = Tr::Batch>,
408411
Tr: Trace<Time=G::Timestamp>+'static,
409412
Tr::Batch: Batch,
410-
Tr::Builder: Builder<Input=Ba::Output>,
411413
{
412414
// The `Arrange` operator is tasked with reacting to an advancing input
413415
// frontier by producing the sequence of batches whose lower and upper
@@ -515,7 +517,7 @@ where
515517
}
516518

517519
// Extract updates not in advance of `upper`.
518-
let batch = batcher.seal::<Tr::Builder>(upper.clone());
520+
let batch = batcher.seal::<Bu>(upper.clone());
519521

520522
writer.insert(batch.clone(), Some(capability.time().clone()));
521523

@@ -543,7 +545,7 @@ where
543545
}
544546
else {
545547
// Announce progress updates, even without data.
546-
let _batch = batcher.seal::<Tr::Builder>(input.frontier().frontier().to_owned());
548+
let _batch = batcher.seal::<Bu>(input.frontier().frontier().to_owned());
547549
writer.seal(input.frontier().frontier().to_owned());
548550
}
549551

@@ -562,15 +564,15 @@ impl<G: Scope, K: ExchangeData+Hashable, R: ExchangeData+Semigroup> Arrange<G, V
562564
where
563565
G::Timestamp: Lattice+Ord,
564566
{
565-
fn arrange_named<Ba, Tr>(&self, name: &str) -> Arranged<G, TraceAgent<Tr>>
567+
fn arrange_named<Ba, Bu, Tr>(&self, name: &str) -> Arranged<G, TraceAgent<Tr>>
566568
where
567569
Ba: Batcher<Input=Vec<((K,()),G::Timestamp,R)>, Time=G::Timestamp> + 'static,
570+
Bu: Builder<Time=G::Timestamp, Input=Ba::Output, Output = Tr::Batch>,
568571
Tr: Trace<Time=G::Timestamp> + 'static,
569572
Tr::Batch: Batch,
570-
Tr::Builder: Builder<Input=Ba::Output>,
571573
{
572574
let exchange = Exchange::new(move |update: &((K,()),G::Timestamp,R)| (update.0).0.hashed().into());
573-
arrange_core::<_,_,Ba,_>(&self.map(|k| (k, ())).inner, exchange, name)
575+
arrange_core::<_,_,Ba,Bu,_>(&self.map(|k| (k, ())).inner, exchange, name)
574576
}
575577
}
576578

@@ -601,7 +603,7 @@ where
601603
}
602604

603605
fn arrange_by_key_named(&self, name: &str) -> Arranged<G, TraceAgent<ValSpine<K, V, G::Timestamp, R>>> {
604-
self.arrange_named::<ValBatcher<_,_,_,_>, _>(name)
606+
self.arrange_named::<ValBatcher<_,_,_,_>,ValBuilder<_,_,_,_>,_>(name)
605607
}
606608
}
607609

@@ -636,6 +638,6 @@ where
636638

637639
fn arrange_by_self_named(&self, name: &str) -> Arranged<G, TraceAgent<KeySpine<K, G::Timestamp, R>>> {
638640
self.map(|k| (k, ()))
639-
.arrange_named::<KeyBatcher<_,_,_>, _>(name)
641+
.arrange_named::<KeyBatcher<_,_,_>,KeyBuilder<_,_,_>,_>(name)
640642
}
641643
}

src/operators/arrange/upsert.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@
5555
//! worker.dataflow(|scope| {
5656
//!
5757
//! use timely::dataflow::operators::Input;
58-
//! use differential_dataflow::trace::implementations::ValSpine;
58+
//! use differential_dataflow::trace::implementations::{ValBuilder, ValSpine};
5959
//! use differential_dataflow::operators::arrange::upsert;
6060
//!
6161
//! let stream = scope.input_from(&mut input);
62-
//! let arranged = upsert::arrange_from_upsert::<_, _, _, ValSpine<Key, Val, _, _>>(&stream, &"test");
62+
//! let arranged = upsert::arrange_from_upsert::<_, _, _, ValBuilder<Key, Val, _, _>, ValSpine<Key, Val, _, _>>(&stream, &"test");
6363
//!
6464
//! arranged
6565
//! .as_collection(|k,v| (k.clone(), v.clone()))
@@ -126,7 +126,7 @@ use super::TraceAgent;
126126
/// This method is only implemented for totally ordered times, as we do not yet
127127
/// understand what a "sequence" of upserts would mean for partially ordered
128128
/// timestamps.
129-
pub fn arrange_from_upsert<G, K, V, Tr>(
129+
pub fn arrange_from_upsert<G, K, V, Bu, Tr>(
130130
stream: &Stream<G, (K, Option<V>, G::Timestamp)>,
131131
name: &str,
132132
) -> Arranged<G, TraceAgent<Tr>>
@@ -139,7 +139,7 @@ where
139139
for<'a> Tr::Val<'a> : IntoOwned<'a, Owned = V>,
140140
Tr::Time: TotalOrder+ExchangeData,
141141
Tr::Batch: Batch,
142-
Tr::Builder: Builder<Input = Vec<((K, V), Tr::Time, Tr::Diff)>>,
142+
Bu: Builder<Time=G::Timestamp, Input = Vec<((K, V), Tr::Time, Tr::Diff)>, Output = Tr::Batch>,
143143
{
144144
let mut reader: Option<TraceAgent<Tr>> = None;
145145

@@ -240,7 +240,7 @@ where
240240
// Prepare a cursor to the existing arrangement, and a batch builder for
241241
// new stuff that we add.
242242
let (mut trace_cursor, trace_storage) = reader_local.cursor();
243-
let mut builder = Tr::Builder::new();
243+
let mut builder = Bu::new();
244244
for (key, mut list) in to_process.drain(..) {
245245

246246
// The prior value associated with the key.

src/operators/arrange/writer.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
use std::rc::{Rc, Weak};
77
use std::cell::RefCell;
88

9-
use timely::progress::{Antichain, Timestamp};
9+
use timely::progress::Antichain;
1010

1111
use crate::trace::{Trace, Batch, BatchReader};
1212
use crate::trace::wrappers::rc::TraceBox;
@@ -93,10 +93,7 @@ where
9393
/// Inserts an empty batch up to `upper`.
9494
pub fn seal(&mut self, upper: Antichain<Tr::Time>) {
9595
if self.upper != upper {
96-
use crate::trace::Builder;
97-
let builder = Tr::Builder::new();
98-
let batch = builder.done(self.upper.clone(), upper, Antichain::from_elem(Tr::Time::minimum()));
99-
self.insert(batch, None);
96+
self.insert(Tr::Batch::empty(self.upper.clone(), upper), None);
10097
}
10198
}
10299
}

src/operators/consolidate.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,22 +47,22 @@ where
4747
/// });
4848
/// ```
4949
pub fn consolidate(&self) -> Self {
50-
use crate::trace::implementations::{KeyBatcher, KeySpine};
51-
self.consolidate_named::<KeyBatcher<_, _, _>, KeySpine<_,_,_>>("Consolidate")
50+
use crate::trace::implementations::{KeyBatcher, KeyBuilder, KeySpine};
51+
self.consolidate_named::<KeyBatcher<_, _, _>,KeyBuilder<_,_,_>, KeySpine<_,_,_>>("Consolidate")
5252
}
5353

5454
/// As `consolidate` but with the ability to name the operator and specify the trace type.
55-
pub fn consolidate_named<Ba, Tr>(&self, name: &str) -> Self
55+
pub fn consolidate_named<Ba, Bu, Tr>(&self, name: &str) -> Self
5656
where
5757
Ba: Batcher<Input=Vec<((D,()),G::Timestamp,R)>, Time=G::Timestamp> + 'static,
5858
Tr: crate::trace::Trace<Time=G::Timestamp,Diff=R>+'static,
5959
for<'a> Tr::Key<'a>: IntoOwned<'a, Owned = D>,
6060
Tr::Batch: crate::trace::Batch,
61-
Tr::Builder: Builder<Input=Ba::Output>,
61+
Bu: Builder<Time=Tr::Time, Input=Ba::Output, Output=Tr::Batch>,
6262
{
6363
use crate::operators::arrange::arrangement::Arrange;
6464
self.map(|k| (k, ()))
65-
.arrange_named::<Ba, Tr>(name)
65+
.arrange_named::<Ba, Bu, Tr>(name)
6666
.as_collection(|d, _| d.into_owned())
6767
}
6868

0 commit comments

Comments
 (0)