|
@@ -1,24 +1,26 @@
|
|
|
package com.giantan.data.dk.repository;
|
|
package com.giantan.data.dk.repository;
|
|
|
|
|
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
|
|
+import com.giantan.ai.util.PathUtils;
|
|
|
import com.giantan.ai.util.id.IdGenerator;
|
|
import com.giantan.ai.util.id.IdGenerator;
|
|
|
import com.giantan.ai.util.id.UlidGenerator;
|
|
import com.giantan.ai.util.id.UlidGenerator;
|
|
|
import com.giantan.data.dk.constant.DkConfig;
|
|
import com.giantan.data.dk.constant.DkConfig;
|
|
|
import com.giantan.data.dk.dto.GTool;
|
|
import com.giantan.data.dk.dto.GTool;
|
|
|
import com.giantan.data.kvs.kvstore.GBaseKeyValue;
|
|
import com.giantan.data.kvs.kvstore.GBaseKeyValue;
|
|
|
|
|
|
|
|
|
|
+import com.giantan.data.kvs.repository.GEntityConfig;
|
|
|
|
|
+import com.giantan.data.util.JdbcUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.jdbc.core.JdbcTemplate;
|
|
import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
import org.springframework.stereotype.Repository;
|
|
import org.springframework.stereotype.Repository;
|
|
|
|
|
|
|
|
|
|
+import java.sql.PreparedStatement;
|
|
|
import java.sql.ResultSet;
|
|
import java.sql.ResultSet;
|
|
|
import java.sql.SQLException;
|
|
import java.sql.SQLException;
|
|
|
import java.time.OffsetDateTime;
|
|
import java.time.OffsetDateTime;
|
|
|
import java.time.ZoneOffset;
|
|
import java.time.ZoneOffset;
|
|
|
-import java.util.ArrayList;
|
|
|
|
|
-import java.util.Arrays;
|
|
|
|
|
-import java.util.List;
|
|
|
|
|
-import java.util.Map;
|
|
|
|
|
|
|
+import java.util.*;
|
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
// copy from GIndexedRepository.java
|
|
// copy from GIndexedRepository.java
|
|
|
|
|
|
|
@@ -33,8 +35,8 @@ public class DkRepository implements IGDkRepository {
|
|
|
@Autowired
|
|
@Autowired
|
|
|
protected JdbcTemplate jdbc;
|
|
protected JdbcTemplate jdbc;
|
|
|
|
|
|
|
|
- @Autowired
|
|
|
|
|
- private IDkIndexer indexer;
|
|
|
|
|
|
|
+// @Autowired
|
|
|
|
|
+// private IDkIndexer indexer;
|
|
|
|
|
|
|
|
protected String schema = "dkdb";
|
|
protected String schema = "dkdb";
|
|
|
protected String tablePrefix = "dk";
|
|
protected String tablePrefix = "dk";
|
|
@@ -43,7 +45,6 @@ public class DkRepository implements IGDkRepository {
|
|
|
private IdGenerator idGenerator = new UlidGenerator();
|
|
private IdGenerator idGenerator = new UlidGenerator();
|
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
public DkRepository() {
|
|
public DkRepository() {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
@@ -72,13 +73,13 @@ public class DkRepository implements IGDkRepository {
|
|
|
this.indexPrefix = indexPrefix;
|
|
this.indexPrefix = indexPrefix;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public IDkIndexer getIndexer() {
|
|
|
|
|
- return indexer;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- public void setIndexer(IDkIndexer indexer) {
|
|
|
|
|
- this.indexer = indexer;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+// public IDkIndexer getIndexer() {
|
|
|
|
|
+// return indexer;
|
|
|
|
|
+// }
|
|
|
|
|
+//
|
|
|
|
|
+// public void setIndexer(IDkIndexer indexer) {
|
|
|
|
|
+// this.indexer = indexer;
|
|
|
|
|
+// }
|
|
|
|
|
|
|
|
// protected String fullTableName(String collId) {
|
|
// protected String fullTableName(String collId) {
|
|
|
// return schema + "." + tablePrefix + "_" + collId;// collId.replace("-", "")
|
|
// return schema + "." + tablePrefix + "_" + collId;// collId.replace("-", "")
|
|
@@ -190,7 +191,7 @@ public class DkRepository implements IGDkRepository {
|
|
|
if (ret == null) {
|
|
if (ret == null) {
|
|
|
return null;
|
|
return null;
|
|
|
}
|
|
}
|
|
|
- int r2 = indexer.onAdd(collId, ret);
|
|
|
|
|
|
|
+ //int r2 = indexer.onAdd(collId, ret);
|
|
|
return ret;
|
|
return ret;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -207,11 +208,6 @@ public class DkRepository implements IGDkRepository {
|
|
|
return rets;
|
|
return rets;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
- public List<GBaseKeyValue> findAllByIds(String collId, List<Integer> ids) throws Throwable {
|
|
|
|
|
- return List.of();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public GTool find(String collId, int id) throws Throwable {
|
|
public GTool find(String collId, int id) throws Throwable {
|
|
|
String sql = String.format("SELECT * FROM %s.%s WHERE id = ?", schema, tableName(collId));
|
|
String sql = String.format("SELECT * FROM %s.%s WHERE id = ?", schema, tableName(collId));
|
|
@@ -227,6 +223,22 @@ public class DkRepository implements IGDkRepository {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<GTool> findAllByIds(String collId, List<Integer> ids) throws Throwable {
|
|
|
|
|
+ if (ids == null || ids.isEmpty()) {
|
|
|
|
|
+ return Collections.emptyList();
|
|
|
|
|
+ }
|
|
|
|
|
+ String placeholders = ids.stream().map(id -> "?").collect(Collectors.joining(","));
|
|
|
|
|
+ String sql = String.format("SELECT * FROM %s.%s WHERE id IN (" + placeholders + ")", schema, tableName(collId));
|
|
|
|
|
+
|
|
|
|
|
+ List<GTool> rets = jdbc.query(
|
|
|
|
|
+ sql,
|
|
|
|
|
+ ids.toArray(),
|
|
|
|
|
+ (rs, rowNum) -> toTool(rs)
|
|
|
|
|
+ );
|
|
|
|
|
+ return rets;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
@Override
|
|
@Override
|
|
|
public GTool findByGid(String collId, String gid) throws Throwable {
|
|
public GTool findByGid(String collId, String gid) throws Throwable {
|
|
|
String sql = String.format("SELECT * FROM %s.%s WHERE gid = ?", schema, tableName(collId));
|
|
String sql = String.format("SELECT * FROM %s.%s WHERE gid = ?", schema, tableName(collId));
|
|
@@ -243,31 +255,40 @@ public class DkRepository implements IGDkRepository {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public int deleteById(String collId, int id) {
|
|
|
|
|
|
|
+ public GTool deleteById(String collId, int id) {
|
|
|
String sql = String.format("DELETE FROM %s.%s WHERE id = ? RETURNING *", schema, tableName(collId));
|
|
String sql = String.format("DELETE FROM %s.%s WHERE id = ? RETURNING *", schema, tableName(collId));
|
|
|
List<GTool> ret = jdbc.query(sql,
|
|
List<GTool> ret = jdbc.query(sql,
|
|
|
new Object[]{id},
|
|
new Object[]{id},
|
|
|
(rs, rowNum) -> toTool(rs));
|
|
(rs, rowNum) -> toTool(rs));
|
|
|
if (ret == null || ret.isEmpty()) {
|
|
if (ret == null || ret.isEmpty()) {
|
|
|
- return 0;
|
|
|
|
|
|
|
+ return null;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- int r2 = indexer.onDelete(collId, ret.get(0));
|
|
|
|
|
- return 1;
|
|
|
|
|
|
|
+ return ret.get(0);
|
|
|
|
|
+// int r2 = indexer.onDelete(collId, ret.get(0));
|
|
|
|
|
+// return 1;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public int deleteByGid(String collId, String gid) {
|
|
|
|
|
|
|
+ public GTool deleteByGid(String collId, String gid) {
|
|
|
String sql = String.format("DELETE FROM %s.%s WHERE gid = ? RETURNING *", schema, tableName(collId));
|
|
String sql = String.format("DELETE FROM %s.%s WHERE gid = ? RETURNING *", schema, tableName(collId));
|
|
|
List<GTool> ret = jdbc.query(sql,
|
|
List<GTool> ret = jdbc.query(sql,
|
|
|
new Object[]{gid},
|
|
new Object[]{gid},
|
|
|
(rs, rowNum) -> toTool(rs));
|
|
(rs, rowNum) -> toTool(rs));
|
|
|
if (ret == null || ret.isEmpty()) {
|
|
if (ret == null || ret.isEmpty()) {
|
|
|
- return 0;
|
|
|
|
|
|
|
+ return null;
|
|
|
}
|
|
}
|
|
|
|
|
+ return ret.get(0);
|
|
|
|
|
+// int r2 = indexer.onDelete(collId, ret.get(0));
|
|
|
|
|
+// return 1;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- int r2 = indexer.onDelete(collId, ret.get(0));
|
|
|
|
|
- return 1;
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<GTool> deleteByName(String collId, String name) {
|
|
|
|
|
+ String sql = String.format("DELETE FROM %s.%s WHERE name = ? RETURNING *", schema, tableName(collId));
|
|
|
|
|
+ List<GTool> ret = jdbc.query(sql,
|
|
|
|
|
+ new Object[]{name},
|
|
|
|
|
+ (rs, rowNum) -> toTool(rs));
|
|
|
|
|
+ return ret;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -332,7 +353,7 @@ public class DkRepository implements IGDkRepository {
|
|
|
} else if (tool.getId() != null) {
|
|
} else if (tool.getId() != null) {
|
|
|
sql.append(" WHERE id = ? RETURNING *;");
|
|
sql.append(" WHERE id = ? RETURNING *;");
|
|
|
params.add(tool.getId());
|
|
params.add(tool.getId());
|
|
|
- }else{
|
|
|
|
|
|
|
+ } else {
|
|
|
return null;
|
|
return null;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -344,91 +365,252 @@ public class DkRepository implements IGDkRepository {
|
|
|
(rs, rowNum) -> toTool(rs)
|
|
(rs, rowNum) -> toTool(rs)
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
- int r2 = indexer.onUpdate(collId, ret);
|
|
|
|
|
|
|
+ //int r2 = indexer.onUpdate(collId, ret);
|
|
|
return ret;
|
|
return ret;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
- //////////////////////////////
|
|
|
|
|
- // @Override
|
|
|
|
|
- public List<GBaseKeyValue> findByName(String collId, String name) throws Throwable {
|
|
|
|
|
- return List.of();
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<GTool> findByName(String collId, String name) throws Throwable {
|
|
|
|
|
+ String sql = String.format("SELECT * FROM %s.%s WHERE name = ?", schema, tableName(collId));
|
|
|
|
|
+ List<GTool> rets = jdbc.query(
|
|
|
|
|
+ sql,
|
|
|
|
|
+ new Object[]{name},
|
|
|
|
|
+ (rs, rowNum) -> toTool(rs)
|
|
|
|
|
+ );
|
|
|
|
|
+ return rets;
|
|
|
|
|
+ //List<GBaseKeyValue> rets = GConverter.fromEntity(query);
|
|
|
|
|
+ //return rets;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
- public List<GBaseKeyValue> findByPath(String collId, String path) {
|
|
|
|
|
- return List.of();
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<GTool> findByPath(String collId, String path) {
|
|
|
|
|
+ String sql = String.format("SELECT * FROM %s.%s WHERE path = ?", schema, tableName(collId));
|
|
|
|
|
+ List<GTool> rets = jdbc.query(
|
|
|
|
|
+ sql,
|
|
|
|
|
+ new Object[]{path},
|
|
|
|
|
+ (rs, rowNum) -> toTool(rs)
|
|
|
|
|
+ );
|
|
|
|
|
+ return rets;
|
|
|
|
|
+ //List<GBaseKeyValue> rets = GConverter.fromEntity(query);
|
|
|
|
|
+ //return rets;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
- public List<GBaseKeyValue> findByPathPrefix(String collId, String prefix) {
|
|
|
|
|
- return List.of();
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<GTool> findByPathPrefix(String collId, String prefix) {
|
|
|
|
|
+ String like = prefix + "%";
|
|
|
|
|
+ String sql = String.format("SELECT * FROM %s.%s WHERE path LIKE ?", schema, tableName(collId));
|
|
|
|
|
+ List<GTool> rets = jdbc.query(
|
|
|
|
|
+ sql,
|
|
|
|
|
+ new Object[]{like},
|
|
|
|
|
+ (rs, rowNum) -> toTool(rs)
|
|
|
|
|
+ );
|
|
|
|
|
+ return rets;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
|
|
+ @Override
|
|
|
public long count(String collId) {
|
|
public long count(String collId) {
|
|
|
- return 0;
|
|
|
|
|
|
|
+ String sql = String.format("SELECT COUNT(*) FROM %s.%s", schema, tableName(collId));
|
|
|
|
|
+ Long l = jdbc.queryForObject(sql, Long.class);
|
|
|
|
|
+ return l;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
|
|
+ @Override
|
|
|
public long delete(String collId, List<Integer> ids) {
|
|
public long delete(String collId, List<Integer> ids) {
|
|
|
- return 0;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (ids == null || ids.isEmpty()) {
|
|
|
|
|
+ return 0L;
|
|
|
|
|
+ }
|
|
|
|
|
+ String placeholders = ids.stream()
|
|
|
|
|
+ .map(id -> "?")
|
|
|
|
|
+ .collect(Collectors.joining(","));
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
- public long deleteAll(String collId) {
|
|
|
|
|
- return 0;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ String sql = String.format("DELETE FROM %s.%s WHERE id IN (" + placeholders + ")", schema, tableName(collId));
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
- public GBaseKeyValue removeAttribute(String collId, Integer id, List<String> keys) throws Throwable {
|
|
|
|
|
- return null;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ Object[] params = ids.toArray();
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
- public GBaseKeyValue updateAttribute(String collId, Integer id, String key, Object value) throws Throwable {
|
|
|
|
|
- return null;
|
|
|
|
|
|
|
+ List<GTool> rets = jdbc.query(sql, params,
|
|
|
|
|
+ (rs, rowNum) -> toTool(rs));
|
|
|
|
|
+ if (rets == null || rets.isEmpty()) {
|
|
|
|
|
+ return 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ //int r2 = indexer.onDelete(collId, rs);
|
|
|
|
|
+ return rets.size();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
- public GBaseKeyValue updateAttribute(String collId, Integer id, Map<String, Object> attributes) throws Throwable {
|
|
|
|
|
- return null;
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public long deleteAll(String collId) {
|
|
|
|
|
+ String sql = String.format("DELETE FROM %s.%s", schema, tableName(collId));
|
|
|
|
|
+ int r = jdbc.update(sql);
|
|
|
|
|
+ //int r2 = indexer.onDeleteAll(collId);
|
|
|
|
|
+ return r;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
- public Object findAttribute(String collId, Integer id, String attribute) throws SQLException {
|
|
|
|
|
- return null;
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
- public long update(String collId, List<GBaseKeyValue> kvs) throws Throwable {
|
|
|
|
|
- return 0;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+// // @Override
|
|
|
|
|
+// public GBaseKeyValue removeAttribute(String collId, Integer id, List<String> keys) throws Throwable {
|
|
|
|
|
+// return null;
|
|
|
|
|
+// }
|
|
|
|
|
+//
|
|
|
|
|
+// // @Override
|
|
|
|
|
+// public GBaseKeyValue updateAttribute(String collId, Integer id, String key, Object value) throws Throwable {
|
|
|
|
|
+// return null;
|
|
|
|
|
+// }
|
|
|
|
|
+//
|
|
|
|
|
+// // @Override
|
|
|
|
|
+// public GBaseKeyValue updateAttribute(String collId, Integer id, Map<String, Object> attributes) throws Throwable {
|
|
|
|
|
+// return null;
|
|
|
|
|
+// }
|
|
|
|
|
+//
|
|
|
|
|
+// // @Override
|
|
|
|
|
+// public Object findAttribute(String collId, Integer id, String attribute) throws SQLException {
|
|
|
|
|
+// return null;
|
|
|
|
|
+// }
|
|
|
|
|
+//
|
|
|
|
|
+// // @Override
|
|
|
|
|
+// public long update(String collId, List<GBaseKeyValue> kvs) throws Throwable {
|
|
|
|
|
+// return 0;
|
|
|
|
|
+// }
|
|
|
|
|
+//
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
|
|
+ @Override
|
|
|
public List<Map<String, Object>> getAllEntities(String collId, List<String> fields) {
|
|
public List<Map<String, Object>> getAllEntities(String collId, List<String> fields) {
|
|
|
- return List.of();
|
|
|
|
|
|
|
+ if (fields == null || fields.size() == 0) {
|
|
|
|
|
+ return Collections.emptyList();
|
|
|
|
|
+ }
|
|
|
|
|
+ String placeholders = String.join(", ", fields);
|
|
|
|
|
+
|
|
|
|
|
+ String sql = String.format("SELECT %s FROM %s.%s ", placeholders, schema, tableName(collId));
|
|
|
|
|
+ // 使用 queryForList 获取结果,返回一个 List<Map<String, Object>>
|
|
|
|
|
+ return jdbc.queryForList(sql);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
|
|
+ @Override
|
|
|
public List<Map<String, Object>> getAllEntities(String collId, List<String> fields, String whereClause) {
|
|
public List<Map<String, Object>> getAllEntities(String collId, List<String> fields, String whereClause) {
|
|
|
- return List.of();
|
|
|
|
|
|
|
+ if (fields == null || fields.size() == 0) {
|
|
|
|
|
+ return Collections.emptyList();
|
|
|
|
|
+ }
|
|
|
|
|
+ String placeholders = String.join(", ", fields);
|
|
|
|
|
+
|
|
|
|
|
+ String sql = String.format("SELECT %s FROM %s.%s WHERE %s", placeholders, schema, tableName(collId), whereClause);
|
|
|
|
|
+ // 使用 queryForList 获取结果,返回一个 List<Map<String, Object>>
|
|
|
|
|
+ return jdbc.queryForList(sql);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
- public List<String> appendArrayField(String collId, Integer id, String field, List<String> values) {
|
|
|
|
|
- return List.of();
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public GTool appendArrayField(String collId, Integer id, String field, List<String> values) {
|
|
|
|
|
+ if (field == null || values == null || values.isEmpty()) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ String sql = String.format(
|
|
|
|
|
+ "UPDATE %s.%s SET %s = %s || ?::text[] WHERE id = ? RETURNING *",
|
|
|
|
|
+ schema,
|
|
|
|
|
+ tableName(collId),
|
|
|
|
|
+ field,
|
|
|
|
|
+ field
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ List<GTool> rets = jdbc.query(
|
|
|
|
|
+ con -> {
|
|
|
|
|
+ PreparedStatement ps = con.prepareStatement(sql);
|
|
|
|
|
+ // 创建 SQL Array 并绑定到参数
|
|
|
|
|
+ //Array sqlArray = con.createArrayOf("text", values.toArray(new String[0]));
|
|
|
|
|
+ //ps.setArray(1, sqlArray);
|
|
|
|
|
+ JdbcUtils.setStringArray(ps, 1, values);
|
|
|
|
|
+ ps.setInt(2, id);
|
|
|
|
|
+ return ps;
|
|
|
|
|
+ }, (rs, rowNum) -> toTool(rs));
|
|
|
|
|
+ if (rets == null || rets.isEmpty()) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ GTool entity = rets.get(0);
|
|
|
|
|
+ //indexer.onUpdateField(collId, entity, field);
|
|
|
|
|
+ //return getArrayField(entity, field);
|
|
|
|
|
+ return entity;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private List<String> getArrayField(GTool entity, String field) {
|
|
|
|
|
+ List<String> ret2 = null;
|
|
|
|
|
+// if (field.equalsIgnoreCase(GEntityConfig.ALTLABELS)) {
|
|
|
|
|
+// ret2 = entity.getAltlabels();
|
|
|
|
|
+// } else if (field.equalsIgnoreCase(GEntityConfig.TAGS)) {
|
|
|
|
|
+// ret2 = entity.getTags();
|
|
|
|
|
+// }
|
|
|
|
|
+ if (field.equalsIgnoreCase(GEntityConfig.TAGS)) {
|
|
|
|
|
+ ret2 = entity.getTags();
|
|
|
|
|
+ }
|
|
|
|
|
+ return ret2;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
- public List<String> setArrayField(String collId, Integer id, String field, List<String> values) {
|
|
|
|
|
- return List.of();
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public GTool setArrayField(String collId, Integer id, String field, List<String> values) {
|
|
|
|
|
+ if (field == null || values == null) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ String sql = String.format(
|
|
|
|
|
+ "UPDATE %s.%s SET %s = ? WHERE id = ? RETURNING *",
|
|
|
|
|
+ schema, tableName(collId), field);
|
|
|
|
|
+
|
|
|
|
|
+ List<GTool> rets = jdbc.query(con -> {
|
|
|
|
|
+ PreparedStatement ps = con.prepareStatement(sql);
|
|
|
|
|
+ // 第 1 个参数:安全设置 array
|
|
|
|
|
+ JdbcUtils.setStringArray(ps, 1, values);
|
|
|
|
|
+ // 第 2 个参数:id
|
|
|
|
|
+ ps.setInt(2, id);
|
|
|
|
|
+ return ps;
|
|
|
|
|
+ }, (rs, rowNum) -> toTool(rs));
|
|
|
|
|
+
|
|
|
|
|
+ if (rets == null || rets.isEmpty()) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ GTool entity = rets.get(0);
|
|
|
|
|
+ //indexer.onUpdateField(collId, entity, field);
|
|
|
|
|
+ //return getArrayField(entity, field);
|
|
|
|
|
+ return entity;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
- public List<String> removeArrayField(String collId, Integer id, String field, List<String> values) {
|
|
|
|
|
- return List.of();
|
|
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public GTool removeArrayField(String collId, Integer id, String field, List<String> values) {
|
|
|
|
|
+ if (field == null || values == null || values.size() == 0) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 构建动态 SQL:array_remove(array_remove(...), ...)
|
|
|
|
|
+ String sql1 = String.format("UPDATE %s.%s SET %s = ", schema, tableName(collId), field);
|
|
|
|
|
+ StringBuilder bs = new StringBuilder(sql1);
|
|
|
|
|
+
|
|
|
|
|
+ StringBuilder bs1 = new StringBuilder();
|
|
|
|
|
+ bs1.append("array_remove(").append(field).append(",").append("?)");
|
|
|
|
|
+ for (int i = 1; i < values.size(); i++) {
|
|
|
|
|
+ bs1.insert(0, "array_remove(");
|
|
|
|
|
+ bs1.append(", ?)");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //bs.append(bs1).append(" WHERE id = ? RETURNING ").append(field);
|
|
|
|
|
+ bs.append(bs1).append(" WHERE id = ? RETURNING *");
|
|
|
|
|
+
|
|
|
|
|
+ // 参数列表
|
|
|
|
|
+ Object[] args = new Object[values.size() + 1];
|
|
|
|
|
+ for (int i = 0; i < values.size(); i++) {
|
|
|
|
|
+ args[i] = values.get(i);
|
|
|
|
|
+ }
|
|
|
|
|
+ args[values.size()] = id;
|
|
|
|
|
+
|
|
|
|
|
+ List<GTool> rets = jdbc.query(
|
|
|
|
|
+ bs.toString(),
|
|
|
|
|
+ args,
|
|
|
|
|
+ (rs, rowNum) -> toTool(rs));
|
|
|
|
|
+
|
|
|
|
|
+ if (rets == null || rets.isEmpty()) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ GTool entity = rets.get(0);
|
|
|
|
|
+ //indexer.onUpdateField(collId, entity, field);
|
|
|
|
|
+ //return getArrayField(entity, field);
|
|
|
|
|
+ return entity;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -447,23 +629,104 @@ public class DkRepository implements IGDkRepository {
|
|
|
return 1;
|
|
return 1;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
- public int deleteByPath(String collId, String path) {
|
|
|
|
|
- return 0;
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<GTool> deleteByPath(String collId, String path) {
|
|
|
|
|
+ String sql = String.format("DELETE FROM %s.%s WHERE path = ? RETURNING *", schema, tableName(collId));
|
|
|
|
|
+ //return jdbc.update(sql, path);
|
|
|
|
|
+ List<GTool> rets = jdbc.query(sql, new Object[]{path}, (rs, rowNum) -> toTool(rs));
|
|
|
|
|
+ if (rets == null || rets.isEmpty()) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ //int r = indexer.onDelete(collId, rets);
|
|
|
|
|
+ //return rets.size();
|
|
|
|
|
+ return rets;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<GTool> deleteByPrefix(String collId, String prefix) {
|
|
|
|
|
+ String like = prefix + "%";
|
|
|
|
|
+ String sql = String.format("DELETE FROM %s.%s WHERE path LIKE ? RETURNING *", schema, tableName(collId));
|
|
|
|
|
+ //return jdbc.update(sql, like);
|
|
|
|
|
+ List<GTool> rets = jdbc.query(sql, new Object[]{like}, (rs, rowNum) -> toTool(rs));
|
|
|
|
|
+ if (rets == null || rets.isEmpty()) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ //int r = indexer.onDelete(collId, rets);
|
|
|
|
|
+ //return rets.size();
|
|
|
|
|
+ return rets;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
- public int deleteByPrefix(String collId, String path) {
|
|
|
|
|
- return 0;
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<GTool> updatePathPrefix(String collId, String oldPrefix, String newPrefix) {
|
|
|
|
|
+ String table = tableName(collId);
|
|
|
|
|
+ String sql = String.format("""
|
|
|
|
|
+ UPDATE %s.%s
|
|
|
|
|
+ SET path = regexp_replace(path, ?, ?)
|
|
|
|
|
+ WHERE path LIKE ?
|
|
|
|
|
+ RETURNING * ;
|
|
|
|
|
+ """, schema, table);
|
|
|
|
|
+
|
|
|
|
|
+ // 正则必须是 ^/a/b/
|
|
|
|
|
+ String regex = "^" + oldPrefix;
|
|
|
|
|
+ String like = oldPrefix + "%";
|
|
|
|
|
+
|
|
|
|
|
+ //return jdbc.update(sql, regex, newPrefix, like);
|
|
|
|
|
+ List<GTool> rets = jdbc.query(connection -> {
|
|
|
|
|
+ PreparedStatement ps = connection.prepareStatement(sql);
|
|
|
|
|
+ ps.setString(1, regex);
|
|
|
|
|
+ ps.setString(2, newPrefix);
|
|
|
|
|
+ ps.setString(3, like);
|
|
|
|
|
+ return ps;
|
|
|
|
|
+ }, (rs, rowNum) -> toTool(rs));
|
|
|
|
|
+ //if (rets == null || rets.isEmpty()) {
|
|
|
|
|
+ // return 0;
|
|
|
|
|
+ //}
|
|
|
|
|
+ //indexer.onUpdateField(collId, rets, "path");
|
|
|
|
|
+ return rets;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
- public int deletePathAndDescendants(String collId, String path) {
|
|
|
|
|
- return 0;
|
|
|
|
|
|
|
+ //DELETE FROM %s.%s
|
|
|
|
|
+ //WHERE (path LIKE ? OR path = '/a')
|
|
|
|
|
+ //RETURNING *;
|
|
|
|
|
+ // 上述的deleteByPathPrefix 只要是前缀都删除 例如 删 /ab 那么 /abc 也删了
|
|
|
|
|
+ // 而该方法 不会
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<GTool> deletePathAndDescendants(String collId, String path) {
|
|
|
|
|
+ String p1 = PathUtils.normalize(path);
|
|
|
|
|
+ String like = p1 + "/" + "%";
|
|
|
|
|
+ String sql = String.format("DELETE FROM %s.%s WHERE (path = ? OR path LIKE ?) RETURNING *", schema, tableName(collId));
|
|
|
|
|
+ //return jdbc.update(sql, like);
|
|
|
|
|
+ List<GTool> rets = jdbc.query(sql, new Object[]{p1, like}, (rs, rowNum) -> toTool(rs));
|
|
|
|
|
+ if (rets == null || rets.isEmpty()) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ //int r = indexer.onDelete(collId, rets);
|
|
|
|
|
+ //return rets.size();
|
|
|
|
|
+ return rets;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // @Override
|
|
|
|
|
- public List<GBaseKeyValue> getChildren(String collId, String parent) {
|
|
|
|
|
- return List.of();
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<GTool> getChildren(String collId, String parentPath) {
|
|
|
|
|
+ String parent = PathUtils.normalize(parentPath);
|
|
|
|
|
+
|
|
|
|
|
+ // 父路径深度
|
|
|
|
|
+ int parentDepth = parent.equals("/") ? 1 : parent.split("/").length;
|
|
|
|
|
+
|
|
|
|
|
+ String sql = String.format(
|
|
|
|
|
+ "SELECT * FROM %s.%s " +
|
|
|
|
|
+ "WHERE path LIKE ? " +
|
|
|
|
|
+ "AND path <> ? " +
|
|
|
|
|
+ "AND (length(path) - length(replace(path, '/', ''))+1) = ?",
|
|
|
|
|
+ schema,
|
|
|
|
|
+ tableName(collId)
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ // 直接子目录:path 以 parent + '/' 开头,深度 = parentDepth + 1
|
|
|
|
|
+ String prefix = parent.equals("/") ? "/%" : parent + "/%";
|
|
|
|
|
+ List<GTool> rows = jdbc.query(sql, new Object[]{prefix, parent, parentDepth + 1}, (rs, rowNum) -> toTool(rs));
|
|
|
|
|
+ //List<GBaseKeyValue> rets = GConverter.fromEntity(rows);
|
|
|
|
|
+ //return rets;
|
|
|
|
|
+ return rows;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
}
|
|
}
|