[gom] filter: Add IS NULL and IS NOT NULL filters
- From: Alexander Larsson <alexl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gom] filter: Add IS NULL and IS NOT NULL filters
- Date: Fri, 10 Apr 2015 13:12:14 +0000 (UTC)
commit bcee8b7b67ffb387c24c50def35de54dea33b2f6
Author: Alexander Larsson <alexl redhat com>
Date: Fri Apr 10 14:44:17 2015 +0200
filter: Add IS NULL and IS NOT NULL filters
https://bugzilla.gnome.org/show_bug.cgi?id=747618
gom/gom-filter.c | 48 +++++++++++++++++++++++++++---
gom/gom-filter.h | 86 +++++++++++++++++++++++++++++-------------------------
2 files changed, 89 insertions(+), 45 deletions(-)
---
diff --git a/gom/gom-filter.c b/gom/gom-filter.c
index 8db1a0e..8143339 100644
--- a/gom/gom-filter.c
+++ b/gom/gom-filter.c
@@ -60,7 +60,9 @@ static const gchar *gOperators[] = {
"<",
"<=",
"LIKE",
- "GLOB"
+ "GLOB",
+ "IS NULL",
+ "IS NOT NULL"
};
/**
@@ -95,8 +97,10 @@ gom_filter_new_for_param (GType resource_type,
GomFilter *filter;
g_return_val_if_fail(g_type_is_a(resource_type, GOM_TYPE_RESOURCE), NULL);
- g_return_val_if_fail(value != NULL, NULL);
- g_return_val_if_fail(G_VALUE_TYPE(value), NULL);
+ if (mode != GOM_FILTER_IS_NULL && mode != GOM_FILTER_IS_NOT_NULL) {
+ g_return_val_if_fail(value != NULL, NULL);
+ g_return_val_if_fail(G_VALUE_TYPE(value), NULL);
+ }
klass = g_type_class_ref(resource_type);
pspec = g_object_class_find_property(klass, property_name);
@@ -113,8 +117,12 @@ gom_filter_new_for_param (GType resource_type,
NULL);
filter->priv->pspec = g_param_spec_ref(pspec);
filter->priv->type = resource_type;
- g_value_init(&filter->priv->value, G_VALUE_TYPE(value));
- g_value_copy(value, &filter->priv->value);
+
+ if (value)
+ {
+ g_value_init(&filter->priv->value, G_VALUE_TYPE(value));
+ g_value_copy(value, &filter->priv->value);
+ }
return filter;
}
@@ -232,6 +240,20 @@ gom_filter_new_lte (GType resource_type,
return gom_filter_new_for_param(resource_type, property_name, GOM_FILTER_LTE, value);
}
+GomFilter *
+gom_filter_new_is_null (GType resource_type,
+ const gchar *property_name)
+{
+ return gom_filter_new_for_param(resource_type, property_name, GOM_FILTER_IS_NULL, NULL);
+}
+
+GomFilter *
+gom_filter_new_is_not_null (GType resource_type,
+ const gchar *property_name)
+{
+ return gom_filter_new_for_param(resource_type, property_name, GOM_FILTER_IS_NOT_NULL, NULL);
+}
+
static GomFilterMode
gom_filter_get_mode (GomFilter *filter)
{
@@ -420,6 +442,15 @@ gom_filter_get_sql (GomFilter *filter,
gOperators[priv->mode]);
g_free(table);
return ret;
+ case GOM_FILTER_IS_NULL:
+ case GOM_FILTER_IS_NOT_NULL:
+ table = get_table(priv->pspec, priv->type, table_map);
+ ret = g_strdup_printf("'%s'.'%s' %s",
+ table,
+ priv->pspec->name,
+ gOperators[priv->mode]);
+ g_free(table);
+ return ret;
case GOM_FILTER_AND:
case GOM_FILTER_OR:
len = g_queue_get_length(priv->subfilters);
@@ -521,6 +552,11 @@ gom_filter_get_values (GomFilter *filter)
g_array_append_val(va, v);
return va;
}
+ case GOM_FILTER_IS_NULL:
+ case GOM_FILTER_IS_NOT_NULL:
+ va = g_array_new(FALSE, FALSE, sizeof(GValue));
+ g_array_set_clear_func(va, (GDestroyNotify) g_value_unset);
+ return va;
case GOM_FILTER_AND:
case GOM_FILTER_OR:
len = g_queue_get_length(priv->subfilters);
@@ -694,6 +730,8 @@ gom_filter_mode_get_type (void)
{ GOM_FILTER_LTE, "GOM_FILTER_LTE", "LTE" },
{ GOM_FILTER_LIKE, "GOM_FILTER_LIKE", "LIKE" },
{ GOM_FILTER_GLOB, "GOM_FILTER_GLOB", "GLOB" },
+ { GOM_FILTER_IS_NULL, "GOM_FILTER_IS_NULL", "IS_NULL" },
+ { GOM_FILTER_IS_NOT_NULL, "GOM_FILTER_IS_NOT_NULL", "IS_NOT_NULL" },
{ 0 }
};
diff --git a/gom/gom-filter.h b/gom/gom-filter.h
index a4fa06e..e76f763 100644
--- a/gom/gom-filter.h
+++ b/gom/gom-filter.h
@@ -44,7 +44,9 @@ enum _GomFilterMode
GOM_FILTER_LT,
GOM_FILTER_LTE,
GOM_FILTER_LIKE,
- GOM_FILTER_GLOB
+ GOM_FILTER_GLOB,
+ GOM_FILTER_IS_NULL,
+ GOM_FILTER_IS_NOT_NULL
};
typedef struct _GomFilter GomFilter;
@@ -67,45 +69,49 @@ struct _GomFilterClass
GType gom_filter_mode_get_type (void) G_GNUC_CONST;
GType gom_filter_get_type (void) G_GNUC_CONST;
-gchar *gom_filter_get_sql (GomFilter *filter,
- GHashTable *table_map);
-GArray *gom_filter_get_values (GomFilter *filter);
-GomFilter *gom_filter_new_sql (const gchar *sql,
- GArray *values);
-GomFilter *gom_filter_new_or (GomFilter *left,
- GomFilter *right);
-GomFilter *gom_filter_new_or_full (GomFilter *first,
- ...);
-GomFilter *gom_filter_new_or_fullv (GomFilter **filter_array);
-GomFilter *gom_filter_new_and (GomFilter *left,
- GomFilter *right);
-GomFilter *gom_filter_new_and_full (GomFilter *first,
- ...);
-GomFilter *gom_filter_new_and_fullv (GomFilter **filter_array);
-GomFilter *gom_filter_new_eq (GType resource_type,
- const gchar *property_name,
- const GValue *value);
-GomFilter *gom_filter_new_neq (GType resource_type,
- const gchar *property_name,
- const GValue *value);
-GomFilter *gom_filter_new_gt (GType resource_type,
- const gchar *property_name,
- const GValue *value);
-GomFilter *gom_filter_new_gte (GType resource_type,
- const gchar *property_name,
- const GValue *value);
-GomFilter *gom_filter_new_lt (GType resource_type,
- const gchar *property_name,
- const GValue *value);
-GomFilter *gom_filter_new_lte (GType resource_type,
- const gchar *property_name,
- const GValue *value);
-GomFilter *gom_filter_new_like (GType resource_type,
- const gchar *property_name,
- const GValue *value);
-GomFilter *gom_filter_new_glob (GType resource_type,
- const gchar *property_name,
- const GValue *value);
+gchar *gom_filter_get_sql (GomFilter *filter,
+ GHashTable *table_map);
+GArray *gom_filter_get_values (GomFilter *filter);
+GomFilter *gom_filter_new_sql (const gchar *sql,
+ GArray *values);
+GomFilter *gom_filter_new_or (GomFilter *left,
+ GomFilter *right);
+GomFilter *gom_filter_new_or_full (GomFilter *first,
+ ...);
+GomFilter *gom_filter_new_or_fullv (GomFilter **filter_array);
+GomFilter *gom_filter_new_and (GomFilter *left,
+ GomFilter *right);
+GomFilter *gom_filter_new_and_full (GomFilter *first,
+ ...);
+GomFilter *gom_filter_new_and_fullv (GomFilter **filter_array);
+GomFilter *gom_filter_new_eq (GType resource_type,
+ const gchar *property_name,
+ const GValue *value);
+GomFilter *gom_filter_new_neq (GType resource_type,
+ const gchar *property_name,
+ const GValue *value);
+GomFilter *gom_filter_new_gt (GType resource_type,
+ const gchar *property_name,
+ const GValue *value);
+GomFilter *gom_filter_new_gte (GType resource_type,
+ const gchar *property_name,
+ const GValue *value);
+GomFilter *gom_filter_new_lt (GType resource_type,
+ const gchar *property_name,
+ const GValue *value);
+GomFilter *gom_filter_new_lte (GType resource_type,
+ const gchar *property_name,
+ const GValue *value);
+GomFilter *gom_filter_new_like (GType resource_type,
+ const gchar *property_name,
+ const GValue *value);
+GomFilter *gom_filter_new_glob (GType resource_type,
+ const gchar *property_name,
+ const GValue *value);
+GomFilter *gom_filter_new_is_null (GType resource_type,
+ const gchar *property_name);
+GomFilter *gom_filter_new_is_not_null (GType resource_type,
+ const gchar *property_name);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]