tracker r2921 - in trunk: . src/libtracker-data



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]