zhouhao vor 7 Jahren
Ursprung
Commit
6bb0c6d98e

+ 78 - 0
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/builder/SqlParamParser.java

@@ -0,0 +1,78 @@
+package org.hswebframework.web.dao.mybatis.builder;
+
+import org.apache.commons.beanutils.BeanMap;
+import org.hswebframework.ezorm.core.Conditional;
+import org.hswebframework.ezorm.core.NestConditional;
+import org.hswebframework.ezorm.core.dsl.Query;
+import org.hswebframework.ezorm.core.param.Param;
+import org.hswebframework.ezorm.core.param.QueryParam;
+import org.hswebframework.ezorm.core.param.Term;
+import org.hswebframework.utils.StringUtils;
+import org.hswebframework.web.commons.entity.Entity;
+import org.hswebframework.web.commons.entity.QueryEntity;
+import org.hswebframework.web.commons.entity.param.QueryParamEntity;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiConsumer;
+
+/**
+ * @author zhouhao
+ * @since 3.0
+ */
+public class SqlParamParser {
+
+    public static QueryParamEntity parseQueryParam(Object param) {
+        return new QueryParamParser().parse(param).get();
+    }
+
+    private static class QueryParamParser {
+        private Query<?, QueryParamEntity> query = Query.empty(new QueryParamEntity());
+
+        private BiConsumer<String, Object> consumer = (k, v) -> {
+            if (k.endsWith("$or")) {
+                k = k.substring(0, k.length() - 3);
+                query.or(k, v);
+            } else {
+                query.and(k, v);
+            }
+        };
+
+        private QueryParamParser parse(Object obj) {
+            if (obj instanceof Map) {
+                ((Map) obj).forEach((k, v) -> {
+                    String key = String.valueOf(k);
+                    if ("pageIndex".equals(key)) {
+                        query.getParam().setPageIndex(StringUtils.toInt(v));
+                    }
+                    if ("pageSize".equals(key)) {
+                        query.getParam().setPageSize(StringUtils.toInt(v));
+                    }
+                    if (v != null) {
+                        if (v instanceof Entity || v instanceof Map) {
+                            List<Term> terms = new QueryParamParser().parse(v).get().getTerms();
+                            Term term = new Term();
+                            term.setType(key.equalsIgnoreCase("or") ? Term.Type.or : Term.Type.and);
+                            term.setTerms(terms);
+                            query.getParam().getTerms().add(term);
+                        } else {
+                            consumer.accept(String.valueOf(key), v);
+                        }
+                    }
+                });
+            } else {
+                Map map = new HashMap<>(new BeanMap(obj));
+                map.remove("class");
+                map.remove("declaringClass");
+                parse(map);
+            }
+            return this;
+        }
+
+        private QueryParamEntity get() {
+            return query.getParam();
+        }
+    }
+}

+ 63 - 0
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/test/java/org/hswebframework/web/dao/mybatis/builder/SqlParamParserTest.java

@@ -0,0 +1,63 @@
+package org.hswebframework.web.dao.mybatis.builder;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hswebframework.ezorm.core.param.Term;
+import org.hswebframework.web.commons.entity.QueryEntity;
+import org.hswebframework.web.commons.entity.param.QueryParamEntity;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import static org.junit.Assert.*;
+
+/**
+ * @author zhouhao
+ * @since 1.0
+ */
+public class SqlParamParserTest {
+
+    @Test
+    public void testParseQueryParam() {
+        Map<String, Object> queryParam = new LinkedHashMap<>();
+        queryParam.put("name", "张三");
+        queryParam.put("name$like$or", "王五");
+        queryParam.put("and", TestQueryEntity
+                .builder()
+                .name$like("李四%").age$gt(1)
+                .or(TestQueryEntity.builder().name$like("王五").age$gt(10).build())
+                .build());
+
+        QueryParamEntity entity = SqlParamParser.parseQueryParam(queryParam);
+
+        Assert.assertTrue(!entity.getTerms().isEmpty());
+        Assert.assertEquals(entity.getTerms().get(0).getColumn(), "name");
+        Assert.assertEquals(entity.getTerms().get(0).getType(), Term.Type.and);
+
+        Assert.assertEquals(entity.getTerms().get(1).getColumn(), "name");
+        Assert.assertEquals(entity.getTerms().get(1).getTermType(), "like");
+        Assert.assertEquals(entity.getTerms().get(1).getType(), Term.Type.or);
+
+
+        Assert.assertEquals(entity.getTerms().get(2).getType(), Term.Type.and);
+        Assert.assertTrue(!entity.getTerms().get(2).getTerms().isEmpty());
+        Assert.assertEquals(entity.getTerms().get(2).getTerms().get(0).getTermType(), "like");
+
+        Assert.assertEquals(entity.getTerms().get(2).getTerms().get(1).getTermType(), "gt");
+
+        Assert.assertTrue(!entity.getTerms().get(2).getTerms().get(2).getTerms().isEmpty());
+        Assert.assertEquals(entity.getTerms().get(2).getTerms().get(2).getTerms().get(0).getTermType(), "like");
+        Assert.assertEquals(entity.getTerms().get(2).getTerms().get(2).getTerms().get(1).getTermType(), "gt");
+
+        System.out.println(JSON.toJSONString(entity, SerializerFeature.PrettyFormat));
+    }
+
+
+}

+ 20 - 0
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/test/java/org/hswebframework/web/dao/mybatis/builder/TestQueryEntity.java

@@ -0,0 +1,20 @@
+package org.hswebframework.web.dao.mybatis.builder;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hswebframework.web.commons.entity.QueryEntity;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TestQueryEntity implements QueryEntity {
+
+    private String name$like;
+
+    private int age$gt;
+
+    private TestQueryEntity or;
+}

+ 9 - 0
hsweb-commons/hsweb-commons-entity/src/main/java/org/hswebframework/web/commons/entity/QueryEntity.java

@@ -0,0 +1,9 @@
+package org.hswebframework.web.commons.entity;
+
+/**
+ * @author zhouhao
+ * @since 3.0
+ */
+public interface QueryEntity extends Entity {
+   
+}

+ 2 - 1
hsweb-commons/hsweb-commons-entity/src/main/java/org/hswebframework/web/commons/entity/param/QueryParamEntity.java

@@ -2,6 +2,7 @@ package org.hswebframework.web.commons.entity.param;
 
 import org.hswebframework.ezorm.core.param.QueryParam;
 import org.hswebframework.web.commons.entity.Entity;
+import org.hswebframework.web.commons.entity.QueryEntity;
 
 /**
  * 查询参数实体,使用<a href="https://github.com/hs-web/hsweb-easy-orm">easyorm</a>进行动态查询参数构建<br>
@@ -18,7 +19,7 @@ import org.hswebframework.web.commons.entity.Entity;
  * @see Entity
  * @since 3.0
  */
-public class QueryParamEntity extends QueryParam implements Entity {
+public class QueryParamEntity extends QueryParam implements QueryEntity {
 
     /**
      * 创建一个空的查询参数实体,该实体无任何参数.

+ 75 - 0
hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/test/java/org/hswebframework/web/service/GenericEntityServiceTest.java

@@ -0,0 +1,75 @@
+package org.hswebframework.web.service;
+
+import org.hswebframework.web.commons.entity.PagerResult;
+import org.hswebframework.web.commons.entity.param.QueryParamEntity;
+import org.hswebframework.web.dao.CrudDao;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.stubbing.Answer;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+
+/**
+ * @author zhouhao
+ * @since 3.0
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class GenericEntityServiceTest {
+
+    @InjectMocks
+    private TestEntityService entityService = new TestEntityService();
+
+    @Mock
+    private CrudDao<TestEntity, String> dao;
+
+    private QueryParamEntity queryParamEntity = new QueryParamEntity();
+
+    @Before
+    public void init() {
+
+        when(dao.query(queryParamEntity)).then((Answer<List<TestEntity>>) invocationOnMock -> new ArrayList<>(Arrays.asList(TestEntity.builder()
+                .age((byte) 10)
+                .enabled(true)
+                .name("test")
+                .build())));
+
+        when(dao.count(queryParamEntity)).thenReturn(1);
+
+        doAnswer(invocationOnMock -> {
+            Assert.assertNotEquals(invocationOnMock.getArguments().length, 1);
+            Assert.assertNotNull(invocationOnMock.getArguments()[0]);
+            return null;
+        }).when(dao).insert(anyObject());
+    }
+
+    @Test
+    public void testQuery() {
+        PagerResult<TestEntity> result = entityService.selectPager(queryParamEntity);
+
+        Assert.assertEquals(result.getTotal(), 1);
+        Assert.assertEquals(result.getData().size(), 1);
+
+        TestEntity testEntity = TestEntity.builder()
+                .age((byte) 1)
+                .enabled(true)
+                .name("测试")
+                .build();
+
+        entityService.insert(testEntity);
+
+        Assert.assertNotNull(testEntity.getId());
+
+        System.out.println(result.getTotal());
+    }
+}

+ 23 - 0
hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/test/java/org/hswebframework/web/service/TestEntity.java

@@ -0,0 +1,23 @@
+package org.hswebframework.web.service;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hswebframework.web.commons.entity.SimpleGenericEntity;
+
+/**
+ * @author zhouhao
+ * @since 1.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TestEntity extends SimpleGenericEntity<String> {
+    private String name;
+
+    private Byte age;
+
+    private Boolean enabled;
+}

+ 27 - 0
hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/test/java/org/hswebframework/web/service/TestEntityService.java

@@ -0,0 +1,27 @@
+package org.hswebframework.web.service;
+
+import org.hswebframework.web.dao.CrudDao;
+import org.hswebframework.web.id.IDGenerator;
+
+/**
+ * @author zhouhao
+ * @since 3.0
+ */
+public class TestEntityService extends GenericEntityService<TestEntity, String> {
+
+    private CrudDao<TestEntity, String> dao;
+
+    @Override
+    protected IDGenerator<String> getIDGenerator() {
+        return IDGenerator.MD5;
+    }
+
+    @Override
+    public CrudDao<TestEntity, String> getDao() {
+        return dao;
+    }
+
+    public void setDao(CrudDao<TestEntity, String> dao) {
+        this.dao = dao;
+    }
+}