diff --git a/README.md b/README.md index 3e465cc..04d4d1c 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ xyz.erupt linq.j - 0.0.3 + 0.0.4 ``` diff --git a/pom.xml b/pom.xml index 4f75f78..595a156 100644 --- a/pom.xml +++ b/pom.xml @@ -6,10 +6,10 @@ xyz.erupt linq.j - 0.0.3 + 0.0.4 Linq.j - Linq.J A JVM → Lambda based federated analysis library + Linq.J in Java , Lambda Language Integrated Query library https://github.com/erupts/Linq.J diff --git a/src/main/java/xyz/erupt/linq/Linq.java b/src/main/java/xyz/erupt/linq/Linq.java index c482c44..31f714a 100644 --- a/src/main/java/xyz/erupt/linq/Linq.java +++ b/src/main/java/xyz/erupt/linq/Linq.java @@ -24,7 +24,6 @@ public Linq() { private final Dql dql = new Dql(); - public static Linq from(Collection data) { Linq linq = new Linq(); linq.dql.setFrom(data); @@ -80,16 +79,28 @@ public Linq distinct() { } @Override - public Linq select(Column column, Column... columns) { - this.dql.getColumns().addAll(Columns.columnsUnfold(column)); + public Linq select(Column... columns) { this.dql.getColumns().addAll(Columns.columnsUnfold(columns)); return this; } + @SafeVarargs + @Override + public final Linq selectExclude(SFunction... columns) { + this.dql.getColumns().removeIf(it -> { + for (SFunction column : columns) { + if (Columns.of(column).equals(it)) { + return true; + } + } + return false; + }); + return this; + } + @Override @SafeVarargs - public final Linq select(SFunction column, SFunction... columns) { - this.dql.getColumns().add(Columns.of(column)); + public final Linq select(SFunction... columns) { for (SFunction col : columns) { this.dql.getColumns().add(Columns.of(col)); } diff --git a/src/main/java/xyz/erupt/linq/engine/EruptEngine.java b/src/main/java/xyz/erupt/linq/engine/EruptEngine.java index c5e6566..9aaccf5 100644 --- a/src/main/java/xyz/erupt/linq/engine/EruptEngine.java +++ b/src/main/java/xyz/erupt/linq/engine/EruptEngine.java @@ -4,7 +4,7 @@ import xyz.erupt.linq.consts.OrderByDirection; import xyz.erupt.linq.exception.LinqException; import xyz.erupt.linq.schema.*; -import xyz.erupt.linq.util.ColumnReflects; +import xyz.erupt.linq.util.RowUtil; import xyz.erupt.linq.util.Columns; import java.util.*; @@ -15,40 +15,13 @@ public class EruptEngine extends Engine { @Override public List query(Dql dql) { - List dataset = ColumnReflects.listToRow(dql.getFrom()); + List dataset = RowUtil.listObjectToRow(dql.getFrom()); // join process if (!dql.getJoinSchemas().isEmpty()) { - for (JoinSchema joinSchema : dql.getJoinSchemas()) { - Column lon = Columns.of(joinSchema.getLon()); - Column ron = Columns.of(joinSchema.getRon()); - if (joinSchema.getJoinExchange() == JoinExchange.HASH) { - List targetData = ColumnReflects.listToRow(joinSchema.getTarget()); - switch (joinSchema.getJoinMethod()) { - case LEFT: - this.crossHashJoin(dataset, ron, targetData, lon); - break; - case RIGHT: - this.crossHashJoin(targetData, lon, dataset, ron); - dataset = targetData; - break; - case INNER: - this.crossHashJoin(dataset, ron, targetData, lon); - dataset.removeIf(it -> !it.containsKey(lon)); - break; - case FULL: - this.crossHashJoin(dataset, ron, targetData, lon); - this.crossHashJoin(targetData, lon, dataset, ron); - targetData.removeIf(it -> it.containsKey(ron)); - dataset.addAll(targetData); - break; - } - } else { - throw new LinqException(joinSchema.getJoinExchange().name() + " is not supported yet"); - } - } + this.join(dql, dataset); } - // condition process - if (!dql.getWheres().isEmpty()){ + // where process + if (!dql.getWheres().isEmpty()) { dataset.removeIf(it -> { for (Function condition : dql.getWheres()) { if (!condition.apply(it)) return true; @@ -83,7 +56,7 @@ public List query(Dql dql) { dataset.addAll($table); } // having process - if (!dql.getHaving().isEmpty()){ + if (!dql.getHaving().isEmpty()) { dataset.removeIf(it -> { for (Function condition : dql.getHaving()) { if (!condition.apply(it)) return true; @@ -92,7 +65,9 @@ public List query(Dql dql) { }); } // order by process - this.orderBy(dql, dataset); + if (!dql.getOrderBys().isEmpty()) { + this.orderBy(dql, dataset); + } // limit if (null != dql.getOffset()) { dataset = dql.getOffset() > dataset.size() ? new ArrayList<>(0) : dataset.subList(dql.getOffset(), dataset.size()); @@ -107,6 +82,38 @@ public List query(Dql dql) { return dataset; } + public void join(Dql dql, List dataset) { + for (JoinSchema joinSchema : dql.getJoinSchemas()) { + Column lon = Columns.of(joinSchema.getLon()); + Column ron = Columns.of(joinSchema.getRon()); + if (joinSchema.getJoinExchange() == JoinExchange.HASH) { + List targetData = RowUtil.listObjectToRow(joinSchema.getTarget()); + switch (joinSchema.getJoinMethod()) { + case LEFT: + this.crossHashJoin(dataset, ron, targetData, lon); + break; + case RIGHT: + this.crossHashJoin(targetData, lon, dataset, ron); + dataset.clear(); + dataset.addAll(targetData); + break; + case INNER: + this.crossHashJoin(dataset, ron, targetData, lon); + dataset.removeIf(it -> !it.containsKey(lon)); + break; + case FULL: + this.crossHashJoin(dataset, ron, targetData, lon); + this.crossHashJoin(targetData, lon, dataset, ron); + targetData.removeIf(it -> it.containsKey(ron)); + dataset.addAll(targetData); + break; + } + } else { + throw new LinqException(joinSchema.getJoinExchange().name() + " is not supported yet"); + } + } + } + //Cartesian product case private void crossHashJoin(List source, Column sourceColumn, List target, Column targetColumn) { @@ -171,23 +178,21 @@ public List groupBy(Dql dql, List dataset) { } public void orderBy(Dql dql, List dataset) { - if (null != dql.getOrderBys() && !dql.getOrderBys().isEmpty()) { - dataset.sort((a, b) -> { - int i = 0; - for (OrderBySchema orderBy : dql.getOrderBys()) { - if (null == a.get(orderBy.getColumn()) || null == b.get(orderBy.getColumn())) return 0; - if (a.get(orderBy.getColumn()) instanceof Comparable) { - Comparable comparable = (Comparable) a.get(orderBy.getColumn()); - i = comparable.compareTo(b.get(orderBy.getColumn())); - if (orderBy.getDirection() == OrderByDirection.DESC) i = ~i + 1; - if (i != 0) return i; - } else { - throw new LinqException(orderBy.getColumn().getTable() + "." + orderBy.getColumn().getField() + " sort does not implement the Comparable interface"); - } + dataset.sort((a, b) -> { + int i = 0; + for (OrderBySchema orderBy : dql.getOrderBys()) { + if (null == a.get(orderBy.getColumn()) || null == b.get(orderBy.getColumn())) return 0; + if (a.get(orderBy.getColumn()) instanceof Comparable) { + Comparable comparable = (Comparable) a.get(orderBy.getColumn()); + i = comparable.compareTo(b.get(orderBy.getColumn())); + if (orderBy.getDirection() == OrderByDirection.DESC) i = ~i + 1; + if (i != 0) return i; + } else { + throw new LinqException(orderBy.getColumn().getTable() + "." + orderBy.getColumn().getField() + " sort does not implement the Comparable interface"); } - return i; - }); - } + } + return i; + }); } } diff --git a/src/main/java/xyz/erupt/linq/grammar/Select.java b/src/main/java/xyz/erupt/linq/grammar/Select.java index 5099c1d..68abbd8 100644 --- a/src/main/java/xyz/erupt/linq/grammar/Select.java +++ b/src/main/java/xyz/erupt/linq/grammar/Select.java @@ -8,8 +8,10 @@ public interface Select { Linq distinct(); - Linq select(Column column, Column... columns); + Linq select(Column... columns); - Linq select(SFunction column, SFunction... columns); + Linq selectExclude(SFunction... columns); + + Linq select(SFunction... columns); } diff --git a/src/main/java/xyz/erupt/linq/grammar/Write.java b/src/main/java/xyz/erupt/linq/grammar/Write.java index 2b0d4c8..26d70a9 100644 --- a/src/main/java/xyz/erupt/linq/grammar/Write.java +++ b/src/main/java/xyz/erupt/linq/grammar/Write.java @@ -4,7 +4,7 @@ import xyz.erupt.linq.exception.LinqException; import xyz.erupt.linq.schema.Dql; import xyz.erupt.linq.schema.Row; -import xyz.erupt.linq.util.ColumnReflects; +import xyz.erupt.linq.util.RowUtil; import java.util.ArrayList; import java.util.HashMap; @@ -23,7 +23,7 @@ public interface Write { default List write(Class clazz) { wEngine().preprocessor(this.wDQL()); List table = wEngine().query(this.wDQL()); - return table.stream().map(it -> ColumnReflects.rowToObject(it, clazz)).collect(Collectors.toList()); + return table.stream().map(it -> RowUtil.rowToObject(it, clazz)).collect(Collectors.toList()); } default T writeOne(Class clazz) { @@ -32,7 +32,7 @@ default T writeOne(Class clazz) { if (result.isEmpty()) { return null; } else if (result.size() == 1) { - return ColumnReflects.rowToObject(result.get(0), clazz); + return RowUtil.rowToObject(result.get(0), clazz); } else { throw new LinqException(MULTI_VAL_ERROR + result.size()); } diff --git a/src/main/java/xyz/erupt/linq/lambda/LambdaReflect.java b/src/main/java/xyz/erupt/linq/lambda/LambdaSee.java similarity index 83% rename from src/main/java/xyz/erupt/linq/lambda/LambdaReflect.java rename to src/main/java/xyz/erupt/linq/lambda/LambdaSee.java index 00600eb..611b62c 100644 --- a/src/main/java/xyz/erupt/linq/lambda/LambdaReflect.java +++ b/src/main/java/xyz/erupt/linq/lambda/LambdaSee.java @@ -9,7 +9,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -public class LambdaReflect { +public class LambdaSee { private static final String GET = "get", IS = "is", WRITE_REPLACE = "writeReplace"; @@ -21,19 +21,25 @@ public static String field(SFunction func) { return info(func).getField(); } + public static String method(SFunction func) { + return info(func).getMethod(); + } + public static LambdaInfo info(SFunction func) { try { if (S_FUNCTION_CACHE.containsKey(func)) { return S_FUNCTION_CACHE.get(func); - } else synchronized (LambdaReflect.class) { + } else synchronized (LambdaSee.class) { if (S_FUNCTION_CACHE.containsKey(func)) return S_FUNCTION_CACHE.get(func); } - if (!func.getClass().isSynthetic()) throw new LinqException("Synthetic classes produced by non-lambda expressions"); + if (!func.getClass().isSynthetic()) + throw new LinqException("Synthetic classes produced by non-lambda expressions"); Method method = func.getClass().getDeclaredMethod(WRITE_REPLACE); method.setAccessible(true); SerializedLambda serializedLambda = (SerializedLambda) method.invoke(func); Matcher matcher = CLASS_TYPE_PATTERN.matcher(serializedLambda.getInstantiatedMethodType()); - if (!matcher.find() || matcher.groupCount() != 1) throw new RuntimeException("Failed to get Lambda information"); + if (!matcher.find() || matcher.groupCount() != 1) + throw new RuntimeException("Failed to get Lambda information"); Class clazz = Class.forName(matcher.group(1).replace("/", ".")); LambdaInfo lambdaInfo = getserializedLambdaInfo(serializedLambda, clazz); S_FUNCTION_CACHE.put(func, lambdaInfo); diff --git a/src/main/java/xyz/erupt/linq/schema/Column.java b/src/main/java/xyz/erupt/linq/schema/Column.java index 2b4b549..ecebb1d 100644 --- a/src/main/java/xyz/erupt/linq/schema/Column.java +++ b/src/main/java/xyz/erupt/linq/schema/Column.java @@ -93,7 +93,7 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Column column = (Column) o; - return Objects.equals(table.getSimpleName(), column.table.getSimpleName()) && Objects.equals(field, column.field) && Objects.equals(alias, column.alias); + return Objects.equals(table.getName(), column.table.getName()) && Objects.equals(field, column.field) && Objects.equals(alias, column.alias); } @Override @@ -103,7 +103,7 @@ public int hashCode() { @Override public String toString() { - return table.getSimpleName() + "." + field + "(" + alias + ")"; + return table.getName() + "." + field + "(" + alias + ")"; } diff --git a/src/main/java/xyz/erupt/linq/schema/Dql.java b/src/main/java/xyz/erupt/linq/schema/Dql.java index cf3aee0..3108a7b 100644 --- a/src/main/java/xyz/erupt/linq/schema/Dql.java +++ b/src/main/java/xyz/erupt/linq/schema/Dql.java @@ -10,7 +10,7 @@ public class Dql { private Collection from; // columns definition - private List columns = new ArrayList<>(); + private final List columns = new ArrayList<>(); // json definition private final List> joinSchemas = new ArrayList<>(); @@ -53,10 +53,6 @@ public List getColumns() { return columns; } - public void setColumns(List columns) { - this.columns = columns; - } - public List> getWheres() { return wheres; } diff --git a/src/main/java/xyz/erupt/linq/schema/JoinSchema.java b/src/main/java/xyz/erupt/linq/schema/JoinSchema.java index 85920fc..7b01130 100644 --- a/src/main/java/xyz/erupt/linq/schema/JoinSchema.java +++ b/src/main/java/xyz/erupt/linq/schema/JoinSchema.java @@ -2,7 +2,7 @@ import xyz.erupt.linq.consts.JoinExchange; import xyz.erupt.linq.consts.JoinMethod; -import xyz.erupt.linq.lambda.LambdaReflect; +import xyz.erupt.linq.lambda.LambdaSee; import xyz.erupt.linq.lambda.SFunction; import java.util.Collection; @@ -31,7 +31,7 @@ public JoinSchema(JoinMethod joinMethod, Collection target, SFunction l this.target = target; this.lon = lon; this.ron = ron; - this.clazz = (Class) LambdaReflect.info(lon).getClazz(); + this.clazz = (Class) LambdaSee.info(lon).getClazz(); this.joinExchange = JoinExchange.HASH; } @@ -59,27 +59,12 @@ public Class getClazz() { return clazz; } - public BiFunction getOn() { - return on; - } - - public void setOn(BiFunction on) { - this.on = on; - } - public SFunction getLon() { return lon; } - public void setLon(SFunction lon) { - this.lon = lon; - } - public SFunction getRon() { return ron; } - public void setRon(SFunction ron) { - this.ron = ron; - } } diff --git a/src/main/java/xyz/erupt/linq/schema/Row.java b/src/main/java/xyz/erupt/linq/schema/Row.java index 932a81e..37c5dbb 100644 --- a/src/main/java/xyz/erupt/linq/schema/Row.java +++ b/src/main/java/xyz/erupt/linq/schema/Row.java @@ -2,9 +2,9 @@ import xyz.erupt.linq.exception.LinqException; import xyz.erupt.linq.lambda.LambdaInfo; -import xyz.erupt.linq.lambda.LambdaReflect; +import xyz.erupt.linq.lambda.LambdaSee; import xyz.erupt.linq.lambda.SFunction; -import xyz.erupt.linq.util.ColumnReflects; +import xyz.erupt.linq.util.RowUtil; import java.math.BigDecimal; import java.util.HashMap; @@ -42,11 +42,11 @@ public Object get(String alias) { } public R get(SFunction alias) { - LambdaInfo lambdaInfo = LambdaReflect.info(alias); + LambdaInfo lambdaInfo = LambdaSee.info(alias); Object val = this.get(lambdaInfo.getField()); try { if (val instanceof BigDecimal) { - return (R) ColumnReflects.bigDecimalConvert((BigDecimal) val, lambdaInfo.getClazz().getDeclaredField(lambdaInfo.getField()).getType()); + return (R) RowUtil.bigDecimalConvert((BigDecimal) val, lambdaInfo.getClazz().getDeclaredField(lambdaInfo.getField()).getType()); } else { return (R) val; } diff --git a/src/main/java/xyz/erupt/linq/util/Columns.java b/src/main/java/xyz/erupt/linq/util/Columns.java index 2f727f9..47959ad 100644 --- a/src/main/java/xyz/erupt/linq/util/Columns.java +++ b/src/main/java/xyz/erupt/linq/util/Columns.java @@ -2,7 +2,7 @@ import xyz.erupt.linq.consts.CompareSymbol; import xyz.erupt.linq.lambda.LambdaInfo; -import xyz.erupt.linq.lambda.LambdaReflect; +import xyz.erupt.linq.lambda.LambdaSee; import xyz.erupt.linq.lambda.SFunction; import xyz.erupt.linq.schema.Column; import xyz.erupt.linq.schema.Row; @@ -16,12 +16,12 @@ public class Columns { private static Column fromLambda(SFunction fun) { - LambdaInfo lambdaInfo = LambdaReflect.info(fun); + LambdaInfo lambdaInfo = LambdaSee.info(fun); return fromLambda(fun, lambdaInfo.getField()); } private static Column fromLambda(SFunction fun, String alias) { - LambdaInfo lambdaInfo = LambdaReflect.info(fun); + LambdaInfo lambdaInfo = LambdaSee.info(fun); Column column = new Column(); column.setTable(lambdaInfo.getClazz()); column.setField(lambdaInfo.getField()); @@ -50,11 +50,11 @@ public static Column ofx(SFunction fun, Function convert } public static Column ofx(SFunction fun, Function convert, SFunction alias) { - return ofx(fun, convert, LambdaReflect.field(alias)); + return ofx(fun, convert, LambdaSee.field(alias)); } public static Column ofx(SFunction fun, Function convert) { - return ofx(fun, convert, LambdaReflect.field(fun)); + return ofx(fun, convert, LambdaSee.field(fun)); } @@ -67,7 +67,7 @@ public static Column of(SFunction fun, String alias) { } public static Column of(SFunction fun, SFunction alias) { - return of(fun, LambdaReflect.field(alias)); + return of(fun, LambdaSee.field(alias)); } public static Column ofs(Function fun, String alias) { @@ -80,7 +80,7 @@ public static Column ofs(Function fun, String alias) { } public static Column ofs(Function fun, SFunction alias) { - return ofs(fun, LambdaReflect.field(alias)); + return ofs(fun, LambdaSee.field(alias)); } public static Column count(String alias) { @@ -90,7 +90,7 @@ public static Column count(String alias) { } public static Column count(SFunction alias) { - return count(LambdaReflect.field(alias)); + return count(LambdaSee.field(alias)); } public static Column count(SFunction fun, String alias) { @@ -104,7 +104,7 @@ public static Column count(SFunction fun, String alias) { } public static Column count(SFunction fun, SFunction alias) { - return count(fun, LambdaReflect.field(alias)); + return count(fun, LambdaSee.field(alias)); } public static Column countDistinct(SFunction fun, String alias) { @@ -118,7 +118,7 @@ public static Column countDistinct(SFunction fun, String alias) { } public static Column countDistinct(SFunction fun, SFunction alias) { - return countDistinct(fun, LambdaReflect.field(alias)); + return countDistinct(fun, LambdaSee.field(alias)); } public static Column max(SFunction fun, String alias) { @@ -130,7 +130,7 @@ public static Column max(SFunction fun, String alias) { if (CompareUtil.compare(val, result, CompareSymbol.GT)) result = val; } if (result instanceof Number) { - return ColumnReflects.numberToBigDecimal((Number) result); + return RowUtil.numberToBigDecimal((Number) result); } else { return result; } @@ -139,7 +139,7 @@ public static Column max(SFunction fun, String alias) { public static Column max(SFunction fun, SFunction alias) { - return max(fun, LambdaReflect.field(alias)); + return max(fun, LambdaSee.field(alias)); } public static Column min(SFunction fun, String alias) { @@ -151,7 +151,7 @@ public static Column min(SFunction fun, String alias) { if (CompareUtil.compare(val, result, CompareSymbol.LT)) result = val; } if (result instanceof Number) { - return ColumnReflects.numberToBigDecimal((Number) result); + return RowUtil.numberToBigDecimal((Number) result); } else { return result; } @@ -159,7 +159,7 @@ public static Column min(SFunction fun, String alias) { } public static Column min(SFunction fun, SFunction alias) { - return min(fun, LambdaReflect.field(alias)); + return min(fun, LambdaSee.field(alias)); } public static Column avg(SFunction fun, String alias) { @@ -178,7 +178,7 @@ public static Column avg(SFunction fun, String alias) { } public static Column avg(SFunction fun, SFunction alias) { - return avg(fun, LambdaReflect.field(alias)); + return avg(fun, LambdaSee.field(alias)); } public static Column sum(SFunction fun, String alias) { @@ -195,7 +195,7 @@ public static Column sum(SFunction fun, String alias) { } public static Column sum(SFunction fun, SFunction alias) { - return sum(fun, LambdaReflect.field(alias)); + return sum(fun, LambdaSee.field(alias)); } public static Column groupArray(SFunction fun, String alias) { @@ -209,7 +209,7 @@ public static Column groupArray(SFunction fun, String alias) { } public static Column groupArray(SFunction fun, SFunction alias) { - return groupArray(fun, LambdaReflect.field(alias)); + return groupArray(fun, LambdaSee.field(alias)); } // custom group by logic diff --git a/src/main/java/xyz/erupt/linq/util/ColumnReflects.java b/src/main/java/xyz/erupt/linq/util/RowUtil.java similarity index 97% rename from src/main/java/xyz/erupt/linq/util/ColumnReflects.java rename to src/main/java/xyz/erupt/linq/util/RowUtil.java index 8534eb6..0e4fc38 100644 --- a/src/main/java/xyz/erupt/linq/util/ColumnReflects.java +++ b/src/main/java/xyz/erupt/linq/util/RowUtil.java @@ -11,14 +11,14 @@ import java.util.*; import java.util.stream.Collectors; -public class ColumnReflects { +public class RowUtil { public static final Class[] SIMPLE_CLASS = { CharSequence.class, Character.class, Number.class, Date.class, Temporal.class, Boolean.class, CharSequence[].class, Character[].class, Number[].class, Date[].class, Temporal[].class, Boolean[].class }; - public static List listToRow(Collection objects) { + public static List listObjectToRow(Collection objects) { List list = new ArrayList<>(objects.size()); objects.forEach(obj -> Optional.ofNullable(obj).ifPresent(it -> list.add(objectToRow(it)))); return list; diff --git a/src/main/java/xyz/erupt/linq/util/VirtualColumn.java b/src/main/java/xyz/erupt/linq/util/VirtualColumn.java index fe787f1..738ccc8 100644 --- a/src/main/java/xyz/erupt/linq/util/VirtualColumn.java +++ b/src/main/java/xyz/erupt/linq/util/VirtualColumn.java @@ -1,7 +1,7 @@ package xyz.erupt.linq.util; import xyz.erupt.linq.lambda.LambdaInfo; -import xyz.erupt.linq.lambda.LambdaReflect; +import xyz.erupt.linq.lambda.LambdaSee; public class VirtualColumn { @@ -12,7 +12,7 @@ public class VirtualColumn { private Boolean bool; public static LambdaInfo lambdaInfo() { - return LambdaReflect.info(VirtualColumn::getString); + return LambdaSee.info(VirtualColumn::getString); } public Integer getNumber() { diff --git a/src/test/java/xyz/erupt/linq/LambdaTest.java b/src/test/java/xyz/erupt/linq/LambdaTest.java index 9f1d44f..5604f44 100644 --- a/src/test/java/xyz/erupt/linq/LambdaTest.java +++ b/src/test/java/xyz/erupt/linq/LambdaTest.java @@ -2,7 +2,7 @@ import org.junit.Test; import xyz.erupt.linq.data.source.TestSource; -import xyz.erupt.linq.lambda.LambdaReflect; +import xyz.erupt.linq.lambda.LambdaSee; import xyz.erupt.linq.lambda.Th; import java.math.BigDecimal; @@ -11,21 +11,21 @@ public class LambdaTest { @Test public void testLambdaInfo() { - assert "id".equals(LambdaReflect.info(TestSource::getId).getField()); - assert "name".equals(LambdaReflect.info(TestSource::getName).getField()); - assert "getName".equals(LambdaReflect.info(TestSource::getName).getMethod()); - assert "is".equals(LambdaReflect.info(Th::is).getField()); - assert "is".equals(LambdaReflect.info(Th::is).getMethod()); - assert TestSource.class == LambdaReflect.info(TestSource::getName).getClazz(); + assert "id".equals(LambdaSee.info(TestSource::getId).getField()); + assert "name".equals(LambdaSee.info(TestSource::getName).getField()); + assert "getName".equals(LambdaSee.info(TestSource::getName).getMethod()); + assert "is".equals(LambdaSee.info(Th::is).getField()); + assert "is".equals(LambdaSee.info(Th::is).getMethod()); + assert TestSource.class == LambdaSee.info(TestSource::getName).getClazz(); } @Test public void lambdaCacheTest() { for (int i = 0; i < 1000000; i++) { - LambdaReflect.info(TestSource::getName); - LambdaReflect.info(TestSource::name); - LambdaReflect.info(TestSource::getId); - LambdaReflect.info(TestSource::getDate); + LambdaSee.info(TestSource::getName); + LambdaSee.info(TestSource::name); + LambdaSee.info(TestSource::getId); + LambdaSee.info(TestSource::getDate); } } diff --git a/src/test/java/xyz/erupt/linq/LinqTest.java b/src/test/java/xyz/erupt/linq/LinqTest.java index d500a25..33f8240 100644 --- a/src/test/java/xyz/erupt/linq/LinqTest.java +++ b/src/test/java/xyz/erupt/linq/LinqTest.java @@ -199,7 +199,8 @@ public void whereTest() { public void orConditionTest() { // name = 'Thanos' or id = 4 List> res = Linq.from(source) - .leftJoin(target, TestSourceExt::getId, TestSource::getId).select(Columns.all(TestSource.class)) + .leftJoin(target, TestSourceExt::getId, TestSource::getId) + .select(Columns.all(TestSource.class)) .where(data -> { String name = data.get(TestSource::getName); Integer id = data.get(TestSource::getId); @@ -234,6 +235,7 @@ public void groupBy() { public void orderBy() { List result = Linq.from(source) .select(Columns.all(TestSource.class)) + .selectExclude(TestSource::getTags, TestSource::getName) .orderBy(TestSource::getId, OrderByDirection.DESC) .orderBy(TestSource::getName) .write(TestSource.class); diff --git a/src/test/java/xyz/erupt/linq/PerformanceTest.java b/src/test/java/xyz/erupt/linq/PerformanceTest.java index d19db67..4226445 100644 --- a/src/test/java/xyz/erupt/linq/PerformanceTest.java +++ b/src/test/java/xyz/erupt/linq/PerformanceTest.java @@ -1,12 +1,52 @@ package xyz.erupt.linq; +import org.junit.Before; +import org.junit.Test; +import xyz.erupt.linq.data.TestTo; +import xyz.erupt.linq.lambda.Th; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + /** * Performance test + * * @author YuePeng * date 2024/4/3 22:57 */ public class PerformanceTest { + private final List testTos = new ArrayList<>(); + + private final List integers = new ArrayList<>(); + + @Before + public void before() { + for (int i = 0; i < 100000; i++) { + testTos.add(new TestTo(i, String.valueOf((char) i))); + } + } + + @Test + public void linqSelectTest() { + Linq.from(testTos).select(TestTo::getName).write(String.class); + } + + @Test + public void linqSelectTestVs() { + testTos.stream().map(TestTo::getName).collect(Collectors.toList()); + } + + @Test + public void linqSimpleSelectTest() { + Linq.from(integers.toArray()).select(Th::is).write(Integer.class); + } + + @Test + public void linqSimpleSelectTestVs() { + integers.stream().collect(Collectors.toList()); + } } diff --git a/src/test/java/xyz/erupt/linq/data/TestTo.java b/src/test/java/xyz/erupt/linq/data/TestTo.java new file mode 100644 index 0000000..2f8dba3 --- /dev/null +++ b/src/test/java/xyz/erupt/linq/data/TestTo.java @@ -0,0 +1,25 @@ +package xyz.erupt.linq.data; + +/** + * @author YuePeng + * date 2024/4/6 22:23 + */ +public class TestTo { + + private final Integer id; + + private final String name; + + public TestTo(Integer id, String name) { + this.id = id; + this.name = name; + } + + public Integer getId() { + return id; + } + + public String getName() { + return name; + } +}