CE-882 Add TRUE and FALSE operators

This commit is contained in:
2024-04-25 12:01:08 -05:00
parent c6e0389338
commit ef2b08899b
7 changed files with 75 additions and 4 deletions

View File

@ -49,5 +49,7 @@ public enum QCriteriaOperator
IS_BLANK, IS_BLANK,
IS_NOT_BLANK, IS_NOT_BLANK,
BETWEEN, BETWEEN,
NOT_BETWEEN NOT_BETWEEN,
TRUE,
FALSE
} }

View File

@ -179,6 +179,8 @@ public class BackendQueryFilterUtils
boolean between = (testGreaterThan(criteria0, value) || testEquals(criteria0, value)) && (!testGreaterThan(criteria1, value) || testEquals(criteria1, value)); boolean between = (testGreaterThan(criteria0, value) || testEquals(criteria0, value)) && (!testGreaterThan(criteria1, value) || testEquals(criteria1, value));
yield !between; yield !between;
} }
case TRUE -> true;
case FALSE -> false;
}; };
return criterionMatches; return criterionMatches;
} }

View File

@ -224,6 +224,9 @@ class MemoryBackendModuleTest extends BaseTest
)); ));
new InsertAction().execute(insertInput); new InsertAction().execute(insertInput);
assertEquals(3, queryShapes(qInstance, table, session, new QFilterCriteria("id", QCriteriaOperator.TRUE)).size());
assertEquals(0, queryShapes(qInstance, table, session, new QFilterCriteria("id", QCriteriaOperator.FALSE)).size());
assertEquals(2, queryShapes(qInstance, table, session, new QFilterCriteria("id", QCriteriaOperator.IN, List.of(1, 2))).size()); assertEquals(2, queryShapes(qInstance, table, session, new QFilterCriteria("id", QCriteriaOperator.IN, List.of(1, 2))).size());
assertEquals(1, queryShapes(qInstance, table, session, new QFilterCriteria("id", QCriteriaOperator.IN, List.of(3, 4))).size()); assertEquals(1, queryShapes(qInstance, table, session, new QFilterCriteria("id", QCriteriaOperator.IN, List.of(3, 4))).size());

View File

@ -626,6 +626,8 @@ public class AbstractMongoDBAction
case IS_NOT_BLANK -> Filters.nor(filterIsBlank(fieldBackendName)); case IS_NOT_BLANK -> Filters.nor(filterIsBlank(fieldBackendName));
case BETWEEN -> filterBetween(fieldBackendName, values); case BETWEEN -> filterBetween(fieldBackendName, values);
case NOT_BETWEEN -> Filters.nor(filterBetween(fieldBackendName, values)); case NOT_BETWEEN -> Filters.nor(filterBetween(fieldBackendName, values));
case TRUE -> Filters.or(Filters.eq(fieldBackendName, "true"), Filters.ne(fieldBackendName, "true"), Filters.eq(fieldBackendName, null)); // todo test!!
case FALSE -> Filters.and(Filters.eq(fieldBackendName, "true"), Filters.ne(fieldBackendName, "true"), Filters.eq(fieldBackendName, null));
}); });
} }

View File

@ -213,6 +213,33 @@ class MongoDBQueryActionTest extends BaseTest
} }
/*******************************************************************************
**
*******************************************************************************/
@Test
public void testTrueQuery() throws QException
{
QueryInput queryInput = initQueryRequest();
queryInput.setFilter(new QQueryFilter(new QFilterCriteria("email", QCriteriaOperator.TRUE)));
QueryOutput queryOutput = new MongoDBQueryAction().execute(queryInput);
assertEquals(5, queryOutput.getRecords().size(), "'TRUE' query should find all rows");
}
/*******************************************************************************
**
*******************************************************************************/
@Test
public void testFalseQuery() throws QException
{
QueryInput queryInput = initQueryRequest();
queryInput.setFilter(new QQueryFilter(new QFilterCriteria("email", QCriteriaOperator.FALSE)));
QueryOutput queryOutput = new MongoDBQueryAction().execute(queryInput);
assertEquals(0, queryOutput.getRecords().size(), "'FALSE' query should find no rows");
}
/******************************************************************************* /*******************************************************************************
** **

View File

@ -42,7 +42,6 @@ import java.util.stream.Collectors;
import com.kingsrook.qqq.backend.core.actions.ActionHelper; import com.kingsrook.qqq.backend.core.actions.ActionHelper;
import com.kingsrook.qqq.backend.core.actions.values.QValueFormatter; import com.kingsrook.qqq.backend.core.actions.values.QValueFormatter;
import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.context.QContext;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.exceptions.QValueException; import com.kingsrook.qqq.backend.core.exceptions.QValueException;
import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.logging.QLogger;
import com.kingsrook.qqq.backend.core.model.actions.AbstractTableActionInput; import com.kingsrook.qqq.backend.core.model.actions.AbstractTableActionInput;
@ -592,9 +591,17 @@ public abstract class AbstractRDBMSAction
expectedNoOfParams = 2; expectedNoOfParams = 2;
break; break;
} }
default: case TRUE:
{ {
throw new IllegalArgumentException("Unexpected operator: " + criterion.getOperator()); clause = " 1 = 1 ";
expectedNoOfParams = 0;
break;
}
case FALSE:
{
clause = " 0 = 1 ";
expectedNoOfParams = 0;
break;
} }
} }

View File

@ -99,6 +99,34 @@ public class RDBMSQueryActionTest extends RDBMSActionTest
/*******************************************************************************
**
*******************************************************************************/
@Test
public void testTrueQuery() throws QException
{
QueryInput queryInput = initQueryRequest();
queryInput.setFilter(new QQueryFilter(new QFilterCriteria("email", QCriteriaOperator.TRUE)));
QueryOutput queryOutput = new RDBMSQueryAction().execute(queryInput);
assertEquals(5, queryOutput.getRecords().size(), "'TRUE' query should find all rows");
}
/*******************************************************************************
**
*******************************************************************************/
@Test
public void testFalseQuery() throws QException
{
QueryInput queryInput = initQueryRequest();
queryInput.setFilter(new QQueryFilter(new QFilterCriteria("email", QCriteriaOperator.FALSE)));
QueryOutput queryOutput = new RDBMSQueryAction().execute(queryInput);
assertEquals(0, queryOutput.getRecords().size(), "'FALSE' query should find no rows");
}
/******************************************************************************* /*******************************************************************************
** **
*******************************************************************************/ *******************************************************************************/