Skip to content
This repository has been archived by the owner on Jun 29, 2021. It is now read-only.

Commit

Permalink
Moved JoinHelper into Metamodelhelper,
Browse files Browse the repository at this point in the history
removed guava
  • Loading branch information
tomatophantastico committed Jul 25, 2017
1 parent 88a1828 commit dda13e2
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 148 deletions.
4 changes: 0 additions & 4 deletions core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,6 @@ under the License.
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
Expand Down
133 changes: 0 additions & 133 deletions core/src/main/java/org/apache/metamodel/JoinHelper.java

This file was deleted.

82 changes: 71 additions & 11 deletions core/src/main/java/org/apache/metamodel/MetaModelHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@

import java.util.*;
import java.util.Map.Entry;
import java.util.stream.Collectors;

import com.google.common.collect.Lists;
import org.apache.metamodel.data.CachingDataSetHeader;
import org.apache.metamodel.data.DataSet;
import org.apache.metamodel.data.DataSetHeader;
Expand All @@ -39,7 +39,6 @@
import org.apache.metamodel.query.FilterItem;
import org.apache.metamodel.query.FromItem;
import org.apache.metamodel.query.GroupByItem;
import org.apache.metamodel.query.OperatorType;
import org.apache.metamodel.query.OrderByItem;
import org.apache.metamodel.query.Query;
import org.apache.metamodel.query.ScalarFunction;
Expand Down Expand Up @@ -170,9 +169,10 @@ public static Column[] getTableColumns(Table table, Column[] columns) {
public static DataSet getCarthesianProduct(DataSet... fromDataSets) {
return getCarthesianProduct(fromDataSets, new FilterItem[0]);
}




public static DataSet getCarthesianProduct(DataSet[] fromDataSets, FilterItem... filterItems) {
return getCarthesianProduct(fromDataSets, Arrays.asList(filterItems));
}

public static DataSet getCarthesianProduct(DataSet[] fromDataSets, Iterable<FilterItem> whereItems) {
assert(fromDataSets.length>0);
Expand All @@ -181,15 +181,15 @@ public static DataSet getCarthesianProduct(DataSet[] fromDataSets, Iterable<Filt
return getFiltered(fromDataSets[0], whereItems);
}
// do a nested loop join, no matter what
Iterator<DataSet> dsIter = Lists.newArrayList(fromDataSets).iterator();
Iterator<DataSet> dsIter = Arrays.asList(fromDataSets).iterator();

DataSet joined = dsIter.next();

while(dsIter.hasNext()){
joined = JoinHelper.nestedLoopJoin(
joined = nestedLoopJoin(
dsIter.next(),
joined,
Lists.newArrayList(whereItems));
(whereItems));

}

Expand All @@ -198,12 +198,72 @@ public static DataSet getCarthesianProduct(DataSet[] fromDataSets, Iterable<Filt

}


/**
* Executes a simple nested loop join. The innerLoopDs will be copied in an in-memory dataset.
*
*/
public static InMemoryDataSet nestedLoopJoin(DataSet innerLoopDs, DataSet outerLoopDs, Iterable<FilterItem> filtersIterable){

public static DataSet getCarthesianProduct(DataSet[] fromDataSets, FilterItem... filterItems) {
return getCarthesianProduct(fromDataSets, Arrays.asList(filterItems));
List<FilterItem> filters = new ArrayList<>();
for(FilterItem fi : filtersIterable){
filters.add(fi);
}
List<Row> innerRows = innerLoopDs.toRows();


List<SelectItem> allItems = new ArrayList<>(Arrays.asList(outerLoopDs.getSelectItems())) ;
allItems.addAll(Arrays.asList(innerLoopDs.getSelectItems()));

Set<FilterItem> applicableFilters = applicableFilters(filters,allItems);

DataSetHeader jointHeader = new CachingDataSetHeader(allItems);

List<Row> resultRows = new ArrayList<>();
for(Row outerRow: outerLoopDs){
for(Row innerRow: innerRows){

Object[] joinedRowObjects = new Object[outerRow.getValues().length + innerRow.getValues().length];

System.arraycopy(outerRow.getValues(),0,joinedRowObjects,0,outerRow.getValues().length);
System.arraycopy(innerRow.getValues(),0,joinedRowObjects,outerRow.getValues().length,innerRow.getValues().length);

Row joinedRow = new DefaultRow(jointHeader,joinedRowObjects);


if(applicableFilters.isEmpty()|| applicableFilters.stream().allMatch(fi -> fi.accept(joinedRow))){
resultRows.add(joinedRow);
}
}
}

return new InMemoryDataSet(jointHeader,resultRows);
}

/**
* Filters the FilterItems such that only the FilterItems are returned,
* which contain SelectItems that are contained in selectItemList
* @param filters
* @param selectItemList
* @return
*/
private static Set<FilterItem> applicableFilters(Collection<FilterItem> filters, Collection<SelectItem> selectItemList) {

Set<SelectItem> items = new HashSet<SelectItem>(selectItemList);

return filters.stream().filter( fi -> {
Collection<SelectItem> fiSelectItems = new ArrayList<>();
fiSelectItems.add(fi.getSelectItem());
Object operand = fi.getOperand();
if(operand instanceof SelectItem){
fiSelectItems.add((SelectItem) operand);
}

return items.containsAll(fiSelectItems);

}).collect(Collectors.toSet());
}


public static DataSet getFiltered(DataSet dataSet, Iterable<FilterItem> filterItems) {
List<IRowFilter> filters = CollectionUtils.map(filterItems, filterItem -> {
return filterItem;
Expand Down

0 comments on commit dda13e2

Please sign in to comment.