2828import com .azure .cosmos .models .CosmosBulkOperationResponse ;
2929import com .azure .cosmos .models .CosmosBulkOperations ;
3030import com .azure .cosmos .models .CosmosChangeFeedRequestOptions ;
31+ import com .azure .cosmos .models .CosmosItemIdentity ;
3132import com .azure .cosmos .models .CosmosItemOperation ;
3233import com .azure .cosmos .models .CosmosQueryRequestOptions ;
3334import com .azure .cosmos .models .FeedRange ;
4849import adiom .v1 .Messages .DataType ;
4950import adiom .v1 .Messages .GeneratePlanRequest ;
5051import adiom .v1 .Messages .GeneratePlanResponse ;
52+ import adiom .v1 .Messages .GetByIdsRequest ;
53+ import adiom .v1 .Messages .GetByIdsResponse ;
5154import adiom .v1 .Messages .GetInfoRequest ;
5255import adiom .v1 .Messages .GetInfoResponse ;
5356import adiom .v1 .Messages .GetNamespaceMetadataRequest ;
@@ -204,7 +207,8 @@ public void getInfo(GetInfoRequest request, StreamObserver<GetInfoResponse> resp
204207 .setCapabilities (Capabilities .newBuilder ()
205208 .setSource (Source .newBuilder ()
206209 .addSupportedDataTypes (DataType .DATA_TYPE_JSON_ID )
207- .setMultiNamespacePlan (true ))
210+ .setMultiNamespacePlan (true )
211+ .setGetByIds (true ))
208212 .setSink (Sink .newBuilder ()
209213 .addSupportedDataTypes (DataType .DATA_TYPE_JSON_ID )))
210214 .build ());
@@ -406,7 +410,7 @@ public void generatePlan(GeneratePlanRequest request, StreamObserver<GeneratePla
406410 }
407411
408412 CosmosChangeFeedRequestOptions ccfro = CosmosChangeFeedRequestOptions
409- .createForProcessingFromNow (FeedRange .forFullRange ()).setMaxItemCount (1 );
413+ .createForProcessingFromNow (FeedRange .forFullRange ()).setMaxItemCount (1 ). allVersionsAndDeletes () ;
410414 UpdatesPartition .Builder updatesPartitionBuilder = UpdatesPartition .newBuilder ()
411415 .addNamespaces (namespace );
412416 for (FeedResponse <Object > fr : helper .container .queryChangeFeed (ccfro , Object .class ).iterableByPage ()) {
@@ -440,6 +444,57 @@ private synchronized long nextIndex() {
440444 return currentIndex ++;
441445 }
442446
447+ @ Override
448+ public void getByIds (GetByIdsRequest request , StreamObserver <GetByIdsResponse > responseObserver ) {
449+ GetByIdsResponse .Builder respBuilder = GetByIdsResponse .newBuilder ();
450+ java .util .Map <String , Integer > m = new java .util .HashMap <>();
451+ List <CosmosItemIdentity > itemsToRead = new ArrayList <>();
452+
453+ NsHelper helper = getNsHelper (responseObserver , request .getNamespace ());
454+ if (helper == null ) {
455+ return ;
456+ }
457+ List <String > idKeys = new ArrayList <>();
458+ for (String path : helper .pkd .getPaths ()) {
459+ idKeys .add (path .substring (1 ));
460+ }
461+ if (!idKeys .getLast ().equals ("id" )) {
462+ idKeys .add ("id" );
463+ }
464+
465+ int i = 0 ;
466+ for (GetByIdsRequest .IdRequest id : request .getIdsList ()) {
467+ PartitionKey pk = BsonHelper .getPartitionKey (id .getIdList ());
468+ String idPart = BsonHelper .getId (id .getIdList ());
469+ List <String > idParts = BsonHelper .getIdParts (id .getIdList ());
470+ itemsToRead .add (new CosmosItemIdentity (pk , idPart ));
471+ StringBuilder sb = new StringBuilder ();
472+ for (String s : idParts ) {
473+ sb .append (s );
474+ sb .append ("," );
475+ }
476+ m .put (sb .toString (), i );
477+ respBuilder .addData (GetByIdsResponse .ResponseItem .getDefaultInstance ());
478+ i ++;
479+ }
480+ FeedResponse <JsonNode > fr = helper .container .readMany (itemsToRead , JsonNode .class );
481+ for (JsonNode n : fr .getResults ()) {
482+ StringBuilder sb = new StringBuilder ();
483+ for (String s : idKeys ) {
484+ sb .append (n .get (s ).asText ());
485+ sb .append ("," );
486+ }
487+ int idx = m .get (sb .toString ());
488+ ObjectNode objectNode = (ObjectNode ) (n );
489+ objectNode .remove (CosmosInternalKeys );
490+ ByteString data = ByteString .copyFromUtf8 (n .toString ());
491+ respBuilder .setData (idx , GetByIdsResponse .ResponseItem .newBuilder ().setData (data ));
492+ }
493+
494+ responseObserver .onNext (respBuilder .build ());
495+ responseObserver .onCompleted ();
496+ }
497+
443498 @ Override
444499 public void listData (ListDataRequest request , StreamObserver <ListDataResponse > responseObserver ) {
445500 String namespace = request .getPartition ().getNamespace ();
@@ -545,6 +600,13 @@ public void streamUpdates(StreamUpdatesRequest request,
545600 if (helper == null ) {
546601 return ;
547602 }
603+ List <String > idKeys = new ArrayList <>();
604+ for (String path : helper .pkd .getPaths ()) {
605+ idKeys .add (path .substring (1 ));
606+ }
607+ if (!idKeys .getLast ().equals ("id" )) {
608+ idKeys .add ("id" );
609+ }
548610
549611 String continuation = request .getCursor ().toStringUtf8 ();
550612
@@ -556,22 +618,32 @@ public void streamUpdates(StreamUpdatesRequest request,
556618 List <Update > updates = new ArrayList <>();
557619 for (JsonNode node : fr .getResults ()) {
558620 JsonNode opType = node .get ("metadata" ).get ("operationType" );
559- if (opType != null && opType .asText () == "delete" ) {
560- String id = node .get ("metadata" ).get ("id" ).asText ();
561- updates .add (Update .newBuilder ().setType (adiom .v1 .Messages .UpdateType .UPDATE_TYPE_DELETE )
562- .addId (BsonHelper .toId (id )).build ());
621+ if (opType != null && opType .asText ().equals ("delete" )) {
622+ Update .Builder b = Update .newBuilder ().setType (adiom .v1 .Messages .UpdateType .UPDATE_TYPE_DELETE );
623+ for (String k : idKeys ) {
624+ if (k .equals ("id" )) {
625+ b .addId (BsonHelper .toId (k , node .get ("metadata" ).get (k ).asText ()));
626+ } else {
627+ b .addId (BsonHelper .toId (k , node .get ("metadata" ).get ("partitionKey" ).get (k ).asText ()));
628+ }
629+ }
630+ updates .add (b .build ());
563631 } else {
564632 adiom .v1 .Messages .UpdateType typ = adiom .v1 .Messages .UpdateType .UPDATE_TYPE_UPDATE ;
565- if (opType != null && opType .asText () == "create" ) {
633+ if (opType != null && opType .asText (). equals ( "create" ) ) {
566634 typ = adiom .v1 .Messages .UpdateType .UPDATE_TYPE_INSERT ;
567635 }
568636 JsonNode currentNode = node .get ("current" );
569637 ObjectNode objectNode = (ObjectNode ) (currentNode );
570638 objectNode .remove (CosmosInternalKeys );
571- String id = currentNode .get ("id" ).asText ();
572- updates .add (Update .newBuilder ().setType (typ )
573- .setData (ByteString .copyFromUtf8 (currentNode .toString ())).addId (BsonHelper .toId (id ))
574- .build ());
639+
640+ Update .Builder b = Update .newBuilder ().setType (typ )
641+ .setData (ByteString .copyFromUtf8 (currentNode .toString ()));
642+ for (String k : idKeys ) {
643+ b .addId (BsonHelper .toId (k , currentNode .get (k ).asText ()));
644+ }
645+
646+ updates .add (b .build ());
575647 }
576648 }
577649
0 commit comments