Refactor make_trans_query into engine test-core.

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@5775 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Dave Peticolas 2001-11-06 10:22:42 +00:00
parent a6d324ed3b
commit f82f95a0a2
3 changed files with 118 additions and 117 deletions

View File

@ -1476,3 +1476,120 @@ make_random_changes_to_session (GNCSession *session)
make_random_changes_to_book (session, gnc_session_get_book (session));
}
typedef struct
{
kvp_match_where_t where;
GSList *path;
Query *q;
} KVPQueryData;
static void
add_kvp_value_query (const char *key, kvp_value *value, gpointer data)
{
KVPQueryData *kqd = data;
GSList *node;
kqd->path = g_slist_append (kqd->path, (gpointer) key);
if (kvp_value_get_type (value) == KVP_TYPE_FRAME)
kvp_frame_for_each_slot (kvp_value_get_frame (value),
add_kvp_value_query, data);
else
xaccQueryAddKVPMatch (kqd->q, kqd->path, value,
KVP_MATCH_EQ, kqd->where,
QUERY_AND);
node = g_slist_last (kqd->path);
kqd->path = g_slist_remove_link (kqd->path, node);
g_slist_free_1 (node);
}
static void
add_kvp_query (Query *q, kvp_frame *frame, kvp_match_where_t where)
{
KVPQueryData kqd;
kqd.where = where;
kqd.path = NULL;
kqd.q = q;
kvp_frame_for_each_slot (frame, add_kvp_value_query, &kqd);
}
Query *
make_trans_query (Transaction *trans)
{
Account *a;
double d;
Query *q;
Split *s;
q = xaccMallocQuery ();
s = xaccTransGetSplit (trans, 0);
a = xaccSplitGetAccount (s);
xaccQueryAddSingleAccountMatch (q, xaccSplitGetAccount (s), QUERY_AND);
xaccQueryAddDescriptionMatch (q, xaccTransGetDescription (trans),
TRUE, FALSE, QUERY_AND);
xaccQueryAddNumberMatch (q, xaccTransGetNum (trans), TRUE, FALSE, QUERY_AND);
xaccQueryAddActionMatch (q, xaccSplitGetAction (s), TRUE, FALSE, QUERY_AND);
d = gnc_numeric_to_double (xaccSplitGetValue (s));
DxaccQueryAddAmountMatch (q, d, AMT_SGN_MATCH_EITHER,
AMT_MATCH_EXACTLY, QUERY_AND);
d = gnc_numeric_to_double (xaccSplitGetSharePrice (s));
DxaccQueryAddSharePriceMatch (q, d, AMT_MATCH_EXACTLY, QUERY_AND);
d = gnc_numeric_to_double (xaccSplitGetAmount (s));
DxaccQueryAddSharesMatch (q, d, AMT_MATCH_EXACTLY, QUERY_AND);
{
Timespec ts;
xaccTransGetDatePostedTS (trans, &ts);
xaccQueryAddDateMatchTS (q, TRUE, ts, TRUE, ts, QUERY_AND);
}
xaccQueryAddMemoMatch (q, xaccSplitGetMemo (s), TRUE, FALSE, QUERY_AND);
{
cleared_match_t how;
switch (xaccSplitGetReconcile (s))
{
case NREC:
how = CLEARED_NO;
break;
case CREC:
how = CLEARED_CLEARED;
break;
case YREC:
how = CLEARED_RECONCILED;
break;
case FREC:
how = CLEARED_FROZEN;
break;
case VREC:
how = CLEARED_VOIDED;
break;
default:
failure ("bad reconcile flag");
xaccFreeQuery (q);
return NULL;
}
xaccQueryAddClearedMatch (q, how, QUERY_AND);
}
add_kvp_query (q, xaccSplitGetSlots (s), KVP_MATCH_SPLIT);
add_kvp_query (q, xaccTransGetSlots (trans), KVP_MATCH_TRANS);
add_kvp_query (q, xaccAccountGetSlots (a), KVP_MATCH_ACCOUNT);
return q;
}

View File

@ -52,6 +52,7 @@ gnc_commodity* get_random_commodity(GNCSession *session);
const char *get_random_commodity_namespace(void);
Query* get_random_query(void);
Query * make_trans_query (Transaction *trans);
GNCBook * get_random_book (GNCSession *session);
GNCSession * get_random_session (void);

View File

@ -10,123 +10,6 @@
#include "test-engine-stuff.h"
#include "test-stuff.h"
typedef struct
{
kvp_match_where_t where;
GSList *path;
Query *q;
} KVPQueryData;
static void
add_kvp_value_query (const char *key, kvp_value *value, gpointer data)
{
KVPQueryData *kqd = data;
GSList *node;
kqd->path = g_slist_append (kqd->path, (gpointer) key);
if (kvp_value_get_type (value) == KVP_TYPE_FRAME)
kvp_frame_for_each_slot (kvp_value_get_frame (value),
add_kvp_value_query, data);
else
xaccQueryAddKVPMatch (kqd->q, kqd->path, value,
KVP_MATCH_EQ, kqd->where,
QUERY_AND);
node = g_slist_last (kqd->path);
kqd->path = g_slist_remove_link (kqd->path, node);
g_slist_free_1 (node);
}
static void
add_kvp_query (Query *q, kvp_frame *frame, kvp_match_where_t where)
{
KVPQueryData kqd;
kqd.where = where;
kqd.path = NULL;
kqd.q = q;
kvp_frame_for_each_slot (frame, add_kvp_value_query, &kqd);
}
static Query *
make_trans_query (Transaction *trans)
{
Account *a;
double d;
Query *q;
Split *s;
q = xaccMallocQuery ();
s = xaccTransGetSplit (trans, 0);
a = xaccSplitGetAccount (s);
xaccQueryAddSingleAccountMatch (q, xaccSplitGetAccount (s), QUERY_AND);
xaccQueryAddDescriptionMatch (q, xaccTransGetDescription (trans),
TRUE, FALSE, QUERY_AND);
xaccQueryAddNumberMatch (q, xaccTransGetNum (trans), TRUE, FALSE, QUERY_AND);
xaccQueryAddActionMatch (q, xaccSplitGetAction (s), TRUE, FALSE, QUERY_AND);
d = gnc_numeric_to_double (xaccSplitGetValue (s));
DxaccQueryAddAmountMatch (q, d, AMT_SGN_MATCH_EITHER,
AMT_MATCH_EXACTLY, QUERY_AND);
d = gnc_numeric_to_double (xaccSplitGetSharePrice (s));
DxaccQueryAddSharePriceMatch (q, d, AMT_MATCH_EXACTLY, QUERY_AND);
d = gnc_numeric_to_double (xaccSplitGetAmount (s));
DxaccQueryAddSharesMatch (q, d, AMT_MATCH_EXACTLY, QUERY_AND);
{
Timespec ts;
xaccTransGetDatePostedTS (trans, &ts);
xaccQueryAddDateMatchTS (q, TRUE, ts, TRUE, ts, QUERY_AND);
}
xaccQueryAddMemoMatch (q, xaccSplitGetMemo (s), TRUE, FALSE, QUERY_AND);
{
cleared_match_t how;
switch (xaccSplitGetReconcile (s))
{
case NREC:
how = CLEARED_NO;
break;
case CREC:
how = CLEARED_CLEARED;
break;
case YREC:
how = CLEARED_RECONCILED;
break;
case FREC:
how = CLEARED_FROZEN;
break;
case VREC:
how = CLEARED_VOIDED;
break;
default:
failure ("bad reconcile flag");
xaccFreeQuery (q);
return NULL;
}
xaccQueryAddClearedMatch (q, how, QUERY_AND);
}
add_kvp_query (q, xaccSplitGetSlots (s), KVP_MATCH_SPLIT);
add_kvp_query (q, xaccTransGetSlots (trans), KVP_MATCH_TRANS);
add_kvp_query (q, xaccAccountGetSlots (a), KVP_MATCH_ACCOUNT);
return q;
}
static gboolean
test_trans_query (Transaction *trans, gpointer data)
{