mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
add more query types
git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@4383 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
8db5592caa
commit
e72e81b69e
@ -81,7 +81,8 @@ sql_Query_destroy (sqlQuery *sq)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* =========================================================== */
|
/* =========================================================== */
|
||||||
/* Note that postgres supports both case-sensitive and
|
/* Macro for PD_STRING query types
|
||||||
|
* Note that postgres supports both case-sensitive and
|
||||||
* case-insensitve string searches, and it also supports
|
* case-insensitve string searches, and it also supports
|
||||||
* regex! yahooo!
|
* regex! yahooo!
|
||||||
*/
|
*/
|
||||||
@ -108,6 +109,55 @@ sql_Query_destroy (sqlQuery *sq)
|
|||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* =========================================================== */
|
||||||
|
/* Macro for PD_AMOUNT type terms. The logic used here in the
|
||||||
|
* SQL exactly matches that used in the Query.c code. If
|
||||||
|
* that code is incorrect or has changed, then the code below is
|
||||||
|
* broken as well.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define AMOUNT_TERM(fieldname) \
|
||||||
|
{ \
|
||||||
|
if (0 == pd->amount.sense) \
|
||||||
|
{ \
|
||||||
|
sq->pq = stpcpy (sq->pq, "NOT ("); \
|
||||||
|
} \
|
||||||
|
switch(pd->amount.amt_sgn) \
|
||||||
|
{ \
|
||||||
|
case AMT_SGN_MATCH_CREDIT: \
|
||||||
|
sq->pq = stpcpy(sq->pq, fieldname " <= 0 AND "); \
|
||||||
|
break; \
|
||||||
|
case AMT_SGN_MATCH_DEBIT: \
|
||||||
|
sq->pq = stpcpy(sq->pq, fieldname " >= 0 AND "); \
|
||||||
|
break; \
|
||||||
|
default: \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
switch(pd->amount.how) \
|
||||||
|
{ \
|
||||||
|
case AMT_MATCH_ATLEAST: \
|
||||||
|
sq->pq = stpcpy(sq->pq, \
|
||||||
|
"abs(" fieldname ") >= gncCommodity.fraction * float8"); \
|
||||||
|
sq->pq += sprintf (sq->pq, "(%22.18g)", pd->amount.amount); \
|
||||||
|
break; \
|
||||||
|
case AMT_MATCH_ATMOST: \
|
||||||
|
sq->pq = stpcpy(sq->pq, \
|
||||||
|
"abs(" fieldname ") <= gncCommodity.fraction * float8"); \
|
||||||
|
sq->pq += sprintf (sq->pq, "(%22.18g)", pd->amount.amount); \
|
||||||
|
break; \
|
||||||
|
case AMT_MATCH_EXACTLY: \
|
||||||
|
sq->pq = stpcpy(sq->pq, \
|
||||||
|
"abs(abs(" fieldname ") - gncCommodity.fraction * float8"); \
|
||||||
|
sq->pq += sprintf (sq->pq, "(%22.18g)", pd->amount.amount); \
|
||||||
|
sq->pq = stpcpy(sq->pq, ") < 1"); \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
if (0 == pd->amount.sense) \
|
||||||
|
{ \
|
||||||
|
sq->pq = stpcpy (sq->pq, ") "); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
/* =========================================================== */
|
/* =========================================================== */
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
@ -125,7 +175,8 @@ sqlQuery_build (sqlQuery*sq, Query *q)
|
|||||||
/* reset the buffer pointers */
|
/* reset the buffer pointers */
|
||||||
sq->pq = sq->q_base;
|
sq->pq = sq->q_base;
|
||||||
sq->pq = stpcpy(sq->pq,
|
sq->pq = stpcpy(sq->pq,
|
||||||
"SELECT gncEntry.transGuid FROM gncEntry, gncTransaction "
|
"SELECT gncEntry.transGuid "
|
||||||
|
" FROM gncEntry, gncTransaction, gncAccount, gncCommodity "
|
||||||
" WHERE gncEntry.transGuid = gncTransaction.transGuid AND ( ");
|
" WHERE gncEntry.transGuid = gncTransaction.transGuid AND ( ");
|
||||||
|
|
||||||
qterms = xaccQueryGetTerms (q);
|
qterms = xaccQueryGetTerms (q);
|
||||||
@ -192,7 +243,9 @@ sqlQuery_build (sqlQuery*sq, Query *q)
|
|||||||
case PR_AMOUNT:
|
case PR_AMOUNT:
|
||||||
{
|
{
|
||||||
PINFO("term is PR_AMOUNT");
|
PINFO("term is PR_AMOUNT");
|
||||||
PERR ("not implemented");
|
sq->pq = stpcpy(sq->pq,
|
||||||
|
"gncTransaction.currency = gncCommodity.commodity AND ");
|
||||||
|
AMOUNT_TERM ("gncEntry.value");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -259,18 +312,61 @@ sqlQuery_build (sqlQuery*sq, Query *q)
|
|||||||
STRING_TERM ("gncTransaction.num");
|
STRING_TERM ("gncTransaction.num");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PR_PRICE:
|
case PR_PRICE: {
|
||||||
PINFO("term is PR_PRICE");
|
PINFO("term is PR_PRICE");
|
||||||
PERR ("not implemented");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PR_SHRS:
|
if (0 == pd->amount.sense)
|
||||||
PINFO("term is PR_SHRS");
|
{
|
||||||
PERR ("not implemented");
|
sq->pq = stpcpy (sq->pq, "NOT (");
|
||||||
|
}
|
||||||
|
switch(pd->amount.amt_sgn)
|
||||||
|
{
|
||||||
|
case AMT_SGN_MATCH_CREDIT:
|
||||||
|
sq->pq = stpcpy(sq->pq, "gncEntry.value / gncEntry.amount <= 0 AND ");
|
||||||
|
break;
|
||||||
|
case AMT_SGN_MATCH_DEBIT:
|
||||||
|
sq->pq = stpcpy(sq->pq, "gncEntry.value / gncEntry.amount >= 0 AND ");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch(pd->amount.how)
|
||||||
|
{
|
||||||
|
case AMT_MATCH_ATLEAST:
|
||||||
|
sq->pq = stpcpy(sq->pq,
|
||||||
|
"gncHelperPrVal(gncEntry) >= gncHelperPrAmt(gncEntry) * float8");
|
||||||
|
sq->pq += sprintf (sq->pq, "(%22.18g)", pd->amount.amount);
|
||||||
|
break;
|
||||||
|
case AMT_MATCH_ATMOST:
|
||||||
|
sq->pq = stpcpy(sq->pq,
|
||||||
|
"gncHelperPrVal(gncEntry) <= gncHelperPrAmt(gncEntry) * float8");
|
||||||
|
sq->pq += sprintf (sq->pq, "(%22.18g)", pd->amount.amount);
|
||||||
|
break;
|
||||||
|
case AMT_MATCH_EXACTLY:
|
||||||
|
sq->pq = stpcpy(sq->pq,
|
||||||
|
"abs(gncHelperPrVal(gncEntry) - gncHelperPrAmt(gncEntry) * float8");
|
||||||
|
sq->pq += sprintf (sq->pq, "(%22.18g)", pd->amount.amount);
|
||||||
|
sq->pq = stpcpy(sq->pq, ") < 1");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (0 == pd->amount.sense)
|
||||||
|
{
|
||||||
|
sq->pq = stpcpy (sq->pq, ") ");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case PR_SHRS: {
|
||||||
|
PINFO("term is PR_SHRS");
|
||||||
|
sq->pq = stpcpy(sq->pq,
|
||||||
|
"gncEntry.accountGuid = gncAccount.accountGuid AND "
|
||||||
|
"gncAccount.commodity = gncCommodity.commodity AND ");
|
||||||
|
AMOUNT_TERM ("gncEntry.amount");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
PERR ("unkown query term type");
|
PERR ("unkown query term type %d", pd->base.term_type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user