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