[tracker/wip/fts5: 1/2] libtracker-data: Handle tracker:fulltextIndexed changes



commit b324a0fd4329f8a1de3a476a1788e6c4c94c50be
Author: Carlos Garnacho <carlosg gnome org>
Date:   Mon Feb 29 13:04:00 2016 +0100

    libtracker-data: Handle tracker:fulltextIndexed changes
    
    We no longer have a reason to deem this change incompatible. Since
    no actual text is stored in the FTS tables, and it merely updates
    its tokenization info from the original class tables, we can just
    drop this info and reconstruct at will. So there's no longer need
    to consider tracker:fulltextIndexed changes as incompatible.

 src/libtracker-data/tracker-data-manager.c |   42 +++++++++------------------
 src/libtracker-data/tracker-property.c     |   26 +++++++++++++++++
 src/libtracker-data/tracker-property.h     |    3 ++
 3 files changed, 43 insertions(+), 28 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index c8dab4a..b7d2ffe 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -650,6 +650,7 @@ tracker_data_ontology_load_statement (const gchar *ontology_path,
                                        tracker_property_set_is_inverse_functional_property (property, FALSE);
                                        tracker_property_set_default_value (property, NULL);
                                        tracker_property_set_multiple_values (property, TRUE);
+                                       tracker_property_set_fulltext_indexed (property, FALSE);
                                }
                                return;
                        }
@@ -1140,29 +1141,8 @@ tracker_data_ontology_load_statement (const gchar *ontology_path,
                        return;
                }
 
-               is_new = tracker_property_get_is_new (property);
-               if (is_new != in_update) {
-                       /* Detect unsupported ontology change (this needs a journal replay) */
-                       if (in_update == TRUE && is_new == FALSE) {
-                               if (check_unsupported_property_value_change (ontology_path,
-                                                                            "tracker:fulltextIndexed",
-                                                                            subject,
-                                                                            predicate,
-                                                                            object)) {
-                                       handle_unsupported_ontology_change (ontology_path,
-                                                                           tracker_property_get_name 
(property),
-                                                                           "tracker:fulltextIndexed",
-                                                                           
tracker_property_get_fulltext_indexed (property) ? "true" : "false",
-                                                                           g_strcmp0 (object, "true") == 0 ? 
"true" : "false",
-                                                                           error);
-                               }
-                       }
-                       return;
-               }
-
-               if (strcmp (object, "true") == 0) {
-                       tracker_property_set_fulltext_indexed (property, TRUE);
-               }
+               tracker_property_set_fulltext_indexed (property,
+                                                      strcmp (object, "true") == 0);
        } else if (g_strcmp0 (predicate, TRACKER_PREFIX_TRACKER "defaultValue") == 0) {
                TrackerProperty *property;
 
@@ -2436,6 +2416,7 @@ db_get_static_data (TrackerDBInterface  *iface,
                                tracker_property_set_secondary_index (property, 
tracker_ontologies_get_property_by_uri (secondary_index_uri));
                        }
 
+                       tracker_property_set_orig_fulltext_indexed (property, fulltext_indexed);
                        tracker_property_set_fulltext_indexed (property, fulltext_indexed);
                        tracker_property_set_is_inverse_functional_property (property, 
is_inverse_functional_property);
 
@@ -3614,11 +3595,11 @@ load_ontologies_gvdb (GError **error)
 #if HAVE_TRACKER_FTS
 static gboolean
 ontology_get_fts_properties (gboolean     only_new,
-                            GHashTable **fts_properties,
-                            GHashTable **multivalued)
+                             GHashTable **fts_properties,
+                             GHashTable **multivalued)
 {
        TrackerProperty **properties;
-       gboolean has_new = FALSE;
+       gboolean has_changed = FALSE;
        guint i, len;
 
        properties = tracker_ontologies_get_properties (&len);
@@ -3630,11 +3611,16 @@ ontology_get_fts_properties (gboolean     only_new,
                const gchar *name, *table_name;
                GList *list;
 
+               if (tracker_property_get_fulltext_indexed (properties[i]) !=
+                   tracker_property_get_orig_fulltext_indexed (properties[i])) {
+                       has_changed |= TRUE;
+               }
+
                if (!tracker_property_get_fulltext_indexed (properties[i])) {
                        continue;
                }
 
-               has_new |= tracker_property_get_is_new (properties[i]);
+               has_changed |= tracker_property_get_is_new (properties[i]);
                table_name = tracker_property_get_table_name (properties[i]);
                name = tracker_property_get_name (properties[i]);
                list = g_hash_table_lookup (*fts_properties, table_name);
@@ -3652,7 +3638,7 @@ ontology_get_fts_properties (gboolean     only_new,
                }
        }
 
-       return has_new;
+       return has_changed;
 }
 
 static void
diff --git a/src/libtracker-data/tracker-property.c b/src/libtracker-data/tracker-property.c
index 1d19ee2..3f14c38 100644
--- a/src/libtracker-data/tracker-property.c
+++ b/src/libtracker-data/tracker-property.c
@@ -55,6 +55,7 @@ struct _TrackerPropertyPrivate {
        gint           id;
        gboolean       indexed;
        TrackerProperty *secondary_index;
+       gboolean       orig_fulltext_indexed;
        gboolean       fulltext_indexed;
        gboolean       multiple_values;
        gboolean       last_multiple_values;
@@ -491,6 +492,18 @@ tracker_property_get_fulltext_indexed (TrackerProperty *property)
 }
 
 gboolean
+tracker_property_get_orig_fulltext_indexed (TrackerProperty *property)
+{
+       TrackerPropertyPrivate *priv;
+
+       g_return_val_if_fail (property != NULL, FALSE);
+
+       priv = GET_PRIV (property);
+
+       return priv->orig_fulltext_indexed;
+}
+
+gboolean
 tracker_property_get_is_new (TrackerProperty *property)
 {
        TrackerPropertyPrivate *priv;
@@ -999,6 +1012,19 @@ tracker_property_set_cardinality_changed (TrackerProperty *property,
 }
 
 void
+tracker_property_set_orig_fulltext_indexed (TrackerProperty *property,
+                                            gboolean         value)
+{
+       TrackerPropertyPrivate *priv;
+
+       g_return_if_fail (TRACKER_IS_PROPERTY (property));
+
+       priv = GET_PRIV (property);
+
+       priv->orig_fulltext_indexed = value;
+}
+
+void
 tracker_property_set_fulltext_indexed (TrackerProperty *property,
                                        gboolean         value)
 {
diff --git a/src/libtracker-data/tracker-property.h b/src/libtracker-data/tracker-property.h
index 328d130..fdc6883 100644
--- a/src/libtracker-data/tracker-property.h
+++ b/src/libtracker-data/tracker-property.h
@@ -85,6 +85,7 @@ gint                tracker_property_get_weight              (TrackerProperty
 gint                tracker_property_get_id                  (TrackerProperty      *property);
 gboolean            tracker_property_get_indexed             (TrackerProperty      *property);
 TrackerProperty *   tracker_property_get_secondary_index     (TrackerProperty      *property);
+gboolean            tracker_property_get_orig_fulltext_indexed(TrackerProperty      *property);
 gboolean            tracker_property_get_fulltext_indexed    (TrackerProperty      *property);
 gboolean            tracker_property_get_multiple_values     (TrackerProperty      *property);
 gboolean            tracker_property_get_last_multiple_values(TrackerProperty      *property);
@@ -120,6 +121,8 @@ void                tracker_property_set_indexed             (TrackerProperty
                                                               gboolean              value);
 void                tracker_property_set_secondary_index     (TrackerProperty      *property,
                                                               TrackerProperty      *value);
+void                tracker_property_set_orig_fulltext_indexed(TrackerProperty      *property,
+                                                               gboolean              value);
 void                tracker_property_set_fulltext_indexed    (TrackerProperty      *property,
                                                               gboolean              value);
 void                tracker_property_set_multiple_values     (TrackerProperty      *property,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]