more query xml work

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@3407 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Linas Vepstas
2001-01-08 01:26:56 +00:00
parent cd39a539b8
commit 003419381c
4 changed files with 188 additions and 105 deletions

View File

@@ -87,9 +87,9 @@ static int xaccBalanceMatchPredicate(Split * s, PredicateData * pd);
/********************************************************************
********************************************************************/
#if 0
static void
print_query(Query * q) {
void
xaccQueryPrint(Query * q)
{
GList * aterms;
GList * i, * j;
QueryTerm * qt;
@@ -110,7 +110,6 @@ print_query(Query * q) {
}
printf("\n");
}
#endif
/********************************************************************
@@ -1051,6 +1050,69 @@ xaccQueryGetSplits(Query * q) {
}
/********************************************************************
* xaccQueryAddPredicate
* Add a predicate an existing query.
********************************************************************/
/* hack alert -- this is atemproray API */
void
xaccQueryAddPredicate (Query * q,
int snes,
PredicateData *pred,
QueryOp op)
{
Query * qs = xaccMallocQuery();
QueryTerm * qt = g_new0(QueryTerm, 1);
Query * qr;
qt->sense = snes;
qt->data = *pred;
/* hack alert this switch stement is clearly wrong !!!!! */
switch (pred->type) {
case PD_DATE:
qt->p = & xaccDateMatchPredicate;
break;
case PD_AMOUNT:
qt->p = & xaccAmountMatchPredicate;
qt->p = & xaccSharePriceMatchPredicate;
qt->p = & xaccSharesMatchPredicate;
break;
case PD_ACCOUNT:
qt->p = & xaccAccountMatchPredicate;
break;
case PD_STRING:
qt->p = & xaccDescriptionMatchPredicate;
qt->p = & xaccMemoMatchPredicate;
qt->p = & xaccNumberMatchPredicate;
qt->p = & xaccActionMatchPredicate;
break;
case PD_CLEARED:
qt->p = & xaccClearedMatchPredicate;
break;
case PD_BALANCE:
qt->p = & xaccBalanceMatchPredicate;
break;
case PD_MISC:
break;
}
xaccInitQuery(qs, qt);
xaccQuerySetGroup(qs, q->acct_group);
if(xaccQueryHasTerms(q)) {
qr = xaccQueryMerge(q, qs, op);
}
else {
qr = xaccQueryMerge(q, qs, QUERY_OR);
}
xaccQuerySwapTerms(q, qr);
xaccFreeQuery(qs);
xaccFreeQuery(qr);
}
/********************************************************************
* xaccQueryAddAccountMatch
* Add an account filter to an existing query.
@@ -1225,42 +1287,6 @@ xaccQueryAddMemoMatch(Query * q, const char * matchstring,
}
/********************************************************************
* xaccQueryAddDateMatch
* Add a date filter to an existing query.
********************************************************************/
void
xaccQueryAddDateMatch(Query * q,
int use_start, int sday, int smonth, int syear,
int use_end, int eday, int emonth, int eyear,
QueryOp op) {
Query * qs = xaccMallocQuery();
QueryTerm * qt = g_new0(QueryTerm, 1);
Query * qr;
qt->p = & xaccDateMatchPredicate;
qt->sense = 1;
qt->data.type = PD_DATE;
qt->data.date.use_start = use_start;
qt->data.date.start = gnc_dmy2timespec(sday, smonth, syear);
qt->data.date.use_end = use_end;
qt->data.date.end = gnc_dmy2timespec_end(eday, emonth, eyear);
xaccInitQuery(qs, qt);
xaccQuerySetGroup(qs, q->acct_group);
if(xaccQueryHasTerms(q)) {
qr = xaccQueryMerge(q, qs, op);
}
else {
qr = xaccQueryMerge(q, qs, QUERY_OR);
}
xaccQuerySwapTerms(q, qr);
xaccFreeQuery(qs);
xaccFreeQuery(qr);
}
/********************************************************************
* xaccQueryAddDateMatchTS
* Add a date filter to an existing query.
@@ -1299,6 +1325,25 @@ xaccQueryAddDateMatchTS(Query * q,
xaccFreeQuery(qr);
}
/********************************************************************
* xaccQueryAddDateMatch
* Add a date filter to an existing query.
********************************************************************/
void
xaccQueryAddDateMatch(Query * q,
int use_start, int sday, int smonth, int syear,
int use_end, int eday, int emonth, int eyear,
QueryOp op)
{
/* gcc -O3 will auto-inline this function, avoiding a call overhead */
xaccQueryAddDateMatchTS (q, use_start,
gnc_dmy2timespec(sday, smonth, syear),
use_end,
gnc_dmy2timespec_end(eday, emonth, eyear),
op);
}
/********************************************************************
* xaccQueryAddDateMatchTT
* Add a date filter to an existing query.
@@ -1310,10 +1355,8 @@ xaccQueryAddDateMatchTT(Query * q,
time_t stt,
int use_end,
time_t ett,
QueryOp op) {
Query * qs = xaccMallocQuery();
QueryTerm * qt = g_new0(QueryTerm, 1);
Query * qr;
QueryOp op)
{
Timespec sts;
Timespec ets;
@@ -1322,27 +1365,11 @@ xaccQueryAddDateMatchTT(Query * q,
ets.tv_sec = (long long)ett;
ets.tv_nsec = 0;
/* gcc -O3 will auto-inline this function, avoiding a call overhead */
xaccQueryAddDateMatchTS (q, use_start, sts,
use_end, ets, op);
qt->p = & xaccDateMatchPredicate;
qt->sense = 1;
qt->data.type = PD_DATE;
qt->data.date.use_start = use_start;
qt->data.date.use_end = use_end;
qt->data.date.start = sts;
qt->data.date.end = ets;
xaccInitQuery(qs, qt);
xaccQuerySetGroup(qs, q->acct_group);
if(xaccQueryHasTerms(q)) {
qr = xaccQueryMerge(q, qs, op);
}
else {
qr = xaccQueryMerge(q, qs, QUERY_OR);
}
xaccQuerySwapTerms(q, qr);
xaccFreeQuery(qr);
xaccFreeQuery(qs);
}
/********************************************************************

View File

@@ -186,6 +186,9 @@ GList * xaccQueryGetTerms(Query * q);
GList * xaccQueryGetSplits(Query * q);
/* handy for debugging */
void xaccQueryPrint(Query *q);
/*******************************************************************
* match-adding API
*******************************************************************/
@@ -209,8 +212,8 @@ void DxaccQueryAddSharePriceMatch(Query * q, double amount,
void DxaccQueryAddSharesMatch(Query * q, double amount,
amt_match_t how, QueryOp op);
void xaccQueryAddDateMatch(Query * q,
int use_start, int syear, int smonth, int sday,
int use_end, int eyear, int emonth, int eday,
int use_start, int sday, int smonth, int syear,
int use_end, int eday, int emonth, int eyear,
QueryOp op);
void xaccQueryAddDateMatchTS(Query * q,
int use_start, Timespec sts,
@@ -227,6 +230,9 @@ void xaccQueryAddBalanceMatch(Query * q, balance_match_t how, QueryOp op);
void xaccQueryAddMiscMatch(Query * q, Predicate p, int how, int data,
QueryOp op);
void xaccQueryAddPredicate (Query * q, int sense, PredicateData *pred,
QueryOp op);
/*******************************************************************
* sort-related functions

View File

@@ -3920,8 +3920,17 @@ START_HANDLER(query_server)
END_HANDLER(query_server)
{
Query *q = (Query *) data_for_children;
printf ("server duuuude its %p\n", q);
Query *q;
sixtp_child_result *cr;
g_return_val_if_fail(data_from_children, FALSE);
cr = (sixtp_child_result *) data_from_children->data;
g_return_val_if_fail(cr, FALSE);
q = (Query *) (cr->data);
g_return_val_if_fail(q, FALSE);
*result = q;
return(TRUE);
}
@@ -3954,14 +3963,21 @@ START_HANDLER(query)
END_HANDLER(query)
{
Query *q = (Query *) data_for_children;
printf ("query duuuude its %p\n", q);
Query *q;
sixtp_child_result *cr;
g_return_val_if_fail(data_from_children, FALSE);
cr = (sixtp_child_result *) data_from_children->data;
g_return_val_if_fail(cr, FALSE);
q = (Query *) (cr->data);
g_return_val_if_fail(q, FALSE);
*result = q;
return(TRUE);
}
/* ================================================================= */
/* <restore> (lineage <query> <query-server>)
@@ -3995,8 +4011,7 @@ START_HANDLER(query_restore)
END_HANDLER(query_restore)
{
Query *q = (Query *) result;
printf ("query restore duuuude its %p\n", q);
Query *q = (Query *) data_for_children;
g_return_val_if_fail(q, FALSE);
*result = q;
return(TRUE);
@@ -4024,14 +4039,43 @@ AFTER_CHILD(query_restore)
}
/* ================================================================= */
/* <datepred> (lineage <restore> <query> <query-server>)
#define CVT_INT(to) { \
gint32 val; \
gboolean ok; \
gchar *txt = NULL; \
\
txt = concatenate_child_result_chars(data_from_children); \
g_return_val_if_fail(txt, FALSE); \
\
ok = (gboolean) string_to_gint32(txt, &val); \
g_free(txt); \
g_return_val_if_fail(ok, FALSE); \
(to) = val; \
}
#define CVT_DATE(to) { \
TimespecParseInfo *info = (TimespecParseInfo *) data_for_children; \
\
g_return_val_if_fail(info, FALSE); \
if(!timespec_parse_ok(info)) { \
g_free(info); \
return(FALSE); \
} \
\
to = info->ts; \
g_free(info); \
}
/* ================================================================= */
/* <datepred> (lineage <and-terms> <restore> <query> <query-server>)
Restores a given date predicate.
from parent: Query*
for children: NA
result: NA
-----------
start: ??
start: malloc a date predicate
chars: allow and ignore only whitespace.
end: AddDateMatch to Query
cleanup-result: NA
@@ -4043,22 +4087,23 @@ AFTER_CHILD(query_restore)
START_HANDLER(qrestore_datepred)
{
// Split *s = xaccMallocSplit();
// g_return_val_if_fail(s, FALSE);
// *data_for_children = s;
DatePredicateData *dp = g_new (DatePredicateData, 1);
g_return_val_if_fail(dp, FALSE);
bzero (dp, sizeof (DatePredicateData));
dp->type = PD_DATE;
*data_for_children = dp;
return(TRUE);
}
END_HANDLER(qrestore_datepred)
{
Query *q = (Query *) parent_data;
PredicateData *dp = (PredicateData *) data_for_children;
g_return_val_if_fail(q, FALSE);
g_return_val_if_fail(dp, FALSE);
#if 0
Split *s = (Split *) data_for_children;
g_return_val_if_fail(s, FALSE);
#endif
xaccQueryAddPredicate (q, 1, dp, QUERY_OR);
return(TRUE);
}
@@ -4090,10 +4135,11 @@ AFTER_CHILD(qrestore_datepred)
FAIL_HANDLER(qrestore_datepred)
{
g_free (data_for_children);
}
/* ================================================================= */
/* <end-date> (lineage <date-pred> <restore> <query>)
/* <end-date> (lineage <date-pred> <and-terms> <restore> <query>)
restores a given query's end-date.
Just uses a generic_timespec parser, but with our own end handler.
end: set end-date.
@@ -4101,38 +4147,36 @@ FAIL_HANDLER(qrestore_datepred)
END_HANDLER(datepred_use_start)
{
DatePredicateData *dp = (DatePredicateData *) parent_data;
CVT_INT(dp->use_start);
return(TRUE);
}
END_HANDLER(datepred_use_end)
{
DatePredicateData *dp = (DatePredicateData *) parent_data;
CVT_INT(dp->use_end);
return(TRUE);
}
END_HANDLER(datepred_start_date)
{
DatePredicateData *dp = (DatePredicateData *) parent_data;
CVT_DATE (dp->start);
return(TRUE);
}
END_HANDLER(datepred_end_date)
{
// Split *s = (Split *) parent_data;
TimespecParseInfo *info = (TimespecParseInfo *) data_for_children;
g_return_val_if_fail(info, FALSE);
if(!timespec_parse_ok(info)) {
g_free(info);
return(FALSE);
}
// xaccSplitSetDateReconciledTS(s, &(info->ts));
g_free(info);
DatePredicateData *dp = (DatePredicateData *) parent_data;
CVT_DATE (dp->end);
return(TRUE);
}
END_HANDLER(generic_pred_sense)
{
DatePredicateData *dp = (DatePredicateData *) parent_data;
// CVT_INT(dp->sense);
return(TRUE);
}

View File

@@ -886,11 +886,11 @@ xml_add_qterm_restorer(xmlNodePtr qxml, QueryTerm *qt)
xml_add_gint32(p, "use-end", qt->data.date.use_end);
if (qt->data.date.use_start) {
xml_add_editable_timespec(p, "start-date",
&qt->data.date.start, FALSE);
&(qt->data.date.start), FALSE);
}
if (qt->data.date.use_end) {
xml_add_editable_timespec(p, "end-date",
&qt->data.date.end, FALSE);
&(qt->data.date.end), FALSE);
}
break;
@@ -943,14 +943,14 @@ xml_add_qterm_restorer(xmlNodePtr qxml, QueryTerm *qt)
static gboolean
xml_add_query_restorers(xmlNodePtr p, Query *q)
{
xmlNodePtr qxml, restore_xml;
GList *list;
GList *node;
xmlNodePtr qxml, restore_xml, and_xml;
GList *aterms, *oterms;
GList *anode, *onode;
g_return_val_if_fail(p, FALSE);
g_return_val_if_fail(q, FALSE);
list = xaccQueryGetTerms (q);
oterms = xaccQueryGetTerms (q);
/* write the nested <query> <restore> */
qxml = xmlNewTextChild(p, NULL, "query", NULL);
@@ -959,9 +959,15 @@ xml_add_query_restorers(xmlNodePtr p, Query *q)
restore_xml = xmlNewTextChild(qxml, NULL, "restore", NULL);
g_return_val_if_fail(restore_xml, FALSE);
for (node = list; node; node = node->next) {
QueryTerm *qt = node->data;
xml_add_qterm_restorer(restore_xml, qt);
for (onode = oterms; onode; onode = onode->next) {
aterms = onode->data;
and_xml = xmlNewTextChild(restore_xml, NULL, "and-terms", NULL);
g_return_val_if_fail(and_xml, FALSE);
for (anode = aterms; anode; anode = anode->next) {
QueryTerm *qt = anode->data;
xml_add_qterm_restorer(and_xml, qt);
}
}
return(TRUE);
}