QQQ-14 updates to meta-data and other refactoring in qqq-backend-core

This commit is contained in:
2022-06-20 08:36:58 -05:00
parent 1ce6027dc8
commit 83c6e8eb3f
18 changed files with 535 additions and 126 deletions

View File

@ -46,6 +46,7 @@
--> -->
<module name="TreeWalker"> <module name="TreeWalker">
<module name="SuppressWarningsHolder"/>
<module name="OuterTypeFilename"/> <module name="OuterTypeFilename"/>
<module name="IllegalTokenText"> <module name="IllegalTokenText">
<property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/> <property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
@ -171,7 +172,7 @@
<property name="caseIndent" value="3"/> <property name="caseIndent" value="3"/>
<property name="throwsIndent" value="6"/> <property name="throwsIndent" value="6"/>
<property name="lineWrappingIndentation" value="3"/> <property name="lineWrappingIndentation" value="3"/>
<property name="arrayInitIndent" value="2"/> <property name="arrayInitIndent" value="6"/>
</module> </module>
<!-- <!--
<module name="AbbreviationAsWordInName"> <module name="AbbreviationAsWordInName">
@ -260,4 +261,5 @@
<module name="MissingOverride"/> <module name="MissingOverride"/>
</module> </module>
<module name="SuppressWarningsFilter"/>
</module> </module>

View File

@ -89,6 +89,12 @@
<version>5.8.1</version> <version>5.8.1</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.23.1</version>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -22,6 +22,8 @@
package com.kingsrook.qqq.backend.module.rdbms; package com.kingsrook.qqq.backend.module.rdbms;
import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.QTableBackendDetails;
import com.kingsrook.qqq.backend.core.modules.interfaces.DeleteInterface; import com.kingsrook.qqq.backend.core.modules.interfaces.DeleteInterface;
import com.kingsrook.qqq.backend.core.modules.interfaces.InsertInterface; import com.kingsrook.qqq.backend.core.modules.interfaces.InsertInterface;
import com.kingsrook.qqq.backend.core.modules.interfaces.QBackendModuleInterface; import com.kingsrook.qqq.backend.core.modules.interfaces.QBackendModuleInterface;
@ -31,6 +33,8 @@ import com.kingsrook.qqq.backend.module.rdbms.actions.RDBMSDeleteAction;
import com.kingsrook.qqq.backend.module.rdbms.actions.RDBMSInsertAction; import com.kingsrook.qqq.backend.module.rdbms.actions.RDBMSInsertAction;
import com.kingsrook.qqq.backend.module.rdbms.actions.RDBMSQueryAction; import com.kingsrook.qqq.backend.module.rdbms.actions.RDBMSQueryAction;
import com.kingsrook.qqq.backend.module.rdbms.actions.RDBMSUpdateAction; import com.kingsrook.qqq.backend.module.rdbms.actions.RDBMSUpdateAction;
import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSBackendMetaData;
import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSTableBackendDetails;
/******************************************************************************* /*******************************************************************************
@ -38,6 +42,38 @@ import com.kingsrook.qqq.backend.module.rdbms.actions.RDBMSUpdateAction;
*******************************************************************************/ *******************************************************************************/
public class RDBMSBackendModule implements QBackendModuleInterface public class RDBMSBackendModule implements QBackendModuleInterface
{ {
/*******************************************************************************
** Method where a backend module must be able to provide its type (name).
*******************************************************************************/
public String getBackendType()
{
return ("rdbms");
}
/*******************************************************************************
** Method to identify the class used for backend meta data for this module.
*******************************************************************************/
@Override
public Class<? extends QBackendMetaData> getBackendMetaDataClass()
{
return (RDBMSBackendMetaData.class);
}
/*******************************************************************************
** Method to identify the class used for table-backend details for this module.
*******************************************************************************/
@Override
public Class<? extends QTableBackendDetails> getTableBackendDetailsClass()
{
return RDBMSTableBackendDetails.class;
}
/******************************************************************************* /*******************************************************************************
** **
*******************************************************************************/ *******************************************************************************/
@ -59,6 +95,7 @@ public class RDBMSBackendModule implements QBackendModuleInterface
} }
/******************************************************************************* /*******************************************************************************
** **
*******************************************************************************/ *******************************************************************************/
@ -78,4 +115,5 @@ public class RDBMSBackendModule implements QBackendModuleInterface
{ {
return (new RDBMSDeleteAction()); return (new RDBMSDeleteAction());
} }
} }

View File

@ -23,6 +23,9 @@ package com.kingsrook.qqq.backend.module.rdbms.actions;
import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData;
import com.kingsrook.qqq.backend.core.utils.StringUtils;
import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSTableBackendDetails;
/******************************************************************************* /*******************************************************************************
@ -31,6 +34,23 @@ import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData;
public abstract class AbstractRDBMSAction public abstract class AbstractRDBMSAction
{ {
/*******************************************************************************
**
*******************************************************************************/
protected String getTableName(QTableMetaData table)
{
if(table.getBackendDetails() instanceof RDBMSTableBackendDetails details)
{
if(StringUtils.hasContent(details.getTableName()))
{
return (details.getTableName());
}
}
return (table.getName());
}
/******************************************************************************* /*******************************************************************************
** **
*******************************************************************************/ *******************************************************************************/

View File

@ -34,7 +34,7 @@ import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordWithStatus; import com.kingsrook.qqq.backend.core.model.data.QRecordWithStatus;
import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData;
import com.kingsrook.qqq.backend.core.modules.interfaces.DeleteInterface; import com.kingsrook.qqq.backend.core.modules.interfaces.DeleteInterface;
import com.kingsrook.qqq.backend.module.rdbms.RDBMSBackendMetaData; import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSBackendMetaData;
import com.kingsrook.qqq.backend.module.rdbms.jdbc.ConnectionManager; import com.kingsrook.qqq.backend.module.rdbms.jdbc.ConnectionManager;
import com.kingsrook.qqq.backend.module.rdbms.jdbc.QueryManager; import com.kingsrook.qqq.backend.module.rdbms.jdbc.QueryManager;
@ -55,7 +55,7 @@ public class RDBMSDeleteAction extends AbstractRDBMSAction implements DeleteInte
DeleteResult rs = new DeleteResult(); DeleteResult rs = new DeleteResult();
QTableMetaData table = deleteRequest.getTable(); QTableMetaData table = deleteRequest.getTable();
String tableName = table.getName(); String tableName = getTableName(table);
String primaryKeyName = getColumnName(table.getField(table.getPrimaryKeyField())); String primaryKeyName = getColumnName(table.getField(table.getPrimaryKeyField()));
String sql = "DELETE FROM " String sql = "DELETE FROM "
+ tableName + tableName
@ -69,7 +69,7 @@ public class RDBMSDeleteAction extends AbstractRDBMSAction implements DeleteInte
// todo sql customization - can edit sql and/or param list // todo sql customization - can edit sql and/or param list
ConnectionManager connectionManager = new ConnectionManager(); ConnectionManager connectionManager = new ConnectionManager();
Connection connection = connectionManager.getConnection(new RDBMSBackendMetaData(deleteRequest.getBackend())); Connection connection = connectionManager.getConnection((RDBMSBackendMetaData)deleteRequest.getBackend());
QueryManager.executeUpdateForRowCount(connection, sql, params); QueryManager.executeUpdateForRowCount(connection, sql, params);
List<QRecordWithStatus> recordsWithStatus = new ArrayList<>(); List<QRecordWithStatus> recordsWithStatus = new ArrayList<>();

View File

@ -34,7 +34,7 @@ import com.kingsrook.qqq.backend.core.model.data.QRecordWithStatus;
import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData;
import com.kingsrook.qqq.backend.core.modules.interfaces.InsertInterface; import com.kingsrook.qqq.backend.core.modules.interfaces.InsertInterface;
import com.kingsrook.qqq.backend.module.rdbms.RDBMSBackendMetaData; import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSBackendMetaData;
import com.kingsrook.qqq.backend.module.rdbms.jdbc.ConnectionManager; import com.kingsrook.qqq.backend.module.rdbms.jdbc.ConnectionManager;
import com.kingsrook.qqq.backend.module.rdbms.jdbc.QueryManager; import com.kingsrook.qqq.backend.module.rdbms.jdbc.QueryManager;
@ -66,7 +66,7 @@ public class RDBMSInsertAction extends AbstractRDBMSAction implements InsertInte
.map(x -> "?") .map(x -> "?")
.collect(Collectors.joining(", ")); .collect(Collectors.joining(", "));
String tableName = table.getName(); String tableName = getTableName(table);
StringBuilder sql = new StringBuilder("INSERT INTO ").append(tableName).append("(").append(columns).append(") VALUES"); StringBuilder sql = new StringBuilder("INSERT INTO ").append(tableName).append("(").append(columns).append(") VALUES");
List<Object> params = new ArrayList<>(); List<Object> params = new ArrayList<>();
@ -87,7 +87,7 @@ public class RDBMSInsertAction extends AbstractRDBMSAction implements InsertInte
// todo sql customization - can edit sql and/or param list // todo sql customization - can edit sql and/or param list
ConnectionManager connectionManager = new ConnectionManager(); ConnectionManager connectionManager = new ConnectionManager();
Connection connection = connectionManager.getConnection(new RDBMSBackendMetaData(insertRequest.getBackend())); Connection connection = connectionManager.getConnection((RDBMSBackendMetaData) insertRequest.getBackend());
// QueryResult rs = new QueryResult(); // QueryResult rs = new QueryResult();
// List<QRecord> records = new ArrayList<>(); // List<QRecord> records = new ArrayList<>();

View File

@ -44,7 +44,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.QFieldType;
import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData;
import com.kingsrook.qqq.backend.core.modules.interfaces.QueryInterface; import com.kingsrook.qqq.backend.core.modules.interfaces.QueryInterface;
import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.core.utils.CollectionUtils;
import com.kingsrook.qqq.backend.module.rdbms.RDBMSBackendMetaData; import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSBackendMetaData;
import com.kingsrook.qqq.backend.module.rdbms.jdbc.ConnectionManager; import com.kingsrook.qqq.backend.module.rdbms.jdbc.ConnectionManager;
import com.kingsrook.qqq.backend.module.rdbms.jdbc.QueryManager; import com.kingsrook.qqq.backend.module.rdbms.jdbc.QueryManager;
@ -63,7 +63,7 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf
try try
{ {
QTableMetaData table = queryRequest.getTable(); QTableMetaData table = queryRequest.getTable();
String tableName = table.getName(); String tableName = getTableName(table);
List<QFieldMetaData> fieldList = new ArrayList<>(table.getFields().values()); List<QFieldMetaData> fieldList = new ArrayList<>(table.getFields().values());
String columns = fieldList.stream() String columns = fieldList.stream()
@ -98,7 +98,7 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf
// todo sql customization - can edit sql and/or param list // todo sql customization - can edit sql and/or param list
ConnectionManager connectionManager = new ConnectionManager(); ConnectionManager connectionManager = new ConnectionManager();
Connection connection = connectionManager.getConnection(new RDBMSBackendMetaData(queryRequest.getBackend())); Connection connection = connectionManager.getConnection((RDBMSBackendMetaData) queryRequest.getBackend());
QueryResult rs = new QueryResult(); QueryResult rs = new QueryResult();
List<QRecord> records = new ArrayList<>(); List<QRecord> records = new ArrayList<>();

View File

@ -34,7 +34,7 @@ import com.kingsrook.qqq.backend.core.model.data.QRecordWithStatus;
import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData;
import com.kingsrook.qqq.backend.core.modules.interfaces.UpdateInterface; import com.kingsrook.qqq.backend.core.modules.interfaces.UpdateInterface;
import com.kingsrook.qqq.backend.module.rdbms.RDBMSBackendMetaData; import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSBackendMetaData;
import com.kingsrook.qqq.backend.module.rdbms.jdbc.ConnectionManager; import com.kingsrook.qqq.backend.module.rdbms.jdbc.ConnectionManager;
import com.kingsrook.qqq.backend.module.rdbms.jdbc.QueryManager; import com.kingsrook.qqq.backend.module.rdbms.jdbc.QueryManager;
@ -72,7 +72,7 @@ public class RDBMSUpdateAction extends AbstractRDBMSAction implements UpdateInte
.map(f -> this.getColumnName(f) + " = ?") .map(f -> this.getColumnName(f) + " = ?")
.collect(Collectors.joining(", ")); .collect(Collectors.joining(", "));
String tableName = table.getName(); String tableName = getTableName(table);
StringBuilder sql = new StringBuilder("UPDATE ").append(tableName) StringBuilder sql = new StringBuilder("UPDATE ").append(tableName)
.append(" SET ").append(columns) .append(" SET ").append(columns)
.append(" WHERE ").append(getColumnName(table.getField(table.getPrimaryKeyField()))).append(" = ?"); .append(" WHERE ").append(getColumnName(table.getField(table.getPrimaryKeyField()))).append(" = ?");
@ -80,7 +80,7 @@ public class RDBMSUpdateAction extends AbstractRDBMSAction implements UpdateInte
// todo sql customization - can edit sql and/or param list // todo sql customization - can edit sql and/or param list
ConnectionManager connectionManager = new ConnectionManager(); ConnectionManager connectionManager = new ConnectionManager();
Connection connection = connectionManager.getConnection(new RDBMSBackendMetaData(updateRequest.getBackend())); Connection connection = connectionManager.getConnection((RDBMSBackendMetaData) updateRequest.getBackend());
QRecordWithStatus recordWithStatus = new QRecordWithStatus(record); QRecordWithStatus recordWithStatus = new QRecordWithStatus(record);
recordsWithStatus.add(recordWithStatus); recordsWithStatus.add(recordWithStatus);

View File

@ -25,7 +25,7 @@ package com.kingsrook.qqq.backend.module.rdbms.jdbc;
import java.sql.Connection; import java.sql.Connection;
import java.sql.DriverManager; import java.sql.DriverManager;
import java.sql.SQLException; import java.sql.SQLException;
import com.kingsrook.qqq.backend.module.rdbms.RDBMSBackendMetaData; import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSBackendMetaData;
/******************************************************************************* /*******************************************************************************

View File

@ -0,0 +1,255 @@
/*
* QQQ - Low-code Application Framework for Engineers.
* Copyright (C) 2021-2022. Kingsrook, LLC
* 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
* contact@kingsrook.com
* https://github.com/Kingsrook/
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.kingsrook.qqq.backend.module.rdbms.model.metadata;
import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData;
import com.kingsrook.qqq.backend.module.rdbms.RDBMSBackendModule;
/*******************************************************************************
**
*******************************************************************************/
public class RDBMSBackendMetaData extends QBackendMetaData
{
private String vendor;
private String hostName;
private Integer port;
private String databaseName;
private String username;
private String password;
/*******************************************************************************
** Default Constructor.
*******************************************************************************/
public RDBMSBackendMetaData()
{
super();
setBackendType(RDBMSBackendModule.class);
}
/*******************************************************************************
** Getter for vendor
**
*******************************************************************************/
public String getVendor()
{
return vendor;
}
/*******************************************************************************
** Setter for vendor
**
*******************************************************************************/
public void setVendor(String vendor)
{
this.vendor = vendor;
}
/*******************************************************************************
** Fluent Setter for vendor
**
*******************************************************************************/
public RDBMSBackendMetaData withVendor(String vendor)
{
this.vendor = vendor;
return (this);
}
/*******************************************************************************
** Getter for hostName
**
*******************************************************************************/
public String getHostName()
{
return hostName;
}
/*******************************************************************************
** Setter for hostName
**
*******************************************************************************/
public void setHostName(String hostName)
{
this.hostName = hostName;
}
/*******************************************************************************
** Fluent Setter for hostName
**
*******************************************************************************/
public RDBMSBackendMetaData withHostName(String hostName)
{
this.hostName = hostName;
return (this);
}
/*******************************************************************************
** Getter for port
**
*******************************************************************************/
public Integer getPort()
{
return port;
}
/*******************************************************************************
** Setter for port
**
*******************************************************************************/
public void setPort(Integer port)
{
this.port = port;
}
/*******************************************************************************
** Fluent Setter for port
**
*******************************************************************************/
public RDBMSBackendMetaData withPort(Integer port)
{
this.port = port;
return (this);
}
/*******************************************************************************
** Getter for databaseName
**
*******************************************************************************/
public String getDatabaseName()
{
return databaseName;
}
/*******************************************************************************
** Setter for databaseName
**
*******************************************************************************/
public void setDatabaseName(String databaseName)
{
this.databaseName = databaseName;
}
/*******************************************************************************
** Fluent Setter for databaseName
**
*******************************************************************************/
public RDBMSBackendMetaData withDatabaseName(String databaseName)
{
this.databaseName = databaseName;
return (this);
}
/*******************************************************************************
** Getter for username
**
*******************************************************************************/
public String getUsername()
{
return username;
}
/*******************************************************************************
** Setter for username
**
*******************************************************************************/
public void setUsername(String username)
{
this.username = username;
}
/*******************************************************************************
** Fluent Setter for username
**
*******************************************************************************/
public RDBMSBackendMetaData withUsername(String username)
{
this.username = username;
return (this);
}
/*******************************************************************************
** Getter for password
**
*******************************************************************************/
public String getPassword()
{
return password;
}
/*******************************************************************************
** Setter for password
**
*******************************************************************************/
public void setPassword(String password)
{
this.password = password;
}
/*******************************************************************************
** Fluent Setter for password
**
*******************************************************************************/
public RDBMSBackendMetaData withPassword(String password)
{
this.password = password;
return (this);
}
}

View File

@ -19,86 +19,63 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.kingsrook.qqq.backend.module.rdbms; package com.kingsrook.qqq.backend.module.rdbms.model.metadata;
import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QTableBackendDetails;
import com.kingsrook.qqq.backend.module.rdbms.RDBMSBackendModule;
/******************************************************************************* /*******************************************************************************
** ** Extension of QTableBackendDetails, with details specific to an RDBMS table.
*******************************************************************************/ *******************************************************************************/
public class RDBMSBackendMetaData extends QBackendMetaData public class RDBMSTableBackendDetails extends QTableBackendDetails
{ {
private String tableName;
/******************************************************************************* /*******************************************************************************
** ** Default Constructor.
*******************************************************************************/ *******************************************************************************/
public RDBMSBackendMetaData(QBackendMetaData source) public RDBMSTableBackendDetails()
{ {
super(); super();
setName(source.getName()); setBackendType(RDBMSBackendModule.class);
setValues(source.getValues());
} }
/******************************************************************************* /*******************************************************************************
** Getter for tableName
** **
*******************************************************************************/ *******************************************************************************/
public String getVendor() public String getTableName()
{ {
return getValue("vendor"); return tableName;
} }
/******************************************************************************* /*******************************************************************************
** Setter for tableName
** **
*******************************************************************************/ *******************************************************************************/
public String getHostName() public void setTableName(String tableName)
{ {
return getValue("hostName"); this.tableName = tableName;
} }
/******************************************************************************* /*******************************************************************************
** Fluent Setter for tableName
** **
*******************************************************************************/ *******************************************************************************/
public String getPort() public RDBMSTableBackendDetails withTableName(String tableName)
{ {
return getValue("port"); this.tableName = tableName;
} return (this);
/*******************************************************************************
**
*******************************************************************************/
public String getDatabaseName()
{
return getValue("databaseName");
}
/*******************************************************************************
**
*******************************************************************************/
public String getUsername()
{
return getValue("username");
}
/*******************************************************************************
**
*******************************************************************************/
public String getPassword()
{
return getValue("password");
} }
} }

View File

@ -0,0 +1,89 @@
/*
* QQQ - Low-code Application Framework for Engineers.
* Copyright (C) 2021-2022. Kingsrook, LLC
* 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
* contact@kingsrook.com
* https://github.com/Kingsrook/
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.kingsrook.qqq.backend.module.rdbms;
import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.QFieldType;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData;
import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSBackendMetaData;
import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSTableBackendDetails;
/*******************************************************************************
**
*******************************************************************************/
public class TestUtils
{
/*******************************************************************************
**
*******************************************************************************/
public static QInstance defineInstance()
{
QInstance qInstance = new QInstance();
qInstance.addBackend(defineBackend());
qInstance.addTable(defineTablePerson());
return (qInstance);
}
/*******************************************************************************
**
*******************************************************************************/
public static RDBMSBackendMetaData defineBackend()
{
RDBMSBackendMetaData rdbmsBackendMetaData = new RDBMSBackendMetaData()
.withVendor("h2")
.withHostName("mem")
.withDatabaseName("test_database")
.withUsername("sa")
.withPassword("");
rdbmsBackendMetaData.setName("default");
return (rdbmsBackendMetaData);
}
/*******************************************************************************
**
*******************************************************************************/
public static QTableMetaData defineTablePerson()
{
return new QTableMetaData()
.withName("a-person")
.withLabel("Person")
.withBackendName(defineBackend().getName())
.withPrimaryKeyField("id")
.withField(new QFieldMetaData("id", QFieldType.INTEGER))
.withField(new QFieldMetaData("createDate", QFieldType.DATE_TIME).withBackendName("create_date"))
.withField(new QFieldMetaData("modifyDate", QFieldType.DATE_TIME).withBackendName("modify_date"))
.withField(new QFieldMetaData("firstName", QFieldType.STRING).withBackendName("first_name"))
.withField(new QFieldMetaData("lastName", QFieldType.STRING).withBackendName("last_name"))
.withField(new QFieldMetaData("birthDate", QFieldType.DATE).withBackendName("birth_date"))
.withField(new QFieldMetaData("email", QFieldType.STRING))
.withBackendDetails(new RDBMSTableBackendDetails().withTableName("person"));
}
}

View File

@ -25,12 +25,7 @@ package com.kingsrook.qqq.backend.module.rdbms.actions;
import java.io.InputStream; import java.io.InputStream;
import java.sql.Connection; import java.sql.Connection;
import java.util.List; import java.util.List;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.module.rdbms.TestUtils;
import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.QFieldType;
import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData;
import com.kingsrook.qqq.backend.module.rdbms.RDBMSBackendMetaData;
import com.kingsrook.qqq.backend.module.rdbms.jdbc.ConnectionManager; import com.kingsrook.qqq.backend.module.rdbms.jdbc.ConnectionManager;
import com.kingsrook.qqq.backend.module.rdbms.jdbc.QueryManager; import com.kingsrook.qqq.backend.module.rdbms.jdbc.QueryManager;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
@ -43,56 +38,6 @@ import static junit.framework.Assert.assertNotNull;
public class RDBMSActionTest public class RDBMSActionTest
{ {
/*******************************************************************************
**
*******************************************************************************/
protected QInstance defineInstance()
{
QInstance qInstance = new QInstance();
qInstance.addBackend(defineBackend());
qInstance.addTable(defineTablePerson());
return (qInstance);
}
/*******************************************************************************
**
*******************************************************************************/
protected QBackendMetaData defineBackend()
{
return new QBackendMetaData()
.withName("default")
.withType("rdbms")
.withValue("vendor", "h2")
.withValue("hostName", "mem")
.withValue("databaseName", "test_database")
.withValue("username", "sa")
.withValue("password", "");
}
/*******************************************************************************
**
*******************************************************************************/
public QTableMetaData defineTablePerson()
{
return new QTableMetaData()
.withName("person")
.withLabel("Person")
.withBackendName(defineBackend().getName())
.withPrimaryKeyField("id")
.withField(new QFieldMetaData("id", QFieldType.INTEGER))
.withField(new QFieldMetaData("createDate", QFieldType.DATE_TIME).withBackendName("create_date"))
.withField(new QFieldMetaData("modifyDate", QFieldType.DATE_TIME).withBackendName("modify_date"))
.withField(new QFieldMetaData("firstName", QFieldType.STRING).withBackendName("first_name"))
.withField(new QFieldMetaData("lastName", QFieldType.STRING).withBackendName("last_name"))
.withField(new QFieldMetaData("birthDate", QFieldType.DATE).withBackendName("birth_date"))
.withField(new QFieldMetaData("email", QFieldType.STRING));
}
/******************************************************************************* /*******************************************************************************
** **
@ -101,7 +46,7 @@ public class RDBMSActionTest
protected void primeTestDatabase() throws Exception protected void primeTestDatabase() throws Exception
{ {
ConnectionManager connectionManager = new ConnectionManager(); ConnectionManager connectionManager = new ConnectionManager();
Connection connection = connectionManager.getConnection(new RDBMSBackendMetaData(defineBackend())); Connection connection = connectionManager.getConnection(TestUtils.defineBackend());
InputStream primeTestDatabaseSqlStream = RDBMSActionTest.class.getResourceAsStream("/prime-test-database.sql"); InputStream primeTestDatabaseSqlStream = RDBMSActionTest.class.getResourceAsStream("/prime-test-database.sql");
assertNotNull(primeTestDatabaseSqlStream); assertNotNull(primeTestDatabaseSqlStream);
List<String> lines = (List<String>) IOUtils.readLines(primeTestDatabaseSqlStream); List<String> lines = (List<String>) IOUtils.readLines(primeTestDatabaseSqlStream);
@ -121,7 +66,7 @@ public class RDBMSActionTest
protected void runTestSql(String sql, QueryManager.ResultSetProcessor resultSetProcessor) throws Exception protected void runTestSql(String sql, QueryManager.ResultSetProcessor resultSetProcessor) throws Exception
{ {
ConnectionManager connectionManager = new ConnectionManager(); ConnectionManager connectionManager = new ConnectionManager();
Connection connection = connectionManager.getConnection(new RDBMSBackendMetaData(defineBackend())); Connection connection = connectionManager.getConnection(TestUtils.defineBackend());
QueryManager.executeStatement(connection, sql, resultSetProcessor); QueryManager.executeStatement(connection, sql, resultSetProcessor);
} }
} }

View File

@ -26,6 +26,7 @@ import java.util.List;
import com.kingsrook.qqq.backend.core.model.actions.delete.DeleteRequest; import com.kingsrook.qqq.backend.core.model.actions.delete.DeleteRequest;
import com.kingsrook.qqq.backend.core.model.actions.delete.DeleteResult; import com.kingsrook.qqq.backend.core.model.actions.delete.DeleteResult;
import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.core.utils.CollectionUtils;
import com.kingsrook.qqq.backend.module.rdbms.TestUtils;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
@ -113,8 +114,8 @@ public class RDBMSDeleteActionTest extends RDBMSActionTest
private DeleteRequest initDeleteRequest() private DeleteRequest initDeleteRequest()
{ {
DeleteRequest deleteRequest = new DeleteRequest(); DeleteRequest deleteRequest = new DeleteRequest();
deleteRequest.setInstance(defineInstance()); deleteRequest.setInstance(TestUtils.defineInstance());
deleteRequest.setTableName(defineTablePerson().getName()); deleteRequest.setTableName(TestUtils.defineTablePerson().getName());
return deleteRequest; return deleteRequest;
} }

View File

@ -27,6 +27,7 @@ import com.kingsrook.qqq.backend.core.model.actions.insert.InsertRequest;
import com.kingsrook.qqq.backend.core.model.actions.insert.InsertResult; import com.kingsrook.qqq.backend.core.model.actions.insert.InsertResult;
import com.kingsrook.qqq.backend.core.model.data.QRecord; import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.core.utils.CollectionUtils;
import com.kingsrook.qqq.backend.module.rdbms.TestUtils;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
@ -135,8 +136,8 @@ public class RDBMSInsertActionTest extends RDBMSActionTest
private InsertRequest initInsertRequest() private InsertRequest initInsertRequest()
{ {
InsertRequest insertRequest = new InsertRequest(); InsertRequest insertRequest = new InsertRequest();
insertRequest.setInstance(defineInstance()); insertRequest.setInstance(TestUtils.defineInstance());
insertRequest.setTableName(defineTablePerson().getName()); insertRequest.setTableName(TestUtils.defineTablePerson().getName());
return insertRequest; return insertRequest;
} }

View File

@ -29,6 +29,7 @@ import com.kingsrook.qqq.backend.core.model.actions.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.query.QQueryFilter; import com.kingsrook.qqq.backend.core.model.actions.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.actions.query.QueryRequest; import com.kingsrook.qqq.backend.core.model.actions.query.QueryRequest;
import com.kingsrook.qqq.backend.core.model.actions.query.QueryResult; import com.kingsrook.qqq.backend.core.model.actions.query.QueryResult;
import com.kingsrook.qqq.backend.module.rdbms.TestUtils;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -413,8 +414,8 @@ public class RDBMSQueryActionTest extends RDBMSActionTest
private QueryRequest initQueryRequest() private QueryRequest initQueryRequest()
{ {
QueryRequest queryRequest = new QueryRequest(); QueryRequest queryRequest = new QueryRequest();
queryRequest.setInstance(defineInstance()); queryRequest.setInstance(TestUtils.defineInstance());
queryRequest.setTableName(defineTablePerson().getName()); queryRequest.setTableName(TestUtils.defineTablePerson().getName());
return queryRequest; return queryRequest;
} }

View File

@ -27,6 +27,7 @@ import com.kingsrook.qqq.backend.core.model.actions.update.UpdateRequest;
import com.kingsrook.qqq.backend.core.model.actions.update.UpdateResult; import com.kingsrook.qqq.backend.core.model.actions.update.UpdateResult;
import com.kingsrook.qqq.backend.core.model.data.QRecord; import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.core.utils.CollectionUtils;
import com.kingsrook.qqq.backend.module.rdbms.TestUtils;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
@ -148,8 +149,8 @@ public class RDBMSUpdateActionTest extends RDBMSActionTest
private UpdateRequest initUpdateRequest() private UpdateRequest initUpdateRequest()
{ {
UpdateRequest updateRequest = new UpdateRequest(); UpdateRequest updateRequest = new UpdateRequest();
updateRequest.setInstance(defineInstance()); updateRequest.setInstance(TestUtils.defineInstance());
updateRequest.setTableName(defineTablePerson().getName()); updateRequest.setTableName(TestUtils.defineTablePerson().getName());
return updateRequest; return updateRequest;
} }

View File

@ -0,0 +1,73 @@
/*
* QQQ - Low-code Application Framework for Engineers.
* Copyright (C) 2021-2022. Kingsrook, LLC
* 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
* contact@kingsrook.com
* https://github.com/Kingsrook/
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.kingsrook.qqq.backend.module.rdbms.model.metadata;
import java.io.IOException;
import com.kingsrook.qqq.backend.core.adapters.QInstanceAdapter;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
import com.kingsrook.qqq.backend.core.utils.JsonUtils;
import com.kingsrook.qqq.backend.module.rdbms.TestUtils;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.junit.jupiter.api.Assertions.assertTrue;
/*******************************************************************************
** Unit test for RDBMSBackendMetaData
*******************************************************************************/
class RDBMSBackendMetaDataTest
{
/*******************************************************************************
** Test that an instance can be serialized as expected
*******************************************************************************/
@Test
public void testSerializingToJson()
{
QInstance qInstance = TestUtils.defineInstance();
String json = new QInstanceAdapter().qInstanceToJsonIncludingBackend(qInstance);
System.out.println(JsonUtils.prettyPrint(json));
System.out.println(json);
String expectToContain = """
"backends":{"default":{"hostName":"mem","password":"","databaseName":"test_database\"""";
assertTrue(json.contains(expectToContain));
}
/*******************************************************************************
** Test that an instance can be deserialized as expected
*******************************************************************************/
@Test
public void testDeserializingFromJson() throws IOException
{
QInstanceAdapter qInstanceAdapter = new QInstanceAdapter();
QInstance qInstance = TestUtils.defineInstance();
String json = qInstanceAdapter.qInstanceToJsonIncludingBackend(qInstance);
QInstance deserialized = qInstanceAdapter.jsonToQInstanceIncludingBackends(json);
assertThat(deserialized).usingRecursiveComparison().isEqualTo(qInstance);
}
}