mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Add the ability to override the default sort (#150799).
Override the Transaction Number to sort numerically. * lib/libqof/qof/qofclass.h: * lib/libqof/qof/qofquery.c: * lib/libqof/qof/qofquerycore-p.h: * lib/libqof/qof/qofquerycore.[ch]: - Publish the QofCompareFunc prototype. - Add a new QofParam param_compfcn parameter - Change QofQuery to use the param_compfcn over the default type compare function. - create (and publish) a qof API to compare strings as numbers: qof_string_number_compare_func() * src/engine/Transaction.c: Assign TRANS_NUM to use qof_string_numer_compare_func() git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@14903 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
8bf369217a
commit
c7c9199800
15
ChangeLog
15
ChangeLog
@ -4,6 +4,21 @@
|
||||
Implement SubQuery functionality in QOF: qof_query_run_subquery()
|
||||
Now you can run one query off of the results of another query.
|
||||
|
||||
Add the ability to override the default sort (#150799).
|
||||
Override the Transaction Number to sort numerically.
|
||||
* lib/libqof/qof/qofclass.h:
|
||||
* lib/libqof/qof/qofquery.c:
|
||||
* lib/libqof/qof/qofquerycore-p.h:
|
||||
* lib/libqof/qof/qofquerycore.[ch]:
|
||||
- Publish the QofCompareFunc prototype.
|
||||
- Add a new QofParam param_compfcn parameter
|
||||
- Change QofQuery to use the param_compfcn over the
|
||||
default type compare function.
|
||||
- create (and publish) a qof API to compare strings
|
||||
as numbers: qof_string_number_compare_func()
|
||||
* src/engine/Transaction.c:
|
||||
Assign TRANS_NUM to use qof_string_numer_compare_func()
|
||||
|
||||
2006-09-23 Derek Atkins <derek@ihtfp.com>
|
||||
|
||||
* src/ledger-core/split-register*.c:
|
||||
|
@ -151,6 +151,14 @@ typedef gpointer (*QofAccessFunc)(gpointer object, const QofParam *param);
|
||||
*/
|
||||
typedef void (*QofSetterFunc) (gpointer, gpointer);
|
||||
|
||||
/* A callback for how to compare two (same-type) objects based on a
|
||||
* common getter (parameter member), using the provided comparison
|
||||
* options (which are the type-specific options).
|
||||
*/
|
||||
typedef gint (*QofCompareFunc) (gpointer a, gpointer b,
|
||||
gint compare_options,
|
||||
QofParam *getter);
|
||||
|
||||
/** This structure is for each queriable parameter in an object
|
||||
*
|
||||
* -- param_name is the name of the parameter.
|
||||
@ -174,6 +182,7 @@ struct _QofParam
|
||||
QofType param_type;
|
||||
QofAccessFunc param_getfcn;
|
||||
QofSetterFunc param_setfcn;
|
||||
QofCompareFunc param_compfcn;
|
||||
gpointer param_userdata;
|
||||
};
|
||||
|
||||
|
@ -473,13 +473,17 @@ compile_sort (QofQuerySort *sort, QofIdType obj)
|
||||
*/
|
||||
if (sort->param_fcns)
|
||||
{
|
||||
sort->comp_fcn = qof_query_core_get_compare (resObj->param_type);
|
||||
/* First, check if this parameter has a sort function override.
|
||||
* if not then check if there's a global compare function for the type
|
||||
*/
|
||||
if (resObj->param_compfcn)
|
||||
sort->comp_fcn = resObj->param_compfcn;
|
||||
else
|
||||
sort->comp_fcn = qof_query_core_get_compare (resObj->param_type);
|
||||
|
||||
/* Hrm, perhaps this is an object compare, not a core compare? */
|
||||
/* Next, perhaps this is an object compare, not a core type compare? */
|
||||
if (sort->comp_fcn == NULL)
|
||||
{
|
||||
sort->obj_cmp = qof_class_get_default_sort (resObj->param_type);
|
||||
}
|
||||
}
|
||||
else if (!safe_strcmp (sort->param_list->data, QUERY_DEFAULT_SORT))
|
||||
{
|
||||
|
@ -45,14 +45,6 @@ typedef gint (*QofQueryPredicateFunc) (gpointer object,
|
||||
QofParam *getter,
|
||||
QofQueryPredData *pdata);
|
||||
|
||||
/* A callback for how to compare two (same-type) objects based on a
|
||||
* common getter (parameter member), using the provided comparison
|
||||
* options (which are the type-specific options).
|
||||
*/
|
||||
typedef gint (*QofCompareFunc) (gpointer a, gpointer b,
|
||||
gint compare_options,
|
||||
QofParam *getter);
|
||||
|
||||
/* Lookup functions */
|
||||
QofQueryPredicateFunc qof_query_core_get_predicate (gchar const *type);
|
||||
QofCompareFunc qof_query_core_get_compare (gchar const *type);
|
||||
|
@ -182,6 +182,36 @@ string_compare_func (gpointer a, gpointer b, gint options,
|
||||
return safe_strcmp (s1, s2);
|
||||
}
|
||||
|
||||
int
|
||||
qof_string_number_compare_func (gpointer a, gpointer b, gint options,
|
||||
QofParam *getter)
|
||||
{
|
||||
const char *s1, *s2;
|
||||
char *sr1, *sr2;
|
||||
long i1, i2;
|
||||
g_return_val_if_fail (a && b && getter &&getter->param_getfcn, COMPARE_ERROR);
|
||||
|
||||
s1 = ((query_string_getter)getter->param_getfcn) (a, getter);
|
||||
s2 = ((query_string_getter)getter->param_getfcn) (b, getter);
|
||||
|
||||
// Deal with NULL strings
|
||||
if (s1 == s2) return 0;
|
||||
if (!s1 && s2) return -1;
|
||||
if (s1 && !s2) return 1;
|
||||
|
||||
// Convert to integers and test
|
||||
i1 = strtol(s1, &sr1, 0);
|
||||
i2 = strtol(s2, &sr2, 0);
|
||||
if (i1 < i2) return -1;
|
||||
if (i1 > i2) return 1;
|
||||
|
||||
// If the integers match, then test the REST of the string as text.
|
||||
if (options == QOF_STRING_MATCH_CASEINSENSITIVE)
|
||||
return safe_strcasecmp (sr1, sr2);
|
||||
|
||||
return safe_strcmp (sr1, sr2);
|
||||
}
|
||||
|
||||
static void
|
||||
string_free_pdata (QofQueryPredData *pd)
|
||||
{
|
||||
|
@ -187,6 +187,14 @@ gboolean qof_query_date_predicate_get_date (QofQueryPredData *pd, Timespec *date
|
||||
*/
|
||||
char * qof_query_core_to_string (QofType, gpointer object, QofParam *getter);
|
||||
|
||||
/** Compare two parameter(strings) as if they are numbers!
|
||||
* the two objects, a and b, are the objects being compared
|
||||
* this_param is the QofParam for this parameter in the objects
|
||||
*/
|
||||
int qof_string_number_compare_func (gpointer a, gpointer b, gint options,
|
||||
QofParam *this_param);
|
||||
|
||||
|
||||
#endif /* QOF_QUERYCORE_H */
|
||||
/* @} */
|
||||
/* @} */
|
||||
|
@ -1968,7 +1968,8 @@ gboolean xaccTransRegister (void)
|
||||
static QofParam params[] = {
|
||||
{ TRANS_NUM, QOF_TYPE_STRING,
|
||||
(QofAccessFunc)xaccTransGetNum,
|
||||
(QofSetterFunc)qofTransSetNum },
|
||||
(QofSetterFunc)qofTransSetNum,
|
||||
qof_string_number_compare_func },
|
||||
{ TRANS_DESCRIPTION, QOF_TYPE_STRING,
|
||||
(QofAccessFunc)xaccTransGetDescription,
|
||||
(QofSetterFunc)qofTransSetDescription },
|
||||
|
Loading…
Reference in New Issue
Block a user