mirror of
https://github.com/Kingsrook/qqq.git
synced 2025-07-18 13:10:44 +00:00
Checkpoint - good version of getJoinConnections now i think
This commit is contained in:
@ -23,10 +23,12 @@ package com.kingsrook.qqq.backend.core.actions.metadata;
|
|||||||
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.TreeSet;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
|
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.joins.QJoinMetaData;
|
import com.kingsrook.qqq.backend.core.model.metadata.joins.QJoinMetaData;
|
||||||
|
|
||||||
@ -184,6 +186,267 @@ public class JoinGraph
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public record JoinConnection(String joinTable, String viaJoinName) implements Comparable<JoinConnection>
|
||||||
|
{
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
@Override
|
||||||
|
public int compareTo(JoinConnection that)
|
||||||
|
{
|
||||||
|
Comparator<JoinConnection> comparator = Comparator.comparing((JoinConnection jc) -> jc.joinTable())
|
||||||
|
.thenComparing((JoinConnection jc) -> jc.viaJoinName());
|
||||||
|
return (comparator.compare(this, that));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
public record JoinConnectionList(List<JoinConnection> list) implements Comparable<JoinConnectionList>
|
||||||
|
{
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
public JoinConnectionList copy()
|
||||||
|
{
|
||||||
|
return new JoinConnectionList(new ArrayList<>(list));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
public int compareTo(JoinConnectionList that)
|
||||||
|
{
|
||||||
|
if(this.equals(that))
|
||||||
|
{
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < Math.min(this.list.size(), that.list.size()); i++)
|
||||||
|
{
|
||||||
|
int comp = this.list.get(i).compareTo(that.list.get(i));
|
||||||
|
if(comp != 0)
|
||||||
|
{
|
||||||
|
return (comp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (this.list.size() - that.list.size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
public Set<JoinConnectionList> getJoinConnections(String tableName)
|
||||||
|
{
|
||||||
|
Set<JoinConnectionList> rs = new TreeSet<>();
|
||||||
|
doGetJoinConnections(rs, tableName, new ArrayList<>(), new JoinConnectionList(new ArrayList<>()));
|
||||||
|
return (rs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
private void doGetJoinConnections(Set<JoinConnectionList> joinConnections, String tableName, List<String> path, JoinConnectionList connectionList)
|
||||||
|
{
|
||||||
|
for(Edge edge : edges)
|
||||||
|
{
|
||||||
|
if(edge.leftTable.equals(tableName) || edge.rightTable.equals(tableName))
|
||||||
|
{
|
||||||
|
if(path.contains(edge.joinName))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> newPath = new ArrayList<>(path);
|
||||||
|
newPath.add(edge.joinName);
|
||||||
|
if(!joinConnectionsContain(joinConnections, newPath))
|
||||||
|
{
|
||||||
|
String otherTableName = null;
|
||||||
|
if(!edge.leftTable.equals(tableName))
|
||||||
|
{
|
||||||
|
otherTableName = edge.leftTable;
|
||||||
|
}
|
||||||
|
else if(!edge.rightTable.equals(tableName))
|
||||||
|
{
|
||||||
|
otherTableName = edge.rightTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(otherTableName != null)
|
||||||
|
{
|
||||||
|
|
||||||
|
JoinConnectionList newConnectionList = connectionList.copy();
|
||||||
|
JoinConnection joinConnection = new JoinConnection(otherTableName, edge.joinName);
|
||||||
|
newConnectionList.list.add(joinConnection);
|
||||||
|
joinConnections.add(newConnectionList);
|
||||||
|
doGetJoinConnections(joinConnections, otherTableName, new ArrayList<>(newPath), newConnectionList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
private boolean joinConnectionsContain(Set<JoinConnectionList> joinPaths, List<String> newPath)
|
||||||
|
{
|
||||||
|
for(JoinConnectionList joinConnections : joinPaths)
|
||||||
|
{
|
||||||
|
List<String> joinConnectionJoins = joinConnections.list.stream().map(jc -> jc.viaJoinName).toList();
|
||||||
|
if(joinConnectionJoins.equals(newPath))
|
||||||
|
{
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public record JoinPath(String joinTable, List<String> joinNames)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
public Set<JoinPath> getJoinPaths(String tableName)
|
||||||
|
{
|
||||||
|
Set<JoinPath> rs = new HashSet<>();
|
||||||
|
doGetJoinPaths(rs, tableName, new ArrayList<>());
|
||||||
|
return (rs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
private void doGetJoinPaths(Set<JoinPath> joinPaths, String tableName, List<String> path)
|
||||||
|
{
|
||||||
|
for(Edge edge : edges)
|
||||||
|
{
|
||||||
|
if(edge.leftTable.equals(tableName) || edge.rightTable.equals(tableName))
|
||||||
|
{
|
||||||
|
if(path.contains(edge.joinName))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> newPath = new ArrayList<>(path);
|
||||||
|
newPath.add(edge.joinName);
|
||||||
|
if(!joinPathsContain(joinPaths, newPath))
|
||||||
|
{
|
||||||
|
String otherTableName = null;
|
||||||
|
if(!edge.leftTable.equals(tableName))
|
||||||
|
{
|
||||||
|
otherTableName = edge.leftTable;
|
||||||
|
}
|
||||||
|
else if(!edge.rightTable.equals(tableName))
|
||||||
|
{
|
||||||
|
otherTableName = edge.rightTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(otherTableName != null)
|
||||||
|
{
|
||||||
|
joinPaths.add(new JoinPath(otherTableName, newPath));
|
||||||
|
doGetJoinPaths(joinPaths, otherTableName, new ArrayList<>(newPath));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
private boolean joinPathsContain(Set<JoinPath> joinPaths, List<String> newPath)
|
||||||
|
{
|
||||||
|
for(JoinPath joinPath : joinPaths)
|
||||||
|
{
|
||||||
|
if(joinPath.joinNames().equals(newPath))
|
||||||
|
{
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
/*
|
||||||
|
public Set<List<String>> getJoinPaths(String tableName)
|
||||||
|
{
|
||||||
|
Set<List<String>> rs = new HashSet<>();
|
||||||
|
doGetJoinPaths(rs, tableName, new ArrayList<>());
|
||||||
|
return (rs);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
/*
|
||||||
|
private void doGetJoinPaths(Set<List<String>> joinPaths, String tableName, List<String> path)
|
||||||
|
{
|
||||||
|
for(Edge edge : edges)
|
||||||
|
{
|
||||||
|
if(edge.leftTable.equals(tableName) || edge.rightTable.equals(tableName))
|
||||||
|
{
|
||||||
|
if(path.contains(edge.joinName))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> newPath = new ArrayList<>(path);
|
||||||
|
newPath.add(edge.joinName);
|
||||||
|
if(!joinPaths.contains(newPath))
|
||||||
|
{
|
||||||
|
joinPaths.add(newPath);
|
||||||
|
|
||||||
|
String otherTableName = null;
|
||||||
|
if(!edge.leftTable.equals(tableName))
|
||||||
|
{
|
||||||
|
otherTableName = edge.leftTable;
|
||||||
|
}
|
||||||
|
else if(!edge.rightTable.equals(tableName))
|
||||||
|
{
|
||||||
|
otherTableName = edge.rightTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(otherTableName != null)
|
||||||
|
{
|
||||||
|
doGetJoinPaths(joinPaths, otherTableName, new ArrayList<>(newPath));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
**
|
**
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
Reference in New Issue
Block a user