Move the query_compare_t (compraritor, or "what kind of comparrison to make")

into the Predicate Data, which allows the predicate creation functions
to sanity check the validity.


git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@6694 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Derek Atkins 2002-02-06 02:39:01 +00:00
parent ba18e6db4c
commit c68bf8adbd
4 changed files with 71 additions and 56 deletions

View File

@ -123,7 +123,7 @@ static GHashTable *freeTable = NULL;
/* QUERYCORE_STRING */
static int string_match_predicate (gpointer object, QueryAccess get_fcn,
query_compare_t how, QueryPredData_t pd)
QueryPredData_t pd)
{
query_string_t pdata = (query_string_t) pd;
const char *s;
@ -154,13 +154,13 @@ static int string_match_predicate (gpointer object, QueryAccess get_fcn,
} while (FALSE);
switch (how) {
switch (pd->how) {
case COMPARE_EQUAL:
return ret;
case COMPARE_NEQ:
return !ret;
default:
PWARN ("bad match type: %d", how);
PWARN ("bad match type: %d", pd->how);
return 0;
}
}
@ -200,20 +200,23 @@ static QueryPredData_t string_copy_predicate (QueryPredData_t pd)
VERIFY_PDATA_R (query_string_type);
return gncQueryStringPredicate (pdata->matchstring, pdata->options,
return gncQueryStringPredicate (pd->how, pdata->matchstring, pdata->options,
pdata->is_regex);
}
QueryPredData_t gncQueryStringPredicate (char *str, string_match_t options,
QueryPredData_t gncQueryStringPredicate (query_compare_t how,
char *str, string_match_t options,
gboolean is_regex)
{
query_string_t pdata;
g_return_val_if_fail (str, NULL);
g_return_val_if_fail (*str != '\0', NULL);
g_return_val_if_fail (how == COMPARE_EQUAL || how == COMPARE_NEQ, NULL);
pdata = g_new0 (query_string_def, 1);
pdata->pd.type_name = query_string_type;
pdata->pd.how = how;
pdata->options = options;
pdata->matchstring = g_strdup (str);
@ -252,7 +255,7 @@ static int date_compare (Timespec ta, Timespec tb, date_match_t options)
}
static int date_match_predicate (gpointer object, QueryAccess get_fcn,
query_compare_t how, QueryPredData_t pd)
QueryPredData_t pd)
{
query_date_t pdata = (query_date_t)pd;
Timespec objtime;
@ -263,7 +266,7 @@ static int date_match_predicate (gpointer object, QueryAccess get_fcn,
objtime = ((query_date_getter)get_fcn) (object);
compare = date_compare (objtime, pdata->date, pdata->options);
switch (how) {
switch (pd->how) {
case COMPARE_LT:
return (compare < 0);
case COMPARE_LTE:
@ -277,7 +280,7 @@ static int date_match_predicate (gpointer object, QueryAccess get_fcn,
case COMPARE_NEQ:
return (compare != 0);
default:
PWARN ("bad match type: %d", how);
PWARN ("bad match type: %d", pd->how);
return 0;
}
}
@ -310,15 +313,17 @@ static QueryPredData_t date_copy_predicate (QueryPredData_t pd)
VERIFY_PDATA_R (query_date_type);
return gncQueryDatePredicate (pdata->options, pdata->date);
return gncQueryDatePredicate (pd->how, pdata->options, pdata->date);
}
QueryPredData_t gncQueryDatePredicate (date_match_t options, Timespec date)
QueryPredData_t gncQueryDatePredicate (query_compare_t how,
date_match_t options, Timespec date)
{
query_date_t pdata;
pdata = g_new0 (query_date_def, 1);
pdata->pd.type_name = query_date_type;
pdata->pd.how = how;
pdata->options = options;
pdata->date = date;
return ((QueryPredData_t)pdata);
@ -327,7 +332,7 @@ QueryPredData_t gncQueryDatePredicate (date_match_t options, Timespec date)
/* QUERYCORE_NUMERIC */
static int numeric_match_predicate (gpointer object, QueryAccess get_fcn,
query_compare_t how, QueryPredData_t pd)
QueryPredData_t pd)
{
query_numeric_t pdata = (query_numeric_t)pd;
gnc_numeric obj_val;
@ -348,7 +353,7 @@ static int numeric_match_predicate (gpointer object, QueryAccess get_fcn,
break;
}
if (how == COMPARE_EQUAL) {
if (pd->how == COMPARE_EQUAL) {
gnc_numeric cmp_val = gnc_numeric_create (1, 10000);
compare =
(gnc_numeric_compare (gnc_numeric_sub (gnc_numeric_abs (obj_val),
@ -358,7 +363,7 @@ static int numeric_match_predicate (gpointer object, QueryAccess get_fcn,
} else
compare = gnc_numeric_compare (gnc_numeric_abs (obj_val), pdata->amount);
switch (how) {
switch (pd->how) {
case COMPARE_LT:
return (compare < 0);
case COMPARE_LTE:
@ -372,7 +377,7 @@ static int numeric_match_predicate (gpointer object, QueryAccess get_fcn,
case COMPARE_NEQ:
return (!compare);
default:
PWARN ("bad match type: %d", how);
PWARN ("bad match type: %d", pd->how);
return 0;
}
}
@ -401,15 +406,17 @@ static QueryPredData_t numeric_copy_predicate (QueryPredData_t pd)
{
query_numeric_t pdata = (query_numeric_t)pd;
VERIFY_PDATA_R (query_numeric_type);
return gncQueryNumericPredicate (pdata->options, pdata->amount);
return gncQueryNumericPredicate (pd->how, pdata->options, pdata->amount);
}
QueryPredData_t gncQueryNumericPredicate (numeric_match_t options,
QueryPredData_t gncQueryNumericPredicate (query_compare_t how,
numeric_match_t options,
gnc_numeric value)
{
query_numeric_t pdata;
pdata = g_new0 (query_numeric_def, 1);
pdata->pd.type_name = query_numeric_type;
pdata->pd.how = how;
pdata->options = options;
pdata->amount = value;
return ((QueryPredData_t)pdata);
@ -418,7 +425,7 @@ QueryPredData_t gncQueryNumericPredicate (numeric_match_t options,
/* QUERYCORE_GUID */
static int guid_match_predicate (gpointer object, QueryAccess get_fcn,
query_compare_t how, QueryPredData_t pd)
QueryPredData_t pd)
{
query_guid_t pdata = (query_guid_t)pd;
GList *node;
@ -513,7 +520,7 @@ QueryPredData_t gncQueryGUIDPredicate (guid_match_t options, GList *guids)
/* QUERYCORE_INT64 */
static int int64_match_predicate (gpointer object, QueryAccess get_fcn,
query_compare_t how, QueryPredData_t pd)
QueryPredData_t pd)
{
gint64 val;
query_int64_t pdata = (query_int64_t)pd;
@ -522,7 +529,7 @@ static int int64_match_predicate (gpointer object, QueryAccess get_fcn,
val = ((query_int64_getter)get_fcn) (object);
switch (how) {
switch (pd->how) {
case COMPARE_LT:
return (val < pdata->val);
case COMPARE_LTE:
@ -536,7 +543,7 @@ static int int64_match_predicate (gpointer object, QueryAccess get_fcn,
case COMPARE_NEQ:
return (val != pdata->val);
default:
PWARN ("bad match type: %d", how);
PWARN ("bad match type: %d", pd->how);
return 0;
}
}
@ -566,13 +573,14 @@ static QueryPredData_t int64_copy_predicate (QueryPredData_t pd)
{
query_int64_t pdata = (query_int64_t)pd;
VERIFY_PDATA_R (query_int64_type);
return gncQueryInt64Predicate (pdata->val);
return gncQueryInt64Predicate (pd->how, pdata->val);
}
QueryPredData_t gncQueryInt64Predicate (gint64 val)
QueryPredData_t gncQueryInt64Predicate (query_compare_t how, gint64 val)
{
query_int64_t pdata = g_new0 (query_int64_def, 1);
pdata->pd.type_name = query_int64_type;
pdata->pd.how = how;
pdata->val = val;
return ((QueryPredData_t)pdata);
}
@ -580,7 +588,7 @@ QueryPredData_t gncQueryInt64Predicate (gint64 val)
/* QUERYCORE_DOUBLE */
static int double_match_predicate (gpointer object, QueryAccess get_fcn,
query_compare_t how, QueryPredData_t pd)
QueryPredData_t pd)
{
double val;
query_double_t pdata = (query_double_t)pd;
@ -589,7 +597,7 @@ static int double_match_predicate (gpointer object, QueryAccess get_fcn,
val = ((query_double_getter)get_fcn) (object);
switch (how) {
switch (pd->how) {
case COMPARE_LT:
return (val < pdata->val);
case COMPARE_LTE:
@ -603,7 +611,7 @@ static int double_match_predicate (gpointer object, QueryAccess get_fcn,
case COMPARE_NEQ:
return (val != pdata->val);
default:
PWARN ("bad match type: %d", how);
PWARN ("bad match type: %d", pd->how);
return 0;
}
}
@ -633,13 +641,14 @@ static QueryPredData_t double_copy_predicate (QueryPredData_t pd)
{
query_double_t pdata = (query_double_t)pd;
VERIFY_PDATA_R (query_double_type);
return gncQueryDoublePredicate (pdata->val);
return gncQueryDoublePredicate (pd->how, pdata->val);
}
QueryPredData_t gncQueryDoublePredicate (double val)
QueryPredData_t gncQueryDoublePredicate (query_compare_t how, double val)
{
query_double_t pdata = g_new0 (query_double_def, 1);
pdata->pd.type_name = query_double_type;
pdata->pd.how = how;
pdata->val = val;
return ((QueryPredData_t)pdata);
}
@ -648,7 +657,7 @@ QueryPredData_t gncQueryDoublePredicate (double val)
/* QUERYCORE_BOOLEAN */
static int boolean_match_predicate (gpointer object, QueryAccess get_fcn,
query_compare_t how, QueryPredData_t pd)
QueryPredData_t pd)
{
gboolean val;
query_boolean_t pdata = (query_boolean_t)pd;
@ -657,13 +666,13 @@ static int boolean_match_predicate (gpointer object, QueryAccess get_fcn,
val = ((query_boolean_getter)get_fcn) (object);
switch (how) {
switch (pd->how) {
case COMPARE_EQUAL:
return (val == pdata->val);
case COMPARE_NEQ:
return (val != pdata->val);
default:
PWARN ("bad match type: %d", how);
PWARN ("bad match type: %d", pd->how);
return 0;
}
}
@ -691,13 +700,17 @@ static QueryPredData_t boolean_copy_predicate (QueryPredData_t pd)
{
query_boolean_t pdata = (query_boolean_t)pd;
VERIFY_PDATA_R (query_boolean_type);
return gncQueryBooleanPredicate (pdata->val);
return gncQueryBooleanPredicate (pd->how, pdata->val);
}
QueryPredData_t gncQueryBooleanPredicate (gboolean val)
QueryPredData_t gncQueryBooleanPredicate (query_compare_t how, gboolean val)
{
query_boolean_t pdata = g_new0 (query_boolean_def, 1);
query_boolean_t pdata;
g_return_val_if_fail (how == COMPARE_EQUAL || how == COMPARE_NEQ, NULL);
pdata = g_new0 (query_boolean_def, 1);
pdata->pd.type_name = query_boolean_type;
pdata->pd.how = how;
pdata->val = val;
return ((QueryPredData_t)pdata);
}
@ -705,7 +718,7 @@ QueryPredData_t gncQueryBooleanPredicate (gboolean val)
/* QUERYCORE_CHAR */
static int char_match_predicate (gpointer object, QueryAccess get_fcn,
query_compare_t how, QueryPredData_t pd)
QueryPredData_t pd)
{
char c;
query_char_t pdata = (query_char_t)pd;
@ -767,7 +780,7 @@ QueryPredData_t gncQueryCharPredicate (char_match_t options, const char *chars)
/* QUERYCORE_KVP */
static int kvp_match_predicate (gpointer object, QueryAccess get_fcn,
query_compare_t how, QueryPredData_t pd)
QueryPredData_t pd)
{
int compare;
kvp_frame *kvp;
@ -789,7 +802,7 @@ static int kvp_match_predicate (gpointer object, QueryAccess get_fcn,
compare = kvp_value_compare (value, pdata->value);
switch (how)
switch (pd->how)
{
case COMPARE_LT:
return (compare < 0);
@ -804,7 +817,7 @@ static int kvp_match_predicate (gpointer object, QueryAccess get_fcn,
case COMPARE_NEQ:
return (compare != 0);
default:
PWARN ("bad match type: %d", how);
PWARN ("bad match type: %d", pd->how);
return 0;
}
}
@ -828,10 +841,11 @@ static QueryPredData_t kvp_copy_predicate (QueryPredData_t pd)
{
query_kvp_t pdata = (query_kvp_t)pd;
VERIFY_PDATA_R (query_kvp_type);
return gncQueryKVPPredicate (pdata->path, pdata->value);
return gncQueryKVPPredicate (pd->how, pdata->path, pdata->value);
}
QueryPredData_t gncQueryKVPPredicate (GSList *path, const kvp_value *value)
QueryPredData_t gncQueryKVPPredicate (query_compare_t how,
GSList *path, const kvp_value *value)
{
query_kvp_t pdata;
GSList *node;
@ -840,6 +854,7 @@ QueryPredData_t gncQueryKVPPredicate (GSList *path, const kvp_value *value)
pdata = g_new0 (query_kvp_def, 1);
pdata->pd.type_name = query_kvp_type;
pdata->pd.how = how;
pdata->value = kvp_value_copy (value);
pdata->path = g_slist_copy (path);
for (node = pdata->path; node; node = node->next)

View File

@ -17,7 +17,8 @@
/* Head of Predicate Data structures. All PData must start like this. */
typedef struct query_pred_data {
const char * type_name;
const char * type_name;
query_compare_t how;
} QueryPredDataDef;
/*
@ -28,7 +29,6 @@ typedef struct query_pred_data {
*/
typedef int (*QueryPredicate) (gpointer object,
QueryAccess get_fcn,
query_compare_t how,
QueryPredData_t pdata);
/* A callback for how to destroy a query predicate's pdata */
@ -73,17 +73,21 @@ QueryPredData_t gncQueryCorePredicateCopy (QueryPredData_t pdata);
void gncQueryCorePredicateFree (QueryPredData_t pdata);
/* Core Data Type Predicates */
QueryPredData_t gncQueryStringPredicate (char *str, string_match_t options,
QueryPredData_t gncQueryStringPredicate (query_compare_t how, char *str,
string_match_t options,
gboolean is_regex);
QueryPredData_t gncQueryDatePredicate (date_match_t options, Timespec date);
QueryPredData_t gncQueryNumericPredicate (numeric_match_t options,
QueryPredData_t gncQueryDatePredicate (query_compare_t how,
date_match_t options, Timespec date);
QueryPredData_t gncQueryNumericPredicate (query_compare_t how,
numeric_match_t options,
gnc_numeric value);
QueryPredData_t gncQueryGUIDPredicate (guid_match_t options, GList *guids);
QueryPredData_t gncQueryInt64Predicate (gint64 val);
QueryPredData_t gncQueryDoublePredicate (double val);
QueryPredData_t gncQueryBooleanPredicate (gboolean val);
QueryPredData_t gncQueryInt64Predicate (query_compare_t how, gint64 val);
QueryPredData_t gncQueryDoublePredicate (query_compare_t how, double val);
QueryPredData_t gncQueryBooleanPredicate (query_compare_t how, gboolean val);
QueryPredData_t gncQueryCharPredicate (char_match_t options,
const char *chars);
QueryPredData_t gncQueryKVPPredicate (GSList *path, const kvp_value *value);
QueryPredData_t gncQueryKVPPredicate (query_compare_t how,
GSList *path, const kvp_value *value);
#endif /* GNC_QUERYCORE_H */

View File

@ -27,7 +27,6 @@ static short module = MOD_QUERY;
typedef struct {
GSList * param_list;
QueryPredData_t pdata;
query_compare_t how;
gboolean invert;
/* These values are filled in during "compilation" of the query
@ -342,7 +341,7 @@ static int check_object (QueryNew *q, gpointer object)
conv_obj = get_fcn (conv_obj);
}
if (((qt->pred_fcn)(conv_obj, get_fcn, qt->how, qt->pdata))
if (((qt->pred_fcn)(conv_obj, get_fcn, qt->pdata))
== qt->invert) {
and_terms_ok = 0;
break;
@ -529,8 +528,7 @@ void gncQueryNewShutdown (void)
}
void gncQueryAddTerm (QueryNew *q, GSList *param_list,
query_compare_t comparitor, QueryPredData_t pred_data,
QueryOp op)
QueryPredData_t pred_data, QueryOp op)
{
QueryNewTerm *qt;
QueryNew *qr, *qs;
@ -540,7 +538,6 @@ void gncQueryAddTerm (QueryNew *q, GSList *param_list,
qt = g_new0 (QueryNewTerm, 1);
qt->param_list = param_list;
qt->pdata = pred_data;
qt->how = comparitor;
qs = gncQueryCreate ();
query_init (qs, qt);
@ -958,7 +955,7 @@ void gncQueryAddGUIDListMatch (QueryNew *q, GSList *param_list,
g_return_if_fail (options == GUID_MATCH_NULL);
pdata = gncQueryGUIDPredicate (options, guid_list);
gncQueryAddTerm (q, param_list, COMPARE_EQUAL, pdata, op);
gncQueryAddTerm (q, param_list, pdata, op);
}
void gncQueryAddGUIDMatch (QueryNew *q, GSList *param_list,

View File

@ -154,8 +154,7 @@ typedef enum {
typedef struct query_pred_data *QueryPredData_t;
void gncQueryAddTerm (QueryNew *query, GSList *param_list,
query_compare_t comparitor, QueryPredData_t pred_data,
QueryOp op);
QueryPredData_t pred_data, QueryOp op);
void gncQuerySetBook (QueryNew *q, GNCBook *book);
void gncQueryAddGUIDMatch (QueryNew *q, GSList *param_list,