Initial commit

This commit is contained in:
casim
2025-10-31 23:21:03 +01:00
commit 332f12bca2
238 changed files with 128397 additions and 0 deletions

View File

@@ -0,0 +1,255 @@
package de.lcag.common;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.management.OperationsException;
import de.lcag.common.SelectStatement.Condition;
import de.lcag.common.SelectStatement.Join;
/**
* Supports in-memory tables. Those with a name can be registered to keep them
* in memory within livetime of the JVM. Only registered table can be used
* Table.select calls. You have to delete a registered table explicitly to
* cleanup its memory. Memeory allcoation of unregistered tables is done by
* theGarbage Collector.
*
* @author U401455
*
*/
public interface Table {
public interface TableColumn {
public void addValue(Object v);
public <V> V getValue(int i);
public void setValue(int rowNo, Object v);
public int length();
public int findRow(Object pValue);
public String getStyle();
public void setStyle(String string);
public String asCSV(String pSeparator);
public int shift();
public int getPosition();
public Table getTable();
public void init(TableColumn clientColumn);
public void init(Object pValue);
}
public static final String OPTION_ADD_SOURCE_COLUMN = "ADD_SOURCE_COLUMN";
public static final String OPTION_USE_MAPPING = "USE_MAPPING";
public static final String OPTION_NUMBER_ROWS = "NUMBER_ROWS";
public static final String OPTION_LIMIT_NUMBER_ROWS = "LIMIT_NUMBER_ROWS";
public static final String KEY_COLUMN = "_Key_";
public static final String ROW_NUMBER_COLUMN = "_RowNo_";
static Map<String, Table> tables = new HashMap<>();
TableColumn addColumn(String aName);
void addColumns(String... aNameList);
void addColumns(Collection<String> pNameList);
String getSeparator();
String getName();
boolean hasColumn(String pName);
/**
* Return a list of column names.
*
* @return
*/
Set<String> getColumnNames();
public int getColumnPositionByLabel(String pLabel);
public int getColumnPositionByName(String pName);
public String getColumnNameByPosition(int pPos);
public TableColumn getColumnByName(String colName);
public TableColumn getColumnByLabel(String pFormattedColName);
public int getNoColumns();
/**
* Return a list of column labels (User-defined).
*
* @return
*/
Collection<String> getColumnLabels();
void setCellValue(int row, String colName, Object v);
void setCellValues(int pMyRow, Table pSrcTable, Integer pSrcRow);
<V> V getCellValue(int row, String colName);
public String getKeyValue(int pRow);
/*
* Calculate and return a unique key for the table
*/
public String setUniqueKeyValue(int pRow);
/*
* Calculate and return a key for the table. The key can be non-unique
*/
public String setKeyValue(int pRow);
public Integer getRowByKey(String pKey);
/**
* Find the first row number where the given column equals the value.
*
* @param colName - Name of column to search
* @param v - Value to search for
* @return -1 if not found else row number of first match in that column
*/
int findRow(String colName, Object v);
public void integrateDiff(TableComparisonResult pDiff) throws IOException;
/**
* Create a new table as the result of a full table join between this table and
* the one passed.
*
* @param pTable - table to join with
* @param pFieldMap - Join condition: The Map defines the mapping of ALL column
* names in pTable to those of this table that must match to
* join rows.
* @return - new table with all rows and columns that matched
*/
Table joinTable(Table pTable, Map<String, String> pFieldMap);
/**
* Create a new table as the result of a full table join between this table and
* the one passed.
*
* @param ptargetTable - empty table store result (will be cleared before)
* @param pTableToJoin - table to join with
* @param pFieldMap - Join condition: The Map defines the mapping of ALL
* column names in pTable to those of this table that must
* match to join rows.
*/
void joinTable(Table pTargetTable, Table pTableToJoin, Map<String, String> pFieldMap);
/**
* Create a CSV list of all string values in the given column.
*
* @param pColName - label or name of column to aggregate
* @param pSeparator - separator to use
* @return
*/
String asCSV(String pColName, String pSeparator);
void init();
int newRow();
String asHTML();
int lenght();
String asCsvData();
/**
* Print CSV as String with the upper cased column names. If you want the lables
* instead, then use toSring()
*
* @return
*/
String asCSV();
public Path getFilePath();
public static Table get(String pTableName) {
return tables.get(pTableName.toUpperCase());
}
public static void register(String pTableName, Table pTable) throws OperationsException {
if (pTableName == null || pTable == null)
return;
if (Table.get(pTableName) == null) {
tables.put(pTableName.toUpperCase(), pTable);
} else {
throw new OperationsException(String.format("Cannot register Table '%s' (already registered)", pTableName));
}
}
public static Table delete(String pTableName) {
return tables.remove(pTableName.toUpperCase());
}
public static void deleteAll() {
for (String s : tables.keySet())
tables.remove(s);
}
public static Table selectFromTable(AbstractTable pSrcTable, String pSelectStatement) {
HashTable result = new HashTable();
SelectStatement stmt = new SelectStatement(pSelectStatement);
String wantedTableName = stmt.getFromTable();
List<Condition> whereClause = stmt.getWhereClause();
List<Join> joinOn = stmt.getJoinOn();
String srcTableName = pSrcTable.getName();
Map<String, String> columns = stmt.getColumns();
if (whereClause != null && !whereClause.isEmpty()) {
throw new UnsupportedOperationException(
String.format("WHERE clause not yet supported in %s", pSelectStatement));
}
if (joinOn != null && !joinOn.isEmpty()) {
throw new UnsupportedOperationException(
String.format("JOIN operation not yet supported in %s", pSelectStatement));
}
if (srcTableName != null && !srcTableName.toUpperCase().equals(wantedTableName.toUpperCase())) {
return null;
}
for (String colName : columns.keySet()) {
String srcColName = columns.get(colName);
final AbstractTable.TableColumn newColumn = pSrcTable.cloneColumn(srcColName);
result.addColumn(colName, newColumn);
}
return result;
}
public static Table select(String pSelectStatement) {
SelectStatement stmt = new SelectStatement(pSelectStatement);
String srcTableName = stmt.getFromTable();
HashTable srcTable = (HashTable) Table.get(srcTableName);
AbstractTable result = (AbstractTable) Table.selectFromTable(srcTable, pSelectStatement);
return result;
}
int getFirstRowNo();
}