Skip to content

Commit 127ac81

Browse files
authored
Merge pull request #363 from CorvusYe/master
feat: expanding the `updateEdgeByIdBatchSelective` interface in `NebulaDaoBasic`
2 parents b91c314 + d6b4396 commit 127ac81

File tree

6 files changed

+109
-0
lines changed

6 files changed

+109
-0
lines changed

ngbatis-demo/src/test/java/ye/weicheng/ngbatis/demo/NebulaBasicDaoTests.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import ye.weicheng.ngbatis.demo.pojo.Like;
2626
import ye.weicheng.ngbatis.demo.pojo.LikeWithRank;
2727
import ye.weicheng.ngbatis.demo.pojo.Person;
28+
import ye.weicheng.ngbatis.demo.pojo.edge.Follow;
2829
import ye.weicheng.ngbatis.demo.pojo.vertex.Player;
2930
import ye.weicheng.ngbatis.demo.repository.TestRepository;
3031

@@ -540,6 +541,37 @@ public void upsertEdgeSelective() {
540541

541542
repository.upsertEdgeSelective(person1, likeWithRank, person2);
542543
}
544+
545+
@Test
546+
public void updateEdgeByIdBatchSelective() {
547+
Person p1 = new Person();
548+
Person p2 = new Person();
549+
550+
repository.insert(p1);
551+
repository.insert(p2);
552+
553+
Follow p1FollowP2 = new Follow();
554+
Follow p2FollowP1 = new Follow();
555+
556+
repository.insertEdge(p1, p1FollowP2, p2);
557+
repository.insertEdge(p2, p2FollowP1, p1);
558+
559+
p1FollowP2.setSrcId(p1.getName());
560+
p1FollowP2.setDstId(p2.getName());
561+
562+
p2FollowP1.setSrcId(p2.getName());
563+
p2FollowP1.setDstId(p1.getName());
564+
565+
List<Follow> follows = new ArrayList<>();
566+
follows.add(p1FollowP2);
567+
follows.add(p2FollowP1);
568+
follows.forEach((l) -> l.setDegree(3));
569+
570+
repository.updateEdgeByIdBatchSelective(follows);
571+
572+
repository.deleteWithEdgeById(p1.getName());
573+
repository.deleteWithEdgeById(p2.getName());
574+
}
543575

544576

545577
@Test
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.nebula.contrib.ngbatis.binding.beetl.functions;
2+
3+
import java.lang.reflect.Field;
4+
import org.nebula.contrib.ngbatis.annotations.DstId;
5+
import org.nebula.contrib.ngbatis.annotations.SrcId;
6+
import org.nebula.contrib.ngbatis.utils.ReflectUtil;
7+
8+
/**
9+
* @author yeweicheng
10+
* @since 2025-12-13 8:56
11+
* <br>Now is history!
12+
*/
13+
public class GetDstIdFn extends AbstractFunction<Object, Void, Void, Void, Void, Void> {
14+
15+
@Override
16+
public Object call(Object o) {
17+
try {
18+
Field dstIdField = ReflectUtil.getAnnoField(o.getClass(), DstId.class);
19+
Object dstId = ReflectUtil.getValue(o, dstIdField);
20+
return fnCall(valueFmtFn, dstId);
21+
} catch (Exception e) {
22+
throw new RuntimeException(e);
23+
}
24+
}
25+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.nebula.contrib.ngbatis.binding.beetl.functions;
2+
3+
import java.lang.reflect.Field;
4+
import org.nebula.contrib.ngbatis.annotations.SrcId;
5+
import org.nebula.contrib.ngbatis.utils.ReflectUtil;
6+
7+
/**
8+
* @author yeweicheng
9+
* @since 2025-12-13 9:02
10+
* <br>Now is history!
11+
*/
12+
public class GetSrcIdFn extends AbstractFunction<Object, Void, Void, Void, Void, Void> {
13+
14+
@Override
15+
public Object call(Object o) {
16+
try {
17+
Field srcIdField = ReflectUtil.getAnnoField(o.getClass(), SrcId.class);
18+
Object srcId = ReflectUtil.getValue(o, srcIdField);
19+
return fnCall(valueFmtFn, srcId);
20+
} catch (Exception e) {
21+
throw new RuntimeException(e);
22+
}
23+
}
24+
}

src/main/java/org/nebula/contrib/ngbatis/proxy/NebulaDaoBasic.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,12 @@ default void upsertEdgeSelective(Object src, Object edge, Object dst) {
444444
ClassModel classModel = getClassModel(this.getClass());
445445
MapperProxy.invoke(classModel, methodModel, src, edge, dst);
446446
}
447+
448+
default void updateEdgeByIdBatchSelective(List<?> edgeList) {
449+
MethodModel methodModel = getMethodModel();
450+
ClassModel classModel = getClassModel(this.getClass());
451+
MapperProxy.invoke(classModel, methodModel, edgeList);
452+
}
447453

448454
/**
449455
* 提供开始节点的id、结束节点的id 与 关系名,判断是否已经建立关系

src/main/resources/NebulaDaoBasic.xml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,26 @@
415415
@}
416416
@}
417417
</insert>
418+
419+
<update id="updateEdgeByIdBatchSelective">
420+
@for ( row in ng_args[0] ) {
421+
@var kv = ng.kv( row, '', true, false );
422+
@if ( isNotEmpty( @kv.columns ) ) {
423+
@var rank = ng.id( row );
424+
@var srcId = ng.srcId( row );
425+
@var dstId = ng.dstId( row );
426+
@var edgeName = ng.tagName( row );
427+
UPDATE EDGE ON `${ edgeName }` ${ srcId }-> ${ dstId } ${ isNotEmpty( rank ) ? ('@' + rank) : '' }
428+
SET
429+
@for (col in @kv.columns ) {
430+
@var vIdx = @kv.columns.indexOf( col );
431+
@var val = @kv.values.get(@vIdx);
432+
`${ col }` = ${ val } ${ colLP.last ? '' : ',' }
433+
@}
434+
;
435+
@}
436+
@}
437+
</update>
418438

419439
<select id="existsEdge">
420440
MATCH (n)-[r: ${ p1 }]-(n2)

src/main/resources/beetl.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ FN.ng.pkName =org.nebula.contrib.ngbatis.binding.beetl.functions.PkNameFn
1212
FN.ng.entityType =org.nebula.contrib.ngbatis.binding.beetl.functions.EntityTypeFn
1313
FN.ng.fieldNames =org.nebula.contrib.ngbatis.binding.beetl.functions.FieldNamesFn
1414
FN.ng.id =org.nebula.contrib.ngbatis.binding.beetl.functions.IdFn
15+
FN.ng.srcId =org.nebula.contrib.ngbatis.binding.beetl.functions.GetSrcIdFn
16+
FN.ng.dstId =org.nebula.contrib.ngbatis.binding.beetl.functions.GetDstIdFn
1517
FN.ng.kv =org.nebula.contrib.ngbatis.binding.beetl.functions.KvFn
1618
FN.ng.join = org.nebula.contrib.ngbatis.binding.beetl.functions.JoinFn
1719
FN.ng.ifStringLike = org.nebula.contrib.ngbatis.binding.beetl.functions.IfStringLike

0 commit comments

Comments
 (0)