From 4ac6af4fe83435d1111ef865dfbf86872dcacd41 Mon Sep 17 00:00:00 2001 From: yutao <3082046177@qq.com> Date: Tue, 22 Jul 2025 11:00:42 +0800 Subject: [PATCH] init --- pom.xml | 11 + .../cdr/{util => context}/JsonProcessor.java | 3 +- .../cdr/{util => context}/TimeUtil.java | 2 +- .../cdr/dao/DimDataSummaryRepository.java | 2 +- .../com/ediagnosis/cdr/dao/DwsRepository.java | 49 +++ .../ediagnosis/cdr/dao/HiveQueryExecutor.java | 38 +++ .../ediagnosis/cdr/dao/sqlutil/SqlParser.java | 81 +++++ .../ediagnosis/cdr/service/HiveService.java | 10 - .../ediagnosis/cdr/{vo => value}/Page.java | 34 +- .../com/ediagnosis/cdr/value/Response.java | 71 ++++ src/main/resources/application.yml | 5 +- .../com/ediagnosis/cdr/context/GraphTest.java | 4 + .../{util => context}/JsonProcessorTest.java | 2 +- .../com/ediagnosis/cdr/context/MockTest.java | 40 +++ .../cdr/{util => context}/Person.java | 2 +- .../cdr/{util => context}/TimeUtilTest.java | 2 +- .../ediagnosis/cdr/dao/DwsRepositoryTest.java | 55 +++ .../cdr/dao/HiveQueryExecutorTest.java | 323 ++++++++++++++++++ .../com/ediagnosis/cdr/dao/StringTest.java | 33 ++ .../ediagnosis/cdr/dashBoard/AsyncTest.java | 51 +++ .../cdr/dashBoard/DashBoardTest.java | 69 ++++ .../cdr/dashBoard/DashBoardTest2.java | 159 +++++++++ .../cdr/service/HiveServiceTest.java | 42 --- 23 files changed, 1011 insertions(+), 77 deletions(-) rename src/main/java/com/ediagnosis/cdr/{util => context}/JsonProcessor.java (92%) rename src/main/java/com/ediagnosis/cdr/{util => context}/TimeUtil.java (98%) create mode 100644 src/main/java/com/ediagnosis/cdr/dao/DwsRepository.java create mode 100644 src/main/java/com/ediagnosis/cdr/dao/HiveQueryExecutor.java create mode 100644 src/main/java/com/ediagnosis/cdr/dao/sqlutil/SqlParser.java delete mode 100644 src/main/java/com/ediagnosis/cdr/service/HiveService.java rename src/main/java/com/ediagnosis/cdr/{vo => value}/Page.java (56%) create mode 100644 src/main/java/com/ediagnosis/cdr/value/Response.java create mode 100644 src/test/java/com/ediagnosis/cdr/context/GraphTest.java rename src/test/java/com/ediagnosis/cdr/{util => context}/JsonProcessorTest.java (96%) create mode 100644 src/test/java/com/ediagnosis/cdr/context/MockTest.java rename src/test/java/com/ediagnosis/cdr/{util => context}/Person.java (95%) rename src/test/java/com/ediagnosis/cdr/{util => context}/TimeUtilTest.java (97%) create mode 100644 src/test/java/com/ediagnosis/cdr/dao/DwsRepositoryTest.java create mode 100644 src/test/java/com/ediagnosis/cdr/dao/HiveQueryExecutorTest.java create mode 100644 src/test/java/com/ediagnosis/cdr/dao/StringTest.java create mode 100644 src/test/java/com/ediagnosis/cdr/dashBoard/AsyncTest.java create mode 100644 src/test/java/com/ediagnosis/cdr/dashBoard/DashBoardTest.java create mode 100644 src/test/java/com/ediagnosis/cdr/dashBoard/DashBoardTest2.java delete mode 100644 src/test/java/com/ediagnosis/cdr/service/HiveServiceTest.java diff --git a/pom.xml b/pom.xml index 557bf2b..3770289 100644 --- a/pom.xml +++ b/pom.xml @@ -96,6 +96,10 @@ javax.servlet.jsp org.glassfish.web + + junit + junit + @@ -141,5 +145,12 @@ spring-boot-starter-test test + + + com.github.jsqlparser + jsqlparser + 5.3 + + \ No newline at end of file diff --git a/src/main/java/com/ediagnosis/cdr/util/JsonProcessor.java b/src/main/java/com/ediagnosis/cdr/context/JsonProcessor.java similarity index 92% rename from src/main/java/com/ediagnosis/cdr/util/JsonProcessor.java rename to src/main/java/com/ediagnosis/cdr/context/JsonProcessor.java index bd065f2..692a078 100644 --- a/src/main/java/com/ediagnosis/cdr/util/JsonProcessor.java +++ b/src/main/java/com/ediagnosis/cdr/context/JsonProcessor.java @@ -1,10 +1,9 @@ -package com.ediagnosis.cdr.util; +package com.ediagnosis.cdr.context; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; import java.util.Optional; diff --git a/src/main/java/com/ediagnosis/cdr/util/TimeUtil.java b/src/main/java/com/ediagnosis/cdr/context/TimeUtil.java similarity index 98% rename from src/main/java/com/ediagnosis/cdr/util/TimeUtil.java rename to src/main/java/com/ediagnosis/cdr/context/TimeUtil.java index 1bb07f6..261b5e7 100644 --- a/src/main/java/com/ediagnosis/cdr/util/TimeUtil.java +++ b/src/main/java/com/ediagnosis/cdr/context/TimeUtil.java @@ -1,4 +1,4 @@ -package com.ediagnosis.cdr.util; +package com.ediagnosis.cdr.context; import org.slf4j.Logger; diff --git a/src/main/java/com/ediagnosis/cdr/dao/DimDataSummaryRepository.java b/src/main/java/com/ediagnosis/cdr/dao/DimDataSummaryRepository.java index d0f2152..64a0c4e 100644 --- a/src/main/java/com/ediagnosis/cdr/dao/DimDataSummaryRepository.java +++ b/src/main/java/com/ediagnosis/cdr/dao/DimDataSummaryRepository.java @@ -3,7 +3,7 @@ package com.ediagnosis.cdr.dao; import com.ediagnosis.cdr.dao.entity.DimDataSummaryEntity; import com.ediagnosis.cdr.dao.mapper.DimDataSummaryMapper; import com.ediagnosis.cdr.domain.DimDataSummary; -import com.ediagnosis.cdr.util.TimeUtil; +import com.ediagnosis.cdr.context.TimeUtil; import org.springframework.stereotype.Repository; import java.time.LocalDateTime; diff --git a/src/main/java/com/ediagnosis/cdr/dao/DwsRepository.java b/src/main/java/com/ediagnosis/cdr/dao/DwsRepository.java new file mode 100644 index 0000000..d904fb3 --- /dev/null +++ b/src/main/java/com/ediagnosis/cdr/dao/DwsRepository.java @@ -0,0 +1,49 @@ +package com.ediagnosis.cdr.dao; + + +import com.ediagnosis.cdr.value.Page; +import com.mybatisflex.core.row.Row; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Repository +public class DwsRepository { + + + private final HiveQueryExecutor hiveQueryExecutor; + + public DwsRepository(HiveQueryExecutor hiveQueryExecutor) { + this.hiveQueryExecutor = hiveQueryExecutor; + } + + public Page> queryPage(String sql, int pageNo,int pageSize) { + com.mybatisflex.core.paginate.Page rowPage = hiveQueryExecutor.selectByFullSql(sql, pageNo, pageSize); + List> result = rowPage.getRecords().stream() + .map(row -> { + Map camelKeysMap = row.toCamelKeysMap(); + Map flatMap = new HashMap<>(); + + camelKeysMap.forEach((table, value) -> { + if (value instanceof Map m) { + m.forEach((key, val) -> { + if (key instanceof String field && val instanceof String fieldValue) { + flatMap.put(table + "." + field, fieldValue); + } + }); + } + }); + + return flatMap; + }) + .filter(map -> !map.isEmpty()) // 可选:过滤掉空 map + .toList(); + + return new Page<>(pageNo, pageSize, rowPage.getTotalRow(), result); + } + + + +} diff --git a/src/main/java/com/ediagnosis/cdr/dao/HiveQueryExecutor.java b/src/main/java/com/ediagnosis/cdr/dao/HiveQueryExecutor.java new file mode 100644 index 0000000..8d8dc15 --- /dev/null +++ b/src/main/java/com/ediagnosis/cdr/dao/HiveQueryExecutor.java @@ -0,0 +1,38 @@ +package com.ediagnosis.cdr.dao; + + +import com.ediagnosis.cdr.dao.sqlutil.SqlParser; +import com.mybatisflex.core.datasource.DataSourceKey; +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.row.Db; +import com.mybatisflex.core.row.Row; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Optional; + +@Component +public class HiveQueryExecutor { + + public Page selectByFullSql(String fullSql, int pageNo, int pageSize) { + Page page = new Page<>(pageNo, pageSize); + Optional countSql = SqlParser.getCountSql(fullSql); + String limitSql = SqlParser.addLimitClause(fullSql); + try { + DataSourceKey.use("ds-hive"); + if(countSql.isPresent()){ + long count = Db.selectCount(countSql.get()); + page.setTotalRow(count); + } + + List rows = Db.selectListBySql(limitSql); + page.setRecords(rows); + + } finally { + DataSourceKey.clear(); + } + + return page; + } + +} diff --git a/src/main/java/com/ediagnosis/cdr/dao/sqlutil/SqlParser.java b/src/main/java/com/ediagnosis/cdr/dao/sqlutil/SqlParser.java new file mode 100644 index 0000000..1e35bf0 --- /dev/null +++ b/src/main/java/com/ediagnosis/cdr/dao/sqlutil/SqlParser.java @@ -0,0 +1,81 @@ +package com.ediagnosis.cdr.dao.sqlutil; + + +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.expression.Function; +import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.select.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Optional; + + +public class SqlParser { + + + private static final Logger log = LoggerFactory.getLogger(SqlParser.class); + + public static Optional getCountSql(String sql) { + Optional plainSelectOptional = detectSelectSql(sql); + if (plainSelectOptional.isEmpty()) { + return Optional.empty(); + } + PlainSelect plainSelect = plainSelectOptional.get(); + List> selectItems = plainSelect.getSelectItems(); + selectItems.clear(); + selectItems.add(new SelectItem<>( + new Function("count", new AllColumns()) + ) + ); + String newSql = plainSelect.toString(); + log.info("change to count sql: {}", newSql); + return Optional.of(newSql); + } + + + public static String addLimitClause(String sql) { + String newSql = sql; + Optional plainSelectOptional = detectSelectSql(sql); + + if (plainSelectOptional.isEmpty()) { + return newSql; + } + PlainSelect plainSelect = plainSelectOptional.get(); + Limit limit = plainSelect.getLimit(); + if (limit == null) { + Select select = plainSelect.withLimit( + new Limit() + .withRowCount(new LongValue(10)) + .withOffset(new LongValue(0)) + ); + newSql = select.toString(); + log.info("原始sql没有limit从句,添加limit从句,新sql语句:{}", newSql); + } else { + log.info("原始sql存在limit从句,不做处理"); + } + return newSql; + } + + private static Optional detectSelectSql(String sql) { + Statement statement = null; + try { + statement = CCJSqlParserUtil.parse(sql); + log.debug("sql语句语法正确"); + } catch (JSQLParserException e) { + log.error("解析sql失败", e); + return Optional.empty(); + } + if ((statement instanceof PlainSelect plainSelect)) { + log.debug("原始sql是select语句"); + return Optional.of(plainSelect); + } else { + log.warn("原始sql不是select语句"); + return Optional.empty(); + } + } + +} diff --git a/src/main/java/com/ediagnosis/cdr/service/HiveService.java b/src/main/java/com/ediagnosis/cdr/service/HiveService.java deleted file mode 100644 index 7077846..0000000 --- a/src/main/java/com/ediagnosis/cdr/service/HiveService.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.ediagnosis.cdr.service; - -import com.ediagnosis.cdr.vo.Page; - -public class HiveService { - - public Page selectPage(String sql, int pageNo, int pageSize) { - return new Page<>(); - } -} diff --git a/src/main/java/com/ediagnosis/cdr/vo/Page.java b/src/main/java/com/ediagnosis/cdr/value/Page.java similarity index 56% rename from src/main/java/com/ediagnosis/cdr/vo/Page.java rename to src/main/java/com/ediagnosis/cdr/value/Page.java index 87987c3..86e353e 100644 --- a/src/main/java/com/ediagnosis/cdr/vo/Page.java +++ b/src/main/java/com/ediagnosis/cdr/value/Page.java @@ -1,25 +1,25 @@ -package com.ediagnosis.cdr.vo; +package com.ediagnosis.cdr.value; import java.util.List; public class Page { - private int pageNo; - private int pageSize; - private int totalCount; + private long pageNo; + private long pageSize; + private long totalCount; private List content; - private int totalPage; + private long totalPage; public Page() { } - public Page(int pageNo, int pageSize, - int totalCount, List content) { + public Page(long pageNo, long pageSize, + long totalCount, List content) { this.pageNo = pageNo; this.pageSize = pageSize; this.totalCount = totalCount; this.content = content; - int tmp=totalCount / pageSize; - int tmp1=totalCount % pageSize; + long tmp=totalCount / pageSize; + long tmp1=totalCount % pageSize; if (tmp1>0) { this.totalPage = tmp+1; }else { @@ -29,22 +29,22 @@ public class Page { } - public int getPageNo() { + public long getPageNo() { return pageNo; } - public int getPageSize() { + public long getPageSize() { return pageSize; } - public int getTotalCount() { + public long getTotalCount() { return totalCount; } - public int getTotalPage() { + public long getTotalPage() { return totalPage; } @@ -53,15 +53,15 @@ public class Page { return content; } - public void setPageNo(int pageNo) { + public void setPageNo(long pageNo) { this.pageNo = pageNo; } - public void setPageSize(int pageSize) { + public void setPageSize(long pageSize) { this.pageSize = pageSize; } - public void setTotalCount(int totalCount) { + public void setTotalCount(long totalCount) { this.totalCount = totalCount; } @@ -69,7 +69,7 @@ public class Page { this.content = content; } - public void setTotalPage(int totalPage) { + public void setTotalPage(long totalPage) { this.totalPage = totalPage; } diff --git a/src/main/java/com/ediagnosis/cdr/value/Response.java b/src/main/java/com/ediagnosis/cdr/value/Response.java new file mode 100644 index 0000000..26603f7 --- /dev/null +++ b/src/main/java/com/ediagnosis/cdr/value/Response.java @@ -0,0 +1,71 @@ +package com.ediagnosis.cdr.value; + + +import java.io.Serializable; + + +public class Response implements Serializable { + + private boolean status; + private String msg; + private T content; + + + public Response(boolean status, String msg) { + this.status = status; + this.msg = msg; + } + + public Response(boolean status, String msg, T content) { + this.status = status; + this.msg = msg; + this.content = content; + } + + + + public static Response success(T content) { + return new Response<>(true, "", content); + } + + public static Response success(String msg, T content) { + return new Response<>(true, msg, content); + } + + public static Response success(String msg) { + return new Response<>(true, msg, null); + } + + public static Response error(String msg, T defaultContent) { + return new Response<>(false, msg, defaultContent); + } + + public static Response error(String msg) { + return new Response<>(false, msg, null); + } + + public boolean isStatus() { + return status; + } + + public void setStatus(boolean status) { + this.status = status; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public T getContent() { + return content; + } + + public void setContent(T content) { + this.content = content; + } + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 3f3a9d4..36969e0 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,3 +1,4 @@ + mybatis-flex: datasource: ds-mysql: @@ -6,4 +7,6 @@ mybatis-flex: password: Admin123456# ds-hive: url: jdbc:hive2://10.11.4.21:10000 - username: root \ No newline at end of file + username: root +server: + port: 7001 \ No newline at end of file diff --git a/src/test/java/com/ediagnosis/cdr/context/GraphTest.java b/src/test/java/com/ediagnosis/cdr/context/GraphTest.java new file mode 100644 index 0000000..03ce839 --- /dev/null +++ b/src/test/java/com/ediagnosis/cdr/context/GraphTest.java @@ -0,0 +1,4 @@ +package com.ediagnosis.cdr.context; + +public class GraphTest { +} diff --git a/src/test/java/com/ediagnosis/cdr/util/JsonProcessorTest.java b/src/test/java/com/ediagnosis/cdr/context/JsonProcessorTest.java similarity index 96% rename from src/test/java/com/ediagnosis/cdr/util/JsonProcessorTest.java rename to src/test/java/com/ediagnosis/cdr/context/JsonProcessorTest.java index ce92399..a9fd731 100644 --- a/src/test/java/com/ediagnosis/cdr/util/JsonProcessorTest.java +++ b/src/test/java/com/ediagnosis/cdr/context/JsonProcessorTest.java @@ -1,4 +1,4 @@ -package com.ediagnosis.cdr.util; +package com.ediagnosis.cdr.context; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/ediagnosis/cdr/context/MockTest.java b/src/test/java/com/ediagnosis/cdr/context/MockTest.java new file mode 100644 index 0000000..c4f75c2 --- /dev/null +++ b/src/test/java/com/ediagnosis/cdr/context/MockTest.java @@ -0,0 +1,40 @@ +package com.ediagnosis.cdr.context; + +import org.junit.jupiter.api.Test; +import org.mockito.InOrder; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +import static org.mockito.Mockito.*; + +@SpringBootTest +public class MockTest { + @Test + public void testBasicVerification() { + List mockList = mock(List.class); + + // 模拟调用 + mockList.add("apple"); + mockList.add("banana"); + mockList.add("apple"); + + + // 1. 验证方法被调用【恰好一次】(默认行为) + verify(mockList).add("banana"); + + // 2. 验证方法被调用【指定次数】 + verify(mockList, times(2)).add("apple"); // 精确2次 + + // 3. 验证方法【从未调用】 + verify(mockList, never()).clear(); + + // 4. 验证【调用顺序】 + InOrder inOrder = inOrder(mockList); + inOrder.verify(mockList).add("apple"); + inOrder.verify(mockList).add("banana"); + inOrder.verify(mockList).add("apple"); + + verifyNoMoreInteractions(mockList); + } +} diff --git a/src/test/java/com/ediagnosis/cdr/util/Person.java b/src/test/java/com/ediagnosis/cdr/context/Person.java similarity index 95% rename from src/test/java/com/ediagnosis/cdr/util/Person.java rename to src/test/java/com/ediagnosis/cdr/context/Person.java index f6982e1..888d1e5 100644 --- a/src/test/java/com/ediagnosis/cdr/util/Person.java +++ b/src/test/java/com/ediagnosis/cdr/context/Person.java @@ -1,4 +1,4 @@ -package com.ediagnosis.cdr.util; +package com.ediagnosis.cdr.context; import java.util.Objects; diff --git a/src/test/java/com/ediagnosis/cdr/util/TimeUtilTest.java b/src/test/java/com/ediagnosis/cdr/context/TimeUtilTest.java similarity index 97% rename from src/test/java/com/ediagnosis/cdr/util/TimeUtilTest.java rename to src/test/java/com/ediagnosis/cdr/context/TimeUtilTest.java index aec73ab..42c39df 100644 --- a/src/test/java/com/ediagnosis/cdr/util/TimeUtilTest.java +++ b/src/test/java/com/ediagnosis/cdr/context/TimeUtilTest.java @@ -1,4 +1,4 @@ -package com.ediagnosis.cdr.util; +package com.ediagnosis.cdr.context; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; diff --git a/src/test/java/com/ediagnosis/cdr/dao/DwsRepositoryTest.java b/src/test/java/com/ediagnosis/cdr/dao/DwsRepositoryTest.java new file mode 100644 index 0000000..6660607 --- /dev/null +++ b/src/test/java/com/ediagnosis/cdr/dao/DwsRepositoryTest.java @@ -0,0 +1,55 @@ +package com.ediagnosis.cdr.dao; + +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.row.Row; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.util.Assert; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@ExtendWith(SpringExtension.class) +@SpringBootTest +public class DwsRepositoryTest { + + + @Autowired + HiveQueryExecutor hiveQueryExecutor; + + @Test + public void queryPageWithSql() { + String sql = """ + select p.patient_id,p.patient_name,r.patient_id,r.visit_no from ods.xjd_patient_info p, ods.xjd_emergency_record r + where p.patient_id=r.patient_id and p.id='3'; + """; + Page rowPage = hiveQueryExecutor.selectByFullSql(sql, 1, 10); + System.out.println(rowPage); + Assert.isTrue(rowPage.getRecords().size() <= 10, "数据量不符合"); + List> result = rowPage.getRecords().stream() + .map(row -> { + Map camelKeysMap = row.toCamelKeysMap(); + Map flatMap = new HashMap<>(); + + camelKeysMap.forEach((table, value) -> { + if (value instanceof Map m) { + m.forEach((key, val) -> { + if (key instanceof String field && val instanceof String fieldValue) { + flatMap.put(table + "." + field, fieldValue); + } + }); + } + }); + + return flatMap; + }) + .filter(map -> !map.isEmpty()) // 可选:过滤掉空 map + .toList(); + System.out.println(result); + } + +} diff --git a/src/test/java/com/ediagnosis/cdr/dao/HiveQueryExecutorTest.java b/src/test/java/com/ediagnosis/cdr/dao/HiveQueryExecutorTest.java new file mode 100644 index 0000000..921a6f5 --- /dev/null +++ b/src/test/java/com/ediagnosis/cdr/dao/HiveQueryExecutorTest.java @@ -0,0 +1,323 @@ +package com.ediagnosis.cdr.dao; + + +import com.mybatisflex.core.datasource.DataSourceKey; +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.core.row.Db; +import com.mybatisflex.core.row.Row; +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.Function; +import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.parser.CCJSqlParser; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import net.sf.jsqlparser.parser.ParseException; +import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.Statements; +import net.sf.jsqlparser.statement.UnsupportedStatement; +import net.sf.jsqlparser.statement.select.*; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.util.Assert; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +class HiveQueryExecutorTest { + + + @Test + public void selectBySql() { + String sql = "SELECT * FROM ods.xjd_patient_info ORDER BY id LIMIT 10"; + try { + DataSourceKey.use("ds-hive"); + List rows = Db.selectListBySql(sql); + System.out.println(rows); + } finally { + DataSourceKey.clear(); + } + } + + @Test + public void parseSql() throws JSQLParserException { + String sqlStr = """ + select * from (select * from + ( + select t1.order_id as orderId, + t2.patient_name as patientName, + DATE_FORMAT(t2.create_ts,'%Y-%m') as 'ym', + t1.diagnosis, + t1.is_refill, + t2.state, + t4.patient_leave_hospital_time as endTime, + t2.to_hospital_time as startTime, + t4.transfer_code, + 0 as validPass, + 0 as pass, + t2.to_hospital_way as toTospitalWay, + ifnull(t1.is_n2s,0) as isN2s, + t1.treat_method + from diagnosis t1 + left join clinic_order t2 on t1.order_id = t2.id and t2.state not in (6, 10, 40) + left join treat_cp_rongshuan t3 on t2.id = t3.order_id + left join archive_info t4 on t2.id = t4.order_id + + inner join clinic_order_report AS t8 on t8.order_id = t2.id + + where + t2.product_id = 1 + and t2.state >= '1' + and t8.report_state in (1,2) + and t2.hospital_code = '1232456' + and t2.is_enabled = 1 + and t1.is_enabled = 1 + and t2.to_hospital_time is not null + and t2.create_ts between '2021-10-1' and '2022-10-2' + order by t1.diag_time desc, t1.id desc + limit 10 + ) tmp group by orderId ) t9 + where t9.diagnosis in ('1') + and t9.treat_method is not null + and (t9.treat_method like '%17%' + or t9.treat_method like '%26%' + or t9.treat_method like '%50%' + ) + """; + + + Statement statement = CCJSqlParserUtil.parse(sqlStr); + + if (statement instanceof PlainSelect plainSelect) { + Limit limit = plainSelect.getLimit(); + if (limit == null) { + System.out.println("判断不存在limit从句,添加从句"); + Select select = plainSelect.withLimit( + new Limit() + .withRowCount(new LongValue(10)) + .withOffset(new LongValue(0)) + ); + System.out.println(select.toString()); + } else { + System.out.println("判断存在limit从句,不添加"); + System.out.println(plainSelect.toString()); + } + } + + } + + + @Test + public void parseSqlFromItem() throws JSQLParserException { + String sqlStr1 = """ + select * from (select * from + ( + select t1.order_id as orderId, + t2.patient_name as patientName, + DATE_FORMAT(t2.create_ts,'%Y-%m') as 'ym', + t1.diagnosis, + t1.is_refill, + t2.state, + t4.patient_leave_hospital_time as endTime, + t2.to_hospital_time as startTime, + t4.transfer_code, + 0 as validPass, + 0 as pass, + t2.to_hospital_way as toTospitalWay, + ifnull(t1.is_n2s,0) as isN2s, + t1.treat_method + from diagnosis t1 + left join clinic_order t2 on t1.order_id = t2.id and t2.state not in (6, 10, 40) + left join treat_cp_rongshuan t3 on t2.id = t3.order_id + left join archive_info t4 on t2.id = t4.order_id + + inner join clinic_order_report AS t8 on t8.order_id = t2.id + + where + t2.product_id = 1 + and t2.state >= '1' + and t8.report_state in (1,2) + and t2.hospital_code = '1232456' + and t2.is_enabled = 1 + and t1.is_enabled = 1 + and t2.to_hospital_time is not null + and t2.create_ts between '2021-10-1' and '2022-10-2' + order by t1.diag_time desc, t1.id desc + limit 10 + ) tmp group by orderId ) t9 + where t9.diagnosis in ('1') + and t9.treat_method is not null + and (t9.treat_method like '%17%' + or t9.treat_method like '%26%' + or t9.treat_method like '%50%' + ) + """; + String sqlStr2 = """ + select p.patient_id,p.patient_name,r.visit_no from ods.xjd_patient_info p, ods.xjd_emergency_record r + where p.patient_id=r.patient_id and p.id='3'; + """; + + + Statement statement1 = CCJSqlParserUtil.parse(sqlStr1); + Statement statement2 = CCJSqlParserUtil.parse(sqlStr2); + changeToAllColumns(statement1); + changeToAllColumns(statement2); + + } + + + @Test + public void changeToCountSql() throws JSQLParserException { + String sqlStr1 = """ + select * from (select * from + ( + select t1.order_id as orderId, + t2.patient_name as patientName, + DATE_FORMAT(t2.create_ts,'%Y-%m') as 'ym', + t1.diagnosis, + t1.is_refill, + t2.state, + t4.patient_leave_hospital_time as endTime, + t2.to_hospital_time as startTime, + t4.transfer_code, + 0 as validPass, + 0 as pass, + t2.to_hospital_way as toTospitalWay, + ifnull(t1.is_n2s,0) as isN2s, + t1.treat_method + from diagnosis t1 + left join clinic_order t2 on t1.order_id = t2.id and t2.state not in (6, 10, 40) + left join treat_cp_rongshuan t3 on t2.id = t3.order_id + left join archive_info t4 on t2.id = t4.order_id + + inner join clinic_order_report AS t8 on t8.order_id = t2.id + + where + t2.product_id = 1 + and t2.state >= '1' + and t8.report_state in (1,2) + and t2.hospital_code = '1232456' + and t2.is_enabled = 1 + and t1.is_enabled = 1 + and t2.to_hospital_time is not null + and t2.create_ts between '2021-10-1' and '2022-10-2' + order by t1.diag_time desc, t1.id desc + limit 10 + ) tmp group by orderId ) t9 + where t9.diagnosis in ('1') + and t9.treat_method is not null + and (t9.treat_method like '%17%' + or t9.treat_method like '%26%' + or t9.treat_method like '%50%' + ) + """; + String sqlStr2 = """ + select p.patient_id,p.patient_name,r.visit_no from ods.xjd_patient_info p, ods.xjd_emergency_record r + where p.patient_id=r.patient_id and p.id='3'; + """; + + String sqlStr3 = """ + select count(*) + from ods.xjd_patient_info p, ods.xjd_emergency_record r + where p.patient_id=r.patient_id and p.id='3'; + """; + + Statement statement3 = CCJSqlParserUtil.parse(sqlStr3); + Statement statement2 = CCJSqlParserUtil.parse(sqlStr2); + Statement statement1 = CCJSqlParserUtil.parse(sqlStr1); + + changeToCuntColumns(statement1); + changeToCuntColumns(statement2); + changeToCuntColumns(statement3); + + } + + private void changeToCuntColumns(Statement statement) { + List> selectItems = null; + if (statement instanceof PlainSelect plainSelect) { + selectItems = plainSelect.getSelectItems(); + } + Assert.notNull(selectItems, ""); + selectItems.clear(); + selectItems.add(new SelectItem<>( + new Function("count", new AllColumns()) + ) + ); + System.out.println(statement); + + } + + + private void changeToAllColumns(Statement statement) { + + + List> selectItems = null; + + if (statement instanceof PlainSelect plainSelect) { + selectItems = plainSelect.getSelectItems(); + } + Assert.notNull(selectItems, ""); + + if (selectItems.size() > 1) { + selectItems.clear(); + selectItems.add(new SelectItem<>(new AllColumns())); + } else if (selectItems.size() == 1) { + SelectItem selectItem = selectItems.getFirst(); + Expression expression = selectItem.getExpression(); + if (!(expression instanceof AllColumns allColumns)) { + expression = new AllColumns(); + } + } + System.out.println(statement.toString()); + } + + + @Test + public void parseSqlErrorRecoveryTest() throws ParseException { + CCJSqlParser parser = new CCJSqlParser( + "select * from mytable; select from; select * from mytable2"); + Statements statements = parser.withErrorRecovery().Statements(); + +// 3 statements, the failing one set to NULL + assertEquals(3, statements.size()); + assertNull(statements.get(1)); + +// errors are recorded + assertEquals(1, parser.getParseErrors().size()); + } + + @Test + public void parseSqlUnsupportedStatementTest() throws ParseException, JSQLParserException { + CCJSqlParser parser = new CCJSqlParser( + "select * from mytable; select from; select * from mytable2; select 4;"); + parser.withUnsupportedStatements(); + Statements statements = parser.Statements(); + +// 4 statements with one Unsupported Statement holding the content + assertEquals(4, statements.size()); + assertInstanceOf(UnsupportedStatement.class, statements.get(1)); + assertEquals("select from", statements.get(1).toString()); + +// no errors records, because a statement has been returned + assertEquals(0, parser.getParseErrors().size()); + } + + + @Test + public void selectPage() { + try { + DataSourceKey.use("ds-hive"); + QueryWrapper query = QueryWrapper.create() + .where("id > ?", 18); + Page rowPage = Db.paginate("ods.xjd_patient_info", 1, 10, query); + System.out.println(rowPage); + } finally { + DataSourceKey.clear(); + } + + } + + +} \ No newline at end of file diff --git a/src/test/java/com/ediagnosis/cdr/dao/StringTest.java b/src/test/java/com/ediagnosis/cdr/dao/StringTest.java new file mode 100644 index 0000000..1cd9eb5 --- /dev/null +++ b/src/test/java/com/ediagnosis/cdr/dao/StringTest.java @@ -0,0 +1,33 @@ +package com.ediagnosis.cdr.dao; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class StringTest { + + @Test + public void test() { + String sql = "字符串"; + changString(sql); + System.out.println(sql); + } + + private void changString(String sql) { + sql+= ";changString();"; + } + + private String returnString(String sql) { + return sql+= ";returnString();"; + } + + private String returnNewString(String sql) { + return sql + ";returnNewString();"; + } + + private String returnNewString2(String sql) { + String newString = new String(sql); + return newString + ";returnNewString2();"; + } + +} diff --git a/src/test/java/com/ediagnosis/cdr/dashBoard/AsyncTest.java b/src/test/java/com/ediagnosis/cdr/dashBoard/AsyncTest.java new file mode 100644 index 0000000..dc12741 --- /dev/null +++ b/src/test/java/com/ediagnosis/cdr/dashBoard/AsyncTest.java @@ -0,0 +1,51 @@ +package com.ediagnosis.cdr.dashBoard; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicInteger; + +@SpringBootTest +public class AsyncTest { + + + @Test + public void test() throws ExecutionException, InterruptedException { + + + List> futures = new ArrayList<>(5); + try (ExecutorService executorService = Executors.newFixedThreadPool(10)) { + for (int j=1;j<6;j++) { + int finalJ = j; + Future future = executorService.submit(() -> { + System.out.println(LocalDateTime.now()+" task " + finalJ + " submit from " + Thread.currentThread().getName()); + + try { + Thread.sleep(1000L * finalJ); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + + return finalJ; + }); + futures.add(future); + } + + + for (int j=0;j<5;j++) { + Future future = futures.get(j); + Integer integer = future.get(); + System.out.println(LocalDateTime.now()+" task " + integer+ " complete from " + Thread.currentThread().getName()); + } + } + + } +} diff --git a/src/test/java/com/ediagnosis/cdr/dashBoard/DashBoardTest.java b/src/test/java/com/ediagnosis/cdr/dashBoard/DashBoardTest.java new file mode 100644 index 0000000..fa8b6b6 --- /dev/null +++ b/src/test/java/com/ediagnosis/cdr/dashBoard/DashBoardTest.java @@ -0,0 +1,69 @@ +package com.ediagnosis.cdr.dashBoard; + +import java.io.BufferedReader; +import java.io.InputStreamReader; + +public class DashBoardTest { + + public static void main(String[] args) throws Exception { + System.out.println("top -bn1"); + getCpuUsage(); + System.out.println("free -h"); + getMemoryUsage(); + System.out.println("df -h /"); + getDiskUsage(); + System.out.println("cat /proc/loadavg"); + getLoadAverage(); + + } + + public static void getCpuUsage() throws Exception { + ProcessBuilder pb = new ProcessBuilder("top", "-bn1"); + Process process = pb.start(); + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + while ((line = reader.readLine()) != null) { + if (line.contains("Cpu(s)")) { + System.out.println(line); + } + } + } + + public static void getMemoryUsage() throws Exception { + ProcessBuilder pb = new ProcessBuilder("free", "-h"); + Process process = pb.start(); + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + while ((line = reader.readLine()) != null) { + if (line.startsWith("Mem:")) { + System.out.println(line); + } + } + } + + + public static void getDiskUsage() throws Exception { + ProcessBuilder pb = new ProcessBuilder("df", "-h", "/"); + Process process = pb.start(); + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + while ((line = reader.readLine()) != null) { + System.out.println(line); + } + } + + + public static void getLoadAverage() throws Exception { + ProcessBuilder pb = new ProcessBuilder("cat", "/proc/loadavg"); + Process process = pb.start(); + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + while ((line = reader.readLine()) != null) { + System.out.println(line); + } + System.out.println("cpu cores:"+ Runtime.getRuntime().availableProcessors()); + } + + + +} diff --git a/src/test/java/com/ediagnosis/cdr/dashBoard/DashBoardTest2.java b/src/test/java/com/ediagnosis/cdr/dashBoard/DashBoardTest2.java new file mode 100644 index 0000000..e5ed57c --- /dev/null +++ b/src/test/java/com/ediagnosis/cdr/dashBoard/DashBoardTest2.java @@ -0,0 +1,159 @@ +package com.ediagnosis.cdr.dashBoard; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class DashBoardTest2 { + public static void main(String[] args) throws Exception { + + System.out.println("cpu info:-----------------"); + System.out.println(getCpuUsage()); + System.out.println("memory info:-----------------"); + System.out.println(getMemoryUsage()); + System.out.println("disk info:-----------------"); + System.out.println(getDiskUsage()); + } + + + + public static Map getCpuUsage() throws Exception { + ProcessBuilder pb = new ProcessBuilder("top", "-bn1"); + Process process = pb.start(); + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + String cpuLine = ""; + String loadLine = ""; + while ((line = reader.readLine()) != null) { + if (line.contains("load average:")) { + loadLine = line; + } else if (line.contains("Cpu(s)")) { + cpuLine = line; + } + if (!cpuLine.isBlank() && !loadLine.isBlank()) { + break; + } + } + + // 去掉前缀 "%Cpu(s):",并提取数字 + String[] parts = cpuLine + .replace("%Cpu(s):", "") + .trim() + .split(","); + + // 存储各个字段的值 + double id = 0; + + for (String part : parts) { + part = part.trim(); + + if (part.endsWith("id")) { + id = Double.parseDouble(part.replace("id", "").trim()); + } + + } + String cpuUsage = Math.round(100 - id)+ "%"; + String cpuCores = String.valueOf( + Runtime.getRuntime().availableProcessors() + ); + + String loadAverage = ""; + // 正则匹配 "load average: 数值, 数值, 数值" + Pattern pattern = Pattern.compile("load average: ([\\d.]+), ([\\d.]+), ([\\d.]+)"); + Matcher matcher = pattern.matcher(loadLine); + + if (matcher.find()) { + double fiveMin = Double.parseDouble(matcher.group(2)); + loadAverage = String.valueOf(fiveMin); + } + + + // 方法一:100 - idle + return Map.of( + "cpuUsage", cpuUsage, + "cpuCores", cpuCores, + "loadAverage", loadAverage + ); + } + + + public static Map getMemoryUsage() throws Exception { + ProcessBuilder pb = new ProcessBuilder("free", "-h"); + Process process = pb.start(); + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + String memLine=""; + while ((line = reader.readLine()) != null) { + if (line.startsWith("Mem:")) { + memLine = line; + } + } + + // 将多个空格替换为单个空格,便于分割 + String[] parts = memLine.trim().replaceAll("\\s+", " ").split(" "); + + // 解析各字段(单位:KB、M、G) + String totalStr = parts[1]; + String availableStr = parts[6]; + + // 转换为统一单位(GB) + double total = parseSizeToGB(totalStr); + double available = parseSizeToGB(availableStr); + + // 计算内存使用率:(1 - available / total) * 100% + double usagePercent = (1 - (available / total)) * 100; + String memoryUsage =Math.round(usagePercent) +"%"; + String used=(total-available)+"G"; + String size=total+"G"; + String freee=available+"G"; + return Map.of( + "used",used, + "size",size, + "freee",freee, + "memoryUsage",memoryUsage + ); + } + private static double parseSizeToGB(String size) { + double value = 0; + if (size.endsWith("G")) { + value = Double.parseDouble(size.replace("G", "")); + } else if (size.endsWith("M")) { + value = Double.parseDouble(size.replace("M", "")) / 1024; + } else if (size.endsWith("K")) { + value = Double.parseDouble(size.replace("K", "")) / (1024 * 1024); + } else { + value = Double.parseDouble(size) / (1024 * 1024 * 1024); + } + return value; + } + public static Map getDiskUsage() throws Exception { + ProcessBuilder pb = new ProcessBuilder("df", "-h", "/"); + Process process = pb.start(); + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String header=reader.readLine(); + String body = reader.readLine(); + String[] parts = body.trim().replaceAll("\\s+", " ").split(" "); + + // 确保是有效行(至少有6列) + if (parts.length < 6 || parts[4].indexOf('%') == -1) { + throw new IllegalArgumentException("无效的磁盘使用行"); + } + + // 提取 Use% 字段(如 "69%") + String usePercent = parts[4]; + String size=parts[1]; + String free=parts[3]; + String used=parts[2]; + + // 转换为整数 + return Map.of("usePercent", usePercent, + "size", size, + "free", free, + "used", used); + + } + + +} diff --git a/src/test/java/com/ediagnosis/cdr/service/HiveServiceTest.java b/src/test/java/com/ediagnosis/cdr/service/HiveServiceTest.java deleted file mode 100644 index d12f479..0000000 --- a/src/test/java/com/ediagnosis/cdr/service/HiveServiceTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.ediagnosis.cdr.service; - - -import com.mybatisflex.core.datasource.DataSourceKey; -import com.mybatisflex.core.row.Db; -import com.mybatisflex.core.row.Row; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.List; - -@SpringBootTest -class HiveServiceTest { - - - @Test - public void selectPage() { - String sql = "SELECT * FROM ods.xjd_patient_info ORDER BY id LIMIT 10"; - try { - DataSourceKey.use("ds-hive"); - List rows = Db.selectListBySql(sql); - System.out.println(rows); - } finally { - DataSourceKey.clear(); - } - } - - @Test - public void insertTest() { - - String sql = "INSERT INTO TABLE ods.test1(id) VALUES (?)"; - try { - DataSourceKey.use("ds-hive"); - int rows = Db.insertBySql(sql,2); - System.out.println(rows); - } finally { - DataSourceKey.clear(); - } - } - - -} \ No newline at end of file -- 2.18.1