10
10
import elemental2 .core .JsArray ;
11
11
import elemental2 .core .JsObject ;
12
12
import elemental2 .core .Uint8Array ;
13
+ import elemental2 .dom .AbortController ;
13
14
import elemental2 .dom .DomGlobal ;
14
15
import elemental2 .promise .IThenable ;
15
16
import elemental2 .promise .Promise ;
18
19
import io .deephaven .javascript .proto .dhinternal .io .deephaven .proto .hierarchicaltable_pb .HierarchicalTableSourceExportRequest ;
19
20
import io .deephaven .javascript .proto .dhinternal .io .deephaven .proto .hierarchicaltable_pb .HierarchicalTableViewKeyTableDescriptor ;
20
21
import io .deephaven .javascript .proto .dhinternal .io .deephaven .proto .hierarchicaltable_pb .HierarchicalTableViewRequest ;
22
+ import io .deephaven .javascript .proto .dhinternal .io .deephaven .proto .hierarchicaltable_pb_service .UnaryResponse ;
21
23
import io .deephaven .javascript .proto .dhinternal .io .deephaven .proto .table_pb .Condition ;
22
24
import io .deephaven .javascript .proto .dhinternal .io .deephaven .proto .table_pb .ExportedTableCreationResponse ;
23
25
import io .deephaven .javascript .proto .dhinternal .io .deephaven .proto .table_pb .TableReference ;
36
38
import io .deephaven .web .client .api .subscription .AbstractTableSubscription ;
37
39
import io .deephaven .web .client .api .subscription .SubscriptionType ;
38
40
import io .deephaven .web .client .api .widget .JsWidget ;
41
+ import io .deephaven .web .client .fu .JsAbortSignal ;
39
42
import io .deephaven .web .client .fu .JsItr ;
40
43
import io .deephaven .web .client .fu .JsLog ;
41
44
import io .deephaven .web .client .fu .LazyPromise ;
@@ -149,7 +152,7 @@ private enum RebuildStep {
149
152
private Object [][] keyTableData ;
150
153
private Promise <JsTable > keyTable ;
151
154
152
- private TicketAndPromise <? > viewTicket ;
155
+ private TicketAndPromise <ClientTableState > viewTicket ;
153
156
private Promise <TreeSubscription > stream ;
154
157
155
158
// the "next" set of filters/sorts that we'll use. these either are "==" to the above fields, or are scheduled
@@ -347,30 +350,64 @@ private Promise<JsTable> makeKeyTable() {
347
350
return keyTable ;
348
351
}
349
352
350
- private TicketAndPromise <? > makeView (TicketAndPromise <?> prevTicket ) {
353
+ private TicketAndPromise <ClientTableState > makeView (TicketAndPromise <?> prevTicket ) {
351
354
if (viewTicket != null ) {
352
355
return viewTicket ;
353
356
}
354
357
Ticket ticket = connection .getConfig ().newTicket ();
355
358
Promise <JsTable > keyTable = makeKeyTable ();
359
+ AbortController controller = new AbortController ();
360
+
356
361
viewTicket = new TicketAndPromise <>(ticket , Callbacks .grpcUnaryPromise (c -> {
357
362
HierarchicalTableViewRequest viewRequest = new HierarchicalTableViewRequest ();
358
363
viewRequest .setHierarchicalTableId (prevTicket .ticket ());
359
364
viewRequest .setResultViewId (ticket );
360
365
keyTable .then (t -> {
366
+ if (controller .signal .isAborted ()) {
367
+ return Promise .reject (Js .<JsAbortSignal >cast (controller .signal ).getReason ());
368
+ }
361
369
if (keyTableData [0 ].length > 0 ) {
362
370
HierarchicalTableViewKeyTableDescriptor expansions = new HierarchicalTableViewKeyTableDescriptor ();
363
371
expansions .setKeyTableId (t .getHandle ().makeTicket ());
364
372
expansions .setKeyTableActionColumn (actionCol .getName ());
365
373
viewRequest .setExpansions (expansions );
366
374
}
367
- connection .hierarchicalTableServiceClient ().view (viewRequest , connection .metadata (), c ::apply );
375
+ UnaryResponse viewCreationCall =
376
+ connection .hierarchicalTableServiceClient ().view (viewRequest , connection .metadata (), c ::apply );
377
+ controller .signal .addEventListener ("abort" , e -> viewCreationCall .cancel ());
368
378
return null ;
369
- }, error -> {
379
+ }). catch_ ( error -> {
370
380
c .apply (error , null );
371
381
return null ;
372
382
});
373
- }), connection );
383
+ }).then (result -> {
384
+ if (controller .signal .isAborted ()) {
385
+ return Promise .reject (Js .<JsAbortSignal >cast (controller .signal ).getReason ());
386
+ }
387
+ ClientTableState state = new ClientTableState (connection ,
388
+ new TableTicket (viewTicket .ticket ().getTicket_asU8 ()), (callback , newState , metadata ) -> {
389
+ callback .apply ("fail, trees dont reconnect like this" , null );
390
+ }, "" );
391
+ state .retain (JsTreeTable .this );
392
+ ExportedTableCreationResponse def = new ExportedTableCreationResponse ();
393
+ HierarchicalTableDescriptor treeDescriptor =
394
+ HierarchicalTableDescriptor .deserializeBinary (widget .getDataAsU8 ());
395
+ def .setSchemaHeader (treeDescriptor .getSnapshotSchema_asU8 ());
396
+ def .setResultId (new TableReference ());
397
+ def .getResultId ().setTicket (viewTicket .ticket ());
398
+ state .applyTableCreationResponse (def );
399
+ return Promise .resolve (state );
400
+ }), connection ) {
401
+ @ Override
402
+ public void release () {
403
+ super .release ();
404
+ controller .abort ();
405
+ then (state -> {
406
+ state .unretain (JsTreeTable .this );
407
+ return null ;
408
+ });
409
+ }
410
+ };
374
411
return viewTicket ;
375
412
}
376
413
@@ -621,16 +658,16 @@ private void replaceSubscription(RebuildStep step) {
621
658
Promise <TreeSubscription > stream = Promise .resolve (defer ())
622
659
.then (ignore -> {
623
660
makeKeyTable ();
624
- TicketAndPromise filter = prepareFilter ();
625
- TicketAndPromise sort = prepareSort (filter );
626
- TicketAndPromise view = makeView (sort );
661
+ TicketAndPromise <?> filter = prepareFilter ();
662
+ TicketAndPromise <?> sort = prepareSort (filter );
663
+ TicketAndPromise < ClientTableState > view = makeView (sort );
627
664
return Promise .all (
628
665
keyTable ,
629
666
filter .promise (),
630
- sort .promise (),
631
- view .promise ());
667
+ sort .promise ())
668
+ . then ( others -> view .promise ());
632
669
})
633
- .then (results -> {
670
+ .then (state -> {
634
671
BitSet columnsBitset = makeColumnSubscriptionBitset ();
635
672
RangeSet range = RangeSet .ofRange ((long ) (double ) firstRow , (long ) (double ) lastRow );
636
673
@@ -643,18 +680,6 @@ private void replaceSubscription(RebuildStep step) {
643
680
range ,
644
681
alwaysFireEvent );
645
682
646
- ClientTableState state = new ClientTableState (connection ,
647
- new TableTicket (viewTicket .ticket ().getTicket_asU8 ()), (callback , newState , metadata ) -> {
648
- callback .apply ("fail, trees dont reconnect like this" , null );
649
- }, "" );
650
- ExportedTableCreationResponse def = new ExportedTableCreationResponse ();
651
- HierarchicalTableDescriptor treeDescriptor =
652
- HierarchicalTableDescriptor .deserializeBinary (widget .getDataAsU8 ());
653
- def .setSchemaHeader (treeDescriptor .getSnapshotSchema_asU8 ());
654
- def .setResultId (new TableReference ());
655
- def .getResultId ().setTicket (viewTicket .ticket ());
656
- state .applyTableCreationResponse (def );
657
-
658
683
TreeSubscription subscription = new TreeSubscription (state , connection );
659
684
660
685
subscription .addEventListener (TreeSubscription .EVENT_UPDATED ,
0 commit comments