@@ -426,23 +426,14 @@ public CompletableFuture<? extends List<? extends NodeReferenceAndNode<? extends
426
426
return CompletableFuture .completedFuture (entryState );
427
427
}
428
428
429
- final AtomicReference <NodeReferenceWithDistance > nodeReferenceAtomic =
430
- new AtomicReference <>(entryState );
431
-
432
- return MoreAsyncUtil .forLoop (entryLayer ,
433
- layer -> layer > 0 ,
434
- layer -> layer - 1 ,
435
- layer -> {
436
- final var storageAdapter = getStorageAdapterForLayer (layer );
437
- final var greedyIn = nodeReferenceAtomic .get ();
438
- return greedySearchLayer (storageAdapter , readTransaction , greedyIn , layer ,
439
- queryVector )
440
- .thenApply (greedyState -> {
441
- nodeReferenceAtomic .set (greedyState );
442
- return null ;
443
- });
444
- }, executor )
445
- .thenApply (ignored -> nodeReferenceAtomic .get ());
429
+ return MoreAsyncUtil .forLoop (entryLayer , entryState ,
430
+ layer -> layer > 0 ,
431
+ layer -> layer - 1 ,
432
+ (layer , previousNodeReference ) -> {
433
+ final var storageAdapter = getStorageAdapterForLayer (layer );
434
+ return greedySearchLayer (storageAdapter , readTransaction , previousNodeReference ,
435
+ layer , queryVector );
436
+ }, executor );
446
437
}).thenCompose (nodeReference -> {
447
438
if (nodeReference == null ) {
448
439
return CompletableFuture .completedFuture (null );
@@ -747,46 +738,42 @@ public CompletableFuture<Void> insert(@Nonnull final Transaction transaction, @N
747
738
debug (l -> l .debug ("entry node with key {} at layer {}" , entryNodeReference .getPrimaryKey (),
748
739
lMax ));
749
740
750
- final AtomicReference < NodeReferenceWithDistance > nodeReferenceAtomic =
751
- new AtomicReference <>( new NodeReferenceWithDistance (entryNodeReference .getPrimaryKey (),
741
+ final NodeReferenceWithDistance initialNodeReference =
742
+ new NodeReferenceWithDistance (entryNodeReference .getPrimaryKey (),
752
743
entryNodeReference .getVector (),
753
- Vector .comparativeDistance (metric , entryNodeReference .getVector (), newVector )));
754
- MoreAsyncUtil .forLoop (lMax ,
755
- layer -> layer > insertionLayer ,
756
- layer -> layer - 1 ,
757
- layer -> {
758
- final StorageAdapter <? extends NodeReference > storageAdapter = getStorageAdapterForLayer (layer );
759
- return greedySearchLayer (storageAdapter , transaction ,
760
- nodeReferenceAtomic .get (), layer , newVector )
761
- .thenApply (nodeReference -> {
762
- nodeReferenceAtomic .set (nodeReference );
763
- return null ;
764
- });
765
- }, executor );
766
-
767
- debug (l -> {
768
- final NodeReference nodeReference = nodeReferenceAtomic .get ();
769
- l .debug ("nearest entry point at lMax={} is at key={}" , lMax , nodeReference .getPrimaryKey ());
770
- });
771
-
772
- final AtomicReference <List <NodeReferenceWithDistance >> nearestNeighborsAtomic =
773
- new AtomicReference <>(ImmutableList .of (nodeReferenceAtomic .get ()));
774
-
775
- return MoreAsyncUtil .forLoop (Math .min (lMax , insertionLayer ),
776
- layer -> layer >= 0 ,
777
- layer -> layer - 1 ,
778
- layer -> {
779
- final StorageAdapter <? extends NodeReference > storageAdapter = getStorageAdapterForLayer (layer );
780
- return insertIntoLayer (storageAdapter , transaction ,
781
- nearestNeighborsAtomic .get (), layer , newPrimaryKey , newVector )
782
- .thenCompose (nearestNeighbors -> {
783
- nearestNeighborsAtomic .set (nearestNeighbors );
784
- return AsyncUtil .DONE ;
785
- });
786
- }, executor );
744
+ Vector .comparativeDistance (metric , entryNodeReference .getVector (), newVector ));
745
+ return MoreAsyncUtil .forLoop (lMax , initialNodeReference ,
746
+ layer -> layer > insertionLayer ,
747
+ layer -> layer - 1 ,
748
+ (layer , previousNodeReference ) -> {
749
+ final StorageAdapter <? extends NodeReference > storageAdapter = getStorageAdapterForLayer (layer );
750
+ return greedySearchLayer (storageAdapter , transaction ,
751
+ previousNodeReference , layer , newVector );
752
+ }, executor )
753
+ .thenCompose (nodeReference ->
754
+ insertIntoLayers (transaction , newPrimaryKey , newVector , nodeReference ,
755
+ lMax , insertionLayer ));
787
756
}).thenCompose (ignored -> AsyncUtil .DONE );
788
757
}
789
758
759
+ @ Nonnull
760
+ private CompletableFuture <Void > insertIntoLayers (final @ Nonnull Transaction transaction ,
761
+ final @ Nonnull Tuple newPrimaryKey ,
762
+ final @ Nonnull Vector <Half > newVector ,
763
+ final NodeReferenceWithDistance nodeReference , final int lMax , final int insertionLayer ) {
764
+ debug (l -> {
765
+ l .debug ("nearest entry point at lMax={} is at key={}" , lMax , nodeReference .getPrimaryKey ());
766
+ });
767
+ return MoreAsyncUtil .<List <NodeReferenceWithDistance >>forLoop (Math .min (lMax , insertionLayer ), ImmutableList .of (nodeReference ),
768
+ layer -> layer >= 0 ,
769
+ layer -> layer - 1 ,
770
+ (layer , previousNodeReferences ) -> {
771
+ final StorageAdapter <? extends NodeReference > storageAdapter = getStorageAdapterForLayer (layer );
772
+ return insertIntoLayer (storageAdapter , transaction ,
773
+ previousNodeReferences , layer , newPrimaryKey , newVector );
774
+ }, executor ).thenCompose (ignored -> AsyncUtil .DONE );
775
+ }
776
+
790
777
@ Nonnull
791
778
private <N extends NodeReference > CompletableFuture <List <NodeReferenceWithDistance >> insertIntoLayer (@ Nonnull final StorageAdapter <N > storageAdapter ,
792
779
@ Nonnull final Transaction transaction ,
0 commit comments