mirror of
https://github.com/Kingsrook/qqq.git
synced 2025-07-18 13:10:44 +00:00
QQQ-21: added 'count' action
This commit is contained in:
4
pom.xml
4
pom.xml
@ -53,12 +53,12 @@
|
||||
<dependency>
|
||||
<groupId>com.kingsrook.qqq</groupId>
|
||||
<artifactId>qqq-backend-core</artifactId>
|
||||
<version>0.1.0-20220708.155822-4</version>
|
||||
<version>0.1.0-20220708.195335-5</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.kingsrook.qqq</groupId>
|
||||
<artifactId>qqq-backend-module-rdbms</artifactId>
|
||||
<version>0.0.0</version>
|
||||
<version>0.1.0-20220708.202041-3</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
|
@ -90,6 +90,7 @@ public class QCommandBuilder
|
||||
// add table-specific sub-commands for the table //
|
||||
///////////////////////////////////////////////////
|
||||
tableCommand.addSubcommand("meta-data", defineMetaDataCommand(table));
|
||||
tableCommand.addSubcommand("count", defineQueryCommand(table));
|
||||
tableCommand.addSubcommand("query", defineQueryCommand(table));
|
||||
tableCommand.addSubcommand("insert", defineInsertCommand(table));
|
||||
tableCommand.addSubcommand("update", defineUpdateCommand(table));
|
||||
|
@ -32,6 +32,7 @@ import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import com.kingsrook.qqq.backend.core.actions.CountAction;
|
||||
import com.kingsrook.qqq.backend.core.actions.DeleteAction;
|
||||
import com.kingsrook.qqq.backend.core.actions.InsertAction;
|
||||
import com.kingsrook.qqq.backend.core.actions.MetaDataAction;
|
||||
@ -45,6 +46,8 @@ import com.kingsrook.qqq.backend.core.adapters.JsonToQRecordAdapter;
|
||||
import com.kingsrook.qqq.backend.core.adapters.QInstanceAdapter;
|
||||
import com.kingsrook.qqq.backend.core.exceptions.QException;
|
||||
import com.kingsrook.qqq.backend.core.exceptions.QModuleDispatchException;
|
||||
import com.kingsrook.qqq.backend.core.model.actions.count.CountRequest;
|
||||
import com.kingsrook.qqq.backend.core.model.actions.count.CountResult;
|
||||
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.insert.InsertRequest;
|
||||
@ -94,7 +97,7 @@ public class QPicoCliImplementation
|
||||
public static final int DEFAULT_LIMIT = 20;
|
||||
|
||||
private static QInstance qInstance;
|
||||
private static QSession session;
|
||||
private static QSession session;
|
||||
|
||||
|
||||
|
||||
@ -109,14 +112,14 @@ public class QPicoCliImplementation
|
||||
// parse args to look up metaData and prime instance
|
||||
if(args.length > 0 && args[0].startsWith("--qInstanceJsonFile="))
|
||||
{
|
||||
String filePath = args[0].replaceFirst("--.*=", "");
|
||||
String filePath = args[0].replaceFirst("--.*=", "");
|
||||
String qInstanceJson = FileUtils.readFileToString(new File(filePath));
|
||||
qInstance = new QInstanceAdapter().jsonToQInstanceIncludingBackends(qInstanceJson);
|
||||
|
||||
String[] subArgs = Arrays.copyOfRange(args, 1, args.length);
|
||||
|
||||
QPicoCliImplementation qPicoCliImplementation = new QPicoCliImplementation(qInstance);
|
||||
int exitCode = qPicoCliImplementation.runCli("qapi", subArgs);
|
||||
int exitCode = qPicoCliImplementation.runCli("qapi", subArgs);
|
||||
System.exit(exitCode);
|
||||
}
|
||||
else
|
||||
@ -229,7 +232,7 @@ public class QPicoCliImplementation
|
||||
private static void setupSession(String[] args) throws QModuleDispatchException
|
||||
{
|
||||
QAuthenticationModuleDispatcher qAuthenticationModuleDispatcher = new QAuthenticationModuleDispatcher();
|
||||
QAuthenticationModuleInterface authenticationModule = qAuthenticationModuleDispatcher.getQModule(qInstance.getAuthentication());
|
||||
QAuthenticationModuleInterface authenticationModule = qAuthenticationModuleDispatcher.getQModule(qInstance.getAuthentication());
|
||||
|
||||
// todo - does this need some per-provider logic actually? mmm...
|
||||
Map<String, String> authenticationContext = new HashMap<>();
|
||||
@ -251,7 +254,7 @@ public class QPicoCliImplementation
|
||||
else
|
||||
{
|
||||
ParseResult subParseResult = parseResult.subcommand();
|
||||
String subCommandName = subParseResult.commandSpec().name();
|
||||
String subCommandName = subParseResult.commandSpec().name();
|
||||
CommandLine subCommandLine = commandLine.getSubcommands().get(subCommandName);
|
||||
switch(subCommandName)
|
||||
{
|
||||
@ -282,13 +285,17 @@ public class QPicoCliImplementation
|
||||
if(tableParseResult.hasSubcommand())
|
||||
{
|
||||
ParseResult subParseResult = tableParseResult.subcommand();
|
||||
String subCommandName = subParseResult.commandSpec().name();
|
||||
String subCommandName = subParseResult.commandSpec().name();
|
||||
switch(subCommandName)
|
||||
{
|
||||
case "meta-data":
|
||||
{
|
||||
return runTableMetaData(commandLine, tableName, subParseResult);
|
||||
}
|
||||
case "count":
|
||||
{
|
||||
return runTableCount(commandLine, tableName, subParseResult);
|
||||
}
|
||||
case "query":
|
||||
{
|
||||
return runTableQuery(commandLine, tableName, subParseResult);
|
||||
@ -345,7 +352,7 @@ public class QPicoCliImplementation
|
||||
///////////////////////////////////////////
|
||||
// move on to running the actual process //
|
||||
///////////////////////////////////////////
|
||||
String subCommandName = subParseResult.subcommand().commandSpec().name();
|
||||
String subCommandName = subParseResult.subcommand().commandSpec().name();
|
||||
CommandLine subCommandLine = commandLine.getSubcommands().get(subCommandName);
|
||||
return runActualProcess(subCommandLine, subParseResult.subcommand());
|
||||
}
|
||||
@ -358,9 +365,9 @@ public class QPicoCliImplementation
|
||||
*******************************************************************************/
|
||||
private int runActualProcess(CommandLine subCommandLine, ParseResult processParseResult)
|
||||
{
|
||||
String processName = processParseResult.commandSpec().name();
|
||||
QProcessMetaData process = qInstance.getProcess(processName);
|
||||
RunProcessRequest request = new RunProcessRequest(qInstance);
|
||||
String processName = processParseResult.commandSpec().name();
|
||||
QProcessMetaData process = qInstance.getProcess(processName);
|
||||
RunProcessRequest request = new RunProcessRequest(qInstance);
|
||||
|
||||
request.setSession(session);
|
||||
request.setProcessName(processName);
|
||||
@ -418,6 +425,24 @@ public class QPicoCliImplementation
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
private int runTableCount(CommandLine commandLine, String tableName, ParseResult subParseResult) throws QException
|
||||
{
|
||||
CountRequest countRequest = new CountRequest(qInstance);
|
||||
countRequest.setSession(session);
|
||||
countRequest.setTableName(tableName);
|
||||
countRequest.setFilter(generateQueryFilter(subParseResult));
|
||||
|
||||
CountAction countAction = new CountAction();
|
||||
CountResult countResult = countAction.execute(countRequest);
|
||||
commandLine.getOut().println(JsonUtils.toPrettyJson(countResult));
|
||||
return commandLine.getCommandSpec().exitCodeOnSuccess();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@ -428,15 +453,28 @@ public class QPicoCliImplementation
|
||||
queryRequest.setTableName(tableName);
|
||||
queryRequest.setSkip(subParseResult.matchedOptionValue("skip", null));
|
||||
queryRequest.setLimit(subParseResult.matchedOptionValue("limit", DEFAULT_LIMIT));
|
||||
queryRequest.setFilter(generateQueryFilter(subParseResult));
|
||||
|
||||
QueryAction queryAction = new QueryAction();
|
||||
QueryResult queryResult = queryAction.execute(queryRequest);
|
||||
commandLine.getOut().println(JsonUtils.toPrettyJson(queryResult));
|
||||
return commandLine.getCommandSpec().exitCodeOnSuccess();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
private QQueryFilter generateQueryFilter(ParseResult subParseResult)
|
||||
{
|
||||
QQueryFilter filter = new QQueryFilter();
|
||||
queryRequest.setFilter(filter);
|
||||
|
||||
String[] criteria = subParseResult.matchedOptionValue("criteria", new String[] {});
|
||||
for(String criterion : criteria)
|
||||
{
|
||||
// todo - parse!
|
||||
String[] parts = criterion.split(" ");
|
||||
String[] parts = criterion.split(" ");
|
||||
QFilterCriteria qQueryCriteria = new QFilterCriteria();
|
||||
qQueryCriteria.setFieldName(parts[0]);
|
||||
qQueryCriteria.setOperator(QCriteriaOperator.valueOf(parts[1]));
|
||||
@ -444,10 +482,7 @@ public class QPicoCliImplementation
|
||||
filter.addCriteria(qQueryCriteria);
|
||||
}
|
||||
|
||||
QueryAction queryAction = new QueryAction();
|
||||
QueryResult queryResult = queryAction.execute(queryRequest);
|
||||
commandLine.getOut().println(JsonUtils.toPrettyJson(queryResult));
|
||||
return commandLine.getCommandSpec().exitCodeOnSuccess();
|
||||
return filter;
|
||||
}
|
||||
|
||||
|
||||
@ -497,7 +532,7 @@ public class QPicoCliImplementation
|
||||
try
|
||||
{
|
||||
String path = subParseResult.matchedOptionValue("--csvFile", "");
|
||||
String csv = FileUtils.readFileToString(new File(path));
|
||||
String csv = FileUtils.readFileToString(new File(path));
|
||||
recordList = new CsvToQRecordAdapter().buildRecordsFromCsv(csv, table, mapping);
|
||||
}
|
||||
catch(IOException e)
|
||||
@ -554,7 +589,7 @@ public class QPicoCliImplementation
|
||||
|
||||
boolean anyFields = false;
|
||||
|
||||
String primaryKeyOption = subParseResult.matchedOptionValue("--primaryKey", "");
|
||||
String primaryKeyOption = subParseResult.matchedOptionValue("--primaryKey", "");
|
||||
Serializable[] primaryKeyValues = primaryKeyOption.split(",");
|
||||
for(Serializable primaryKeyValue : primaryKeyValues)
|
||||
{
|
||||
@ -603,7 +638,7 @@ public class QPicoCliImplementation
|
||||
/////////////////////////////////////////////
|
||||
// get the pKeys that the user specified //
|
||||
/////////////////////////////////////////////
|
||||
String primaryKeyOption = subParseResult.matchedOptionValue("--primaryKey", "");
|
||||
String primaryKeyOption = subParseResult.matchedOptionValue("--primaryKey", "");
|
||||
Serializable[] primaryKeyValues = primaryKeyOption.split(",");
|
||||
deleteRequest.setPrimaryKeys(Arrays.asList(primaryKeyValues));
|
||||
|
||||
|
@ -214,6 +214,28 @@ class QPicoCliImplementationTest
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
** test running a count on a table
|
||||
**
|
||||
*******************************************************************************/
|
||||
@Test
|
||||
public void test_tableCount()
|
||||
{
|
||||
TestOutput testOutput = testCli("person", "count", "--criteria", "id NOT_EQUALS 3");
|
||||
JSONObject countResult = JsonUtils.toJSONObject(testOutput.getOutput());
|
||||
assertNotNull(countResult);
|
||||
int count = countResult.getInt("count");
|
||||
assertEquals(4, count);
|
||||
|
||||
testOutput = testCli("person", "count", "--criteria", "id EQUALS 3");
|
||||
countResult = JsonUtils.toJSONObject(testOutput.getOutput());
|
||||
assertNotNull(countResult);
|
||||
count = countResult.getInt("count");
|
||||
assertEquals(1, count);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
** test running a query on a table
|
||||
**
|
||||
|
Reference in New Issue
Block a user