tracker r2921 - in trunk: . src/libtracker-data
- From: mottela svn gnome org
- To: svn-commits-list gnome org
- Subject: tracker r2921 - in trunk: . src/libtracker-data
- Date: Wed, 11 Feb 2009 22:09:44 +0000 (UTC)
Author: mottela
Date: Wed Feb 11 22:09:43 2009
New Revision: 2921
URL: http://svn.gnome.org/viewvc/tracker?rev=2921&view=rev
Log:
Use outer join to include nulls in equality against an empty string
Modified:
trunk/ChangeLog
trunk/src/libtracker-data/tracker-data-schema.c
trunk/src/libtracker-data/tracker-field-data.c
trunk/src/libtracker-data/tracker-field-data.h
trunk/src/libtracker-data/tracker-rdf-query.c
Modified: trunk/src/libtracker-data/tracker-data-schema.c
==============================================================================
--- trunk/src/libtracker-data/tracker-data-schema.c (original)
+++ trunk/src/libtracker-data/tracker-data-schema.c Wed Feb 11 22:09:43 2009
@@ -273,6 +273,7 @@
}
tracker_field_data_set_where_field (field_data, where_field);
+ tracker_field_data_set_needs_null (field_data, FALSE);
g_free (where_field);
g_free (alias);
}
Modified: trunk/src/libtracker-data/tracker-field-data.c
==============================================================================
--- trunk/src/libtracker-data/tracker-field-data.c (original)
+++ trunk/src/libtracker-data/tracker-field-data.c Wed Feb 11 22:09:43 2009
@@ -46,6 +46,7 @@
gboolean is_select;
gboolean is_condition;
gboolean needs_join;
+ gboolean needs_null;
};
static void field_data_finalize (GObject *object);
@@ -70,7 +71,8 @@
PROP_MULTIPLE_VALUES,
PROP_IS_SELECT,
PROP_IS_CONDITION,
- PROP_NEEDS_JOIN
+ PROP_NEEDS_JOIN,
+ PROP_NEEDS_NULL
};
G_DEFINE_TYPE (TrackerFieldData, tracker_field_data, G_TYPE_OBJECT);
@@ -162,7 +164,13 @@
"Needs join",
FALSE,
G_PARAM_READWRITE));
-
+ g_object_class_install_property (object_class,
+ PROP_NEEDS_JOIN,
+ g_param_spec_boolean ("needs-null",
+ "Needs null",
+ "Needs null",
+ FALSE,
+ G_PARAM_READWRITE));
g_type_class_add_private (object_class, sizeof (TrackerFieldDataPriv));
}
@@ -234,6 +242,9 @@
case PROP_NEEDS_JOIN:
g_value_set_boolean (value, priv->needs_join);
break;
+ case PROP_NEEDS_NULL:
+ g_value_set_boolean (value, priv->needs_null);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
@@ -291,6 +302,10 @@
tracker_field_data_set_needs_join (TRACKER_FIELD_DATA (object),
g_value_get_boolean (value));
break;
+ case PROP_NEEDS_NULL:
+ tracker_field_data_set_needs_null (TRACKER_FIELD_DATA (object),
+ g_value_get_boolean (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
@@ -440,6 +455,18 @@
return priv->needs_join;
}
+gboolean
+tracker_field_data_get_needs_null (TrackerFieldData *field_data)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), FALSE);
+
+ priv = GET_PRIV (field_data);
+
+ return priv->needs_null;
+}
+
void
tracker_field_data_set_alias (TrackerFieldData *field_data,
const gchar *value)
@@ -635,3 +662,17 @@
priv->needs_join = value;
g_object_notify (G_OBJECT (field_data), "needs-join");
}
+
+void
+tracker_field_data_set_needs_null (TrackerFieldData *field_data,
+ gboolean value)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+ priv = GET_PRIV (field_data);
+
+ priv->needs_null = value;
+ g_object_notify (G_OBJECT (field_data), "needs-null");
+}
Modified: trunk/src/libtracker-data/tracker-field-data.h
==============================================================================
--- trunk/src/libtracker-data/tracker-field-data.h (original)
+++ trunk/src/libtracker-data/tracker-field-data.h Wed Feb 11 22:09:43 2009
@@ -61,6 +61,7 @@
gboolean tracker_field_data_get_is_select (TrackerFieldData *field_data);
gboolean tracker_field_data_get_is_condition (TrackerFieldData *field_data);
gboolean tracker_field_data_get_needs_join (TrackerFieldData *field_data);
+gboolean tracker_field_data_get_needs_null (TrackerFieldData *field_data);
void tracker_field_data_set_alias (TrackerFieldData *field_data,
const gchar *value);
@@ -84,7 +85,8 @@
gboolean value);
void tracker_field_data_set_needs_join (TrackerFieldData *field_data,
gboolean value);
-
+void tracker_field_data_set_needs_null (TrackerFieldData *field_data,
+ gboolean value);
G_END_DECLS
#endif /* __TRACKERD_FIELD_DATA_H__ */
Modified: trunk/src/libtracker-data/tracker-rdf-query.c
==============================================================================
--- trunk/src/libtracker-data/tracker-rdf-query.c (original)
+++ trunk/src/libtracker-data/tracker-rdf-query.c Wed Feb 11 22:09:43 2009
@@ -810,13 +810,16 @@
where_field,
data->current_value);
} else {
- TrackerFieldType data_type;
-
- data_type = tracker_field_data_get_data_type (field_data);
-
- g_string_append_printf (str, " (%s = %s) ",
- where_field,
- value);
+ if (strcmp(value, " '' ") == 0) {
+ tracker_field_data_set_needs_null (field_data, TRUE);
+ g_string_append_printf (str, " ((%s = '') OR %s IS NULL) ",
+ where_field,
+ where_field);
+ } else {
+ g_string_append_printf (str, " (%s = %s) ",
+ where_field,
+ value);
+ }
}
break;
@@ -1388,13 +1391,23 @@
related_metadata = tracker_data_schema_metadata_field_get_related_names (iface,
tracker_field_data_get_field_name (l->data));
- g_string_append_printf (data.sql_from,
- "\n INNER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID in (%s)) ",
- tracker_field_data_get_table_name (l->data),
- tracker_field_data_get_alias (l->data),
- tracker_field_data_get_alias (l->data),
- tracker_field_data_get_alias (l->data),
- related_metadata);
+ if (tracker_field_data_get_needs_null (l->data)) {
+ g_string_append_printf (data.sql_from,
+ "\n LEFT OUTER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID in (%s)) ",
+ tracker_field_data_get_table_name (l->data),
+ tracker_field_data_get_alias (l->data),
+ tracker_field_data_get_alias (l->data),
+ tracker_field_data_get_alias (l->data),
+ related_metadata);
+ } else {
+ g_string_append_printf (data.sql_from,
+ "\n INNER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID in (%s)) ",
+ tracker_field_data_get_table_name (l->data),
+ tracker_field_data_get_alias (l->data),
+ tracker_field_data_get_alias (l->data),
+ tracker_field_data_get_alias (l->data),
+ related_metadata);
+ }
g_free (related_metadata);
}
}
@@ -1515,14 +1528,25 @@
gchar *related_metadata;
related_metadata = tracker_data_schema_metadata_field_get_related_names (iface,
- tracker_field_data_get_field_name (l->data));
- g_string_append_printf (data.sql_from,
- "\n INNER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID in (%s)) ",
- tracker_field_data_get_table_name (l->data),
- tracker_field_data_get_alias (l->data),
- tracker_field_data_get_alias (l->data),
- tracker_field_data_get_alias (l->data),
- related_metadata);
+ tracker_field_data_get_field_name (l->data));
+ if (tracker_field_data_get_needs_null (l->data)) {
+ g_string_append_printf (data.sql_from,
+ "\n LEFT OUTER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID in (%s)) ",
+ tracker_field_data_get_table_name (l->data),
+ tracker_field_data_get_alias (l->data),
+ tracker_field_data_get_alias (l->data),
+ tracker_field_data_get_alias (l->data),
+ related_metadata);
+ } else {
+ g_string_append_printf (data.sql_from,
+ "\n INNER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID in (%s)) ",
+ tracker_field_data_get_table_name (l->data),
+ tracker_field_data_get_alias (l->data),
+ tracker_field_data_get_alias (l->data),
+ tracker_field_data_get_alias (l->data),
+ related_metadata);
+ }
+
g_free (related_metadata);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]