![JAR search and dependency download from the Maven repository](/logo.png)
com.tsc9526.monalisa.tools.datatable.DataTableJoin Maven / Gradle / Ivy
/*******************************************************************************************
* Copyright (c) 2016, zzg.zhou([email protected])
*
* Monalisa is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*******************************************************************************************/
package com.tsc9526.monalisa.tools.datatable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
*
* @author zzg.zhou([email protected])
*/
class DataTableJoin {
private static String[] getJoinFields(DataTable> leftTable, DataTable> rightTable) {
Set cs=new LinkedHashSet();
for(DataColumn c:leftTable.getHeaders()){
cs.add(c.getName().toLowerCase());
}
List joinFieldNames=new ArrayList();
for(DataColumn c:rightTable.getHeaders()){
String name=c.getName().toLowerCase();
if(cs.contains(name)){
joinFieldNames.add(name);
}
}
return joinFieldNames.toArray(new String[joinFieldNames.size()]);
}
protected DataTable leftTable;
protected DataTable rightTable;
protected String[] leftJoinFields ;
protected String[] rightJoinFields;
protected DataMap leftKeyMapping =new DataMap();
protected DataMap rightKeyMapping=new DataMap();
protected Map xs = new HashMap();
protected DataTable allTable=new DataTable();
protected List allHeader=new ArrayList();
public DataTableJoin(DataTable> leftTable,DataTable> rightTable, String... joinFieldNames){
this.leftTable =leftTable.as(DataMap.class);
this.rightTable=rightTable.as(DataMap.class);
if(joinFieldNames.length==0){
this.leftJoinFields =getJoinFields(leftTable,rightTable);
this.rightJoinFields=leftJoinFields;
}else if(joinFieldNames.length==1){
this.leftJoinFields =joinFieldNames[0].split(",");
this.rightJoinFields=leftJoinFields;
}else{
this.leftJoinFields =joinFieldNames[0].split(",");
this.rightJoinFields=joinFieldNames[1].split(",");
}
setup();
}
protected void setup(){
setupHeaders(allHeader,this.leftTable,leftKeyMapping,xs);
setupHeaders(allHeader,this.rightTable,rightKeyMapping,xs);
}
protected DataTable doLeftJoin(){
DataTable allTable=new DataTable().setHeaders(allHeader);
Map> rightValues=toMapList(rightTable,rightJoinFields);
for(DataMap x:leftTable){
String key=getDataMapKey(x,leftJoinFields);
List rms=rightValues.get(key);
if(rms!=null){
for(DataMap r:rms){
DataMap m=new DataMap();
addDataMap(m,x,leftKeyMapping);
addDataMap(m,r,rightKeyMapping);
allTable.add(m);
}
}else{
DataMap m=new DataMap();
addDataMap(m,x,leftKeyMapping);
allTable.add(m);
}
}
return allTable;
}
protected DataTable doInnerJoin(){
DataTable allTable=new DataTable().setHeaders(allHeader);
Map> rightValues=toMapList(rightTable,rightJoinFields);
for(DataMap x:leftTable){
String key=getDataMapKey(x,leftJoinFields);
List rms=rightValues.get(key);
if(rms!=null){
for(DataMap r:rms){
DataMap m=new DataMap();
addDataMap(m,x,leftKeyMapping);
addDataMap(m,r,rightKeyMapping);
allTable.add(m);
}
}
}
return allTable;
}
protected DataTable doFullJoin(){
DataTable allTable=new DataTable().setHeaders(allHeader);
for(DataMap x:leftTable){
for(DataMap y:rightTable){
DataMap m=new DataMap();
addDataMap(m,x,leftKeyMapping);
addDataMap(m,y,rightKeyMapping);
allTable.add(m);
}
}
return allTable;
}
protected DataTable doRightJoin(){
DataTable allTable=new DataTable().setHeaders(allHeader);
Map> leftValues=toMapList(leftTable,leftJoinFields);
for(DataMap x:rightTable){
String key=getDataMapKey(x,rightJoinFields);
List rms=leftValues.get(key);
if(rms!=null){
for(DataMap r:rms){
DataMap m=new DataMap();
addDataMap(m,r,leftKeyMapping);
addDataMap(m,x,rightKeyMapping);
allTable.add(m);
}
}else{
DataMap m=new DataMap();
addDataMap(m,x,rightKeyMapping);
allTable.add(m);
}
}
return allTable;
}
protected void setupHeaders(List allHeader,DataTable table,DataMap keyMapping,Map xs){
for(DataColumn c:table.getHeaders()){
String name=c.getName();
String lowername=name.toLowerCase();
Integer n = xs.get(lowername);
if (n != null) {
name = name + n;
xs.put(lowername, n + 1);
} else {
xs.put(lowername, 1);
}
keyMapping.put(c.getName(),name);
allHeader.add(new DataColumn(name));
}
}
protected void addDataMap(DataMap target,DataMap data,DataMap keyMapping){
for(String key:data.keySet()){
Object value=data.get(key);
String targetKey=(String)keyMapping.get(key);
target.put(targetKey, value);
}
}
protected Map> toMapList(DataTable table, String[] keyFields){
Map> rs=new LinkedHashMap>();
for(DataMap x:table){
String key=getDataMapKey(x,keyFields);
List list=rs.get(key);
if(list==null){
list=new ArrayList();
rs.put(key, list);
}
list.add(x);
}
return rs;
}
protected String getDataMapKey(DataMap x,String[] keyFields){
if(keyFields.length==0){
return "#"+x.toString().toLowerCase();
}else{
String key="@";
for(String n:keyFields){
if(key.length()>1){
key+="&";
}
key+=key+"="+x.getString(n);
}
return key.toLowerCase();
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy