[tracker/fts-limits: 2/2] Added ontology property tracker:fulltextNoLimit for disabling word length checks for certain propert



commit bdc0241c4b8a36067d1f5977bd15003dd3f48f4a
Author: Mikael Ottela <mikael ottela ixonos com>
Date:   Fri Feb 19 21:01:58 2010 +0200

    Added ontology property tracker:fulltextNoLimit for disabling word length
    checks for certain properties in the ontology.
    
    For instance short family names are crucial even when short.

 data/ontologies/11-rdf.ontology                |    5 +++
 src/libtracker-common/tracker-property.c       |   43 ++++++++++++++++++++++-
 src/libtracker-common/tracker-property.h       |    3 ++
 src/libtracker-data/tracker-data-manager.c     |   32 +++++++++++++++--
 src/libtracker-data/tracker-data-update.c      |    7 +++-
 src/libtracker-fts/tracker-fts.c               |   23 +++++++-----
 src/libtracker-fts/tracker-fts.h               |    2 +-
 tests/libtracker-fts/data.ontology             |    6 +++
 tests/libtracker-fts/prefix/Makefile.am        |    4 +-
 tests/libtracker-fts/prefix/data.ontology      |   23 -------------
 tests/libtracker-fts/prefix/fts3prefix-3.out   |    7 ++++
 tests/libtracker-fts/prefix/fts3prefix-3.rq    |    1 +
 tests/libtracker-fts/prefix/fts3prefix-data.rq |   20 +++++-----
 tests/libtracker-fts/tracker-fts-test.c        |    2 +-
 14 files changed, 123 insertions(+), 55 deletions(-)
---
diff --git a/data/ontologies/11-rdf.ontology b/data/ontologies/11-rdf.ontology
index 4d177d4..72eca49 100644
--- a/data/ontologies/11-rdf.ontology
+++ b/data/ontologies/11-rdf.ontology
@@ -80,6 +80,11 @@ tracker:fulltextIndexed a rdf:Property ;
 	rdfs:domain rdf:Property ;
 	rdfs:range xsd:boolean .
 
+tracker:fulltextNoLimit a rdf:Property ;
+	nrl:maxCardinality 1 ;
+	rdfs:domain rdf:Property ;
+	rdfs:range xsd:boolean .
+
 tracker:transient a rdf:Property ;
 	nrl:maxCardinality 1 ;
 	rdfs:domain rdf:Property ;
diff --git a/src/libtracker-common/tracker-property.c b/src/libtracker-common/tracker-property.c
index 08b2593..9d8c3c8 100644
--- a/src/libtracker-common/tracker-property.c
+++ b/src/libtracker-common/tracker-property.c
@@ -50,6 +50,7 @@ struct _TrackerPropertyPriv {
 	gint           id;
 	gboolean       indexed;
 	gboolean       fulltext_indexed;
+	gboolean       fulltext_no_limit;
 	gboolean       embedded;
 	gboolean       multiple_values;
 	gboolean       filtered;
@@ -79,6 +80,7 @@ enum {
 	PROP_WEIGHT,
 	PROP_INDEXED,
 	PROP_FULLTEXT_INDEXED,
+	PROP_FULLTEXT_NO_LIMIT,
 	PROP_EMBEDDED,
 	PROP_MULTIPLE_VALUES,
 	PROP_FILTERED,
@@ -225,6 +227,13 @@ tracker_property_class_init (TrackerPropertyClass *klass)
 	                                                       TRUE,
 	                                                       G_PARAM_READWRITE));
 	g_object_class_install_property (object_class,
+	                                 PROP_FULLTEXT_NO_LIMIT,
+	                                 g_param_spec_boolean ("fulltext-no-limit",
+	                                                       "fulltext-no-limit",
+	                                                       "Full-text indexing without word length limits",
+	                                                       TRUE,
+	                                                       G_PARAM_READWRITE));
+	g_object_class_install_property (object_class,
 	                                 PROP_EMBEDDED,
 	                                 g_param_spec_boolean ("embedded",
 	                                                       "embedded",
@@ -341,6 +350,9 @@ property_get_property (GObject    *object,
 	case PROP_FULLTEXT_INDEXED:
 		g_value_set_boolean (value, priv->fulltext_indexed);
 		break;
+	case PROP_FULLTEXT_NO_LIMIT:
+		g_value_set_boolean (value, priv->fulltext_no_limit);
+		break;
 	case PROP_EMBEDDED:
 		g_value_set_boolean (value, priv->embedded);
 		break;
@@ -401,6 +413,10 @@ property_set_property (GObject      *object,
 		tracker_property_set_fulltext_indexed (TRACKER_PROPERTY (object),
 		                                       g_value_get_boolean (value));
 		break;
+	case PROP_FULLTEXT_NO_LIMIT:
+		tracker_property_set_fulltext_no_limit (TRACKER_PROPERTY (object),
+							g_value_get_boolean (value));
+		break;
 	case PROP_EMBEDDED:
 		tracker_property_set_embedded (TRACKER_PROPERTY (object),
 		                               g_value_get_boolean (value));
@@ -577,7 +593,6 @@ tracker_property_get_indexed (TrackerProperty *field)
 	return priv->indexed;
 }
 
-
 gboolean
 tracker_property_get_fulltext_indexed (TrackerProperty *field)
 {
@@ -590,6 +605,17 @@ tracker_property_get_fulltext_indexed (TrackerProperty *field)
 	return priv->fulltext_indexed;
 }
 
+gboolean
+tracker_property_get_fulltext_no_limit (TrackerProperty *field)
+{
+	TrackerPropertyPriv *priv;
+
+	g_return_val_if_fail (TRACKER_IS_PROPERTY (field), FALSE);
+
+	priv = GET_PRIV (field);
+
+	return priv->fulltext_no_limit;
+}
 
 gboolean
 tracker_property_get_embedded (TrackerProperty *field)
@@ -603,7 +629,6 @@ tracker_property_get_embedded (TrackerProperty *field)
 	return priv->embedded;
 }
 
-
 gboolean
 tracker_property_get_multiple_values (TrackerProperty *field)
 {
@@ -844,6 +869,20 @@ tracker_property_set_fulltext_indexed (TrackerProperty *field,
 }
 
 void
+tracker_property_set_fulltext_no_limit (TrackerProperty *field,
+                                       gboolean                 value)
+{
+	TrackerPropertyPriv *priv;
+
+	g_return_if_fail (TRACKER_IS_PROPERTY (field));
+
+	priv = GET_PRIV (field);
+
+	priv->fulltext_no_limit = value;
+	g_object_notify (G_OBJECT (field), "fulltext-no-limit");
+}
+
+void
 tracker_property_set_embedded (TrackerProperty *field,
                                gboolean                 value)
 {
diff --git a/src/libtracker-common/tracker-property.h b/src/libtracker-common/tracker-property.h
index 1ec000d..ebbcf85 100644
--- a/src/libtracker-common/tracker-property.h
+++ b/src/libtracker-common/tracker-property.h
@@ -82,6 +82,7 @@ gint                tracker_property_get_weight           (TrackerProperty
 gint                tracker_property_get_id               (TrackerProperty      *property);
 gboolean            tracker_property_get_indexed          (TrackerProperty      *property);
 gboolean            tracker_property_get_fulltext_indexed (TrackerProperty      *property);
+gboolean            tracker_property_get_fulltext_no_limit(TrackerProperty      *property);
 gboolean            tracker_property_get_embedded         (TrackerProperty      *property);
 gboolean            tracker_property_get_multiple_values  (TrackerProperty      *property);
 gboolean            tracker_property_get_filtered         (TrackerProperty      *property);
@@ -105,6 +106,8 @@ void                tracker_property_set_indexed          (TrackerProperty
                                                            gboolean              value);
 void                tracker_property_set_fulltext_indexed (TrackerProperty      *property,
                                                            gboolean              value);
+void                tracker_property_set_fulltext_no_limit(TrackerProperty      *property,
+                                                           gboolean              value);
 void                tracker_property_set_embedded         (TrackerProperty      *property,
                                                            gboolean              value);
 void                tracker_property_set_multiple_values  (TrackerProperty      *property,
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index c65aca6..1ffa62d 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -259,6 +259,18 @@ load_ontology_statement (const gchar *ontology_file,
 		if (strcmp (object, "true") == 0) {
 			tracker_property_set_fulltext_indexed (property, TRUE);
 		}
+	} else if (g_strcmp0 (predicate, TRACKER_PREFIX "fulltextNoLimit") == 0) {
+		TrackerProperty *property;
+
+		property = tracker_ontology_get_property_by_uri (subject);
+		if (property == NULL) {
+			g_critical ("%s: Unknown property %s", ontology_file, subject);
+			return;
+		}
+
+		if (strcmp (object, "true") == 0) {
+			tracker_property_set_fulltext_no_limit (property, TRUE);
+		}
 	} else if (g_strcmp0 (predicate, TRACKER_PREFIX "prefix") == 0) {
 		TrackerNamespace *namespace;
 
@@ -647,6 +659,7 @@ db_get_static_data (TrackerDBInterface *iface)
 	                                              "\"nrl:maxCardinality\", "
 	                                              "\"tracker:indexed\", "
 	                                              "\"tracker:fulltextIndexed\", "
+	                                              "\"tracker:fulltextNoLimit\", "
 	                                              "\"tracker:transient\", "
 	                                              "\"tracker:isAnnotation\", "
 	                                              "(SELECT 1 FROM \"rdfs:Resource_rdf:type\" WHERE ID = \"rdf:Property\".ID AND "
@@ -661,7 +674,7 @@ db_get_static_data (TrackerDBInterface *iface)
 			GValue value = { 0 };
 			TrackerProperty *property;
 			const gchar     *uri, *domain_uri, *range_uri;
-			gboolean         multi_valued, indexed, fulltext_indexed;
+			gboolean         multi_valued, indexed, fulltext_indexed, fulltext_no_limit;
 			gboolean         transient, annotation, is_inverse_functional_property;
 			gint             id;
 
@@ -706,6 +719,16 @@ db_get_static_data (TrackerDBInterface *iface)
 			tracker_db_cursor_get_value (cursor, 7, &value);
 
 			if (G_VALUE_TYPE (&value) != 0) {
+				fulltext_no_limit = (g_value_get_int (&value) == 1);
+				g_value_unset (&value);
+			} else {
+				/* NULL */
+				fulltext_no_limit = FALSE;
+			}
+
+			tracker_db_cursor_get_value (cursor, 8, &value);
+
+			if (G_VALUE_TYPE (&value) != 0) {
 				transient = (g_value_get_int (&value) == 1);
 				g_value_unset (&value);
 			} else {
@@ -713,7 +736,7 @@ db_get_static_data (TrackerDBInterface *iface)
 				transient = FALSE;
 			}
 
-			tracker_db_cursor_get_value (cursor, 8, &value);
+			tracker_db_cursor_get_value (cursor, 9, &value);
 
 			if (G_VALUE_TYPE (&value) != 0) {
 				annotation = (g_value_get_int (&value) == 1);
@@ -723,7 +746,7 @@ db_get_static_data (TrackerDBInterface *iface)
 				annotation = FALSE;
 			}
 
-			tracker_db_cursor_get_value (cursor, 9, &value);
+			tracker_db_cursor_get_value (cursor, 10, &value);
 
 			if (G_VALUE_TYPE (&value) != 0) {
 				is_inverse_functional_property = TRUE;
@@ -741,13 +764,14 @@ db_get_static_data (TrackerDBInterface *iface)
 			tracker_property_set_multiple_values (property, multi_valued);
 			tracker_property_set_indexed (property, indexed);
 			tracker_property_set_fulltext_indexed (property, fulltext_indexed);
+			tracker_property_set_fulltext_no_limit (property, fulltext_no_limit);
 			tracker_property_set_embedded (property, !annotation);
 			tracker_property_set_is_inverse_functional_property (property, is_inverse_functional_property);
 			property_add_super_properties_from_db (iface, property);
 
 			tracker_ontology_add_property (property);
 			tracker_ontology_add_id_uri_pair (id, uri);
-			
+
 			g_object_unref (property);
 
 		}
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c
index c092ca6..5549b2a 100644
--- a/src/libtracker-data/tracker-data-update.c
+++ b/src/libtracker-data/tracker-data-update.c
@@ -663,7 +663,9 @@ tracker_data_resource_buffer_flush (GError **error)
 					g_string_append (fts, g_value_get_string (g_value_array_get_nth (values, i)));
 					g_string_append_c (fts, ' ');
 				}
-				tracker_fts_update_text (resource_buffer->id, tracker_data_query_resource_id (tracker_property_get_uri (prop)), fts->str);
+				tracker_fts_update_text (resource_buffer->id,
+							 tracker_data_query_resource_id (tracker_property_get_uri (prop)),
+							 fts->str, !tracker_property_get_fulltext_no_limit (prop));
 				g_string_free (fts, TRUE);
 			}
 		}
@@ -1024,7 +1026,8 @@ get_old_property_values (TrackerProperty  *property,
 					/* delete old fts entries */
 					for (i = 0; i < old_values->n_values; i++) {
 						tracker_fts_update_text (resource_buffer->id, -1,
-						                         g_value_get_string (g_value_array_get_nth (old_values, i)));
+						                         g_value_get_string (g_value_array_get_nth (old_values, i)),
+									 !tracker_property_get_fulltext_no_limit (prop));
 					}
 				}
 			}
diff --git a/src/libtracker-fts/tracker-fts.c b/src/libtracker-fts/tracker-fts.c
index a58af78..d52fae7 100644
--- a/src/libtracker-fts/tracker-fts.c
+++ b/src/libtracker-fts/tracker-fts.c
@@ -4756,7 +4756,8 @@ static int buildTerms(fulltext_vtab *v, sqlite_int64 iDocid,
 #ifdef STORE_CATEGORY
 int Catid,
 #endif
-		      const char *zText, int iColumn){
+		      const char *zText, int iColumn,
+		      gboolean limit_word_length){
 
   const char *pToken;
   int nTokenBytes;
@@ -4768,15 +4769,15 @@ int Catid,
 
   if (!zText) return SQLITE_OK;
 
-  tracker_parser_reset (parser, zText, strlen (zText), FALSE, TRUE, v->stop_words, FALSE, TRUE);
+  tracker_parser_reset (parser, zText, strlen (zText), FALSE, TRUE, v->stop_words, FALSE, limit_word_length);
 
   while( 1 ){
 
     pToken = tracker_parser_next (parser, &iPosition,
-				     &iStartOffset,
-				     &iEndOffset,
-				     &stop_word,
-				     &nTokenBytes);
+				  &iStartOffset,
+				  &iEndOffset,
+				  &stop_word,
+				  &nTokenBytes);
    if (!pToken) {
 	break;
    }
@@ -4947,7 +4948,7 @@ static int index_update(fulltext_vtab *v, sqlite_int64 iRow,
 
     /* tracker - as for col id we want col 0 to be the default metadata field (file:contents or email:body) ,
     col 1 to be meatdata id 1, col 2 to be metadat id 2 etc so need to decrement i here */
-    int rc = buildTerms(v, iRow, sqlite3_value_int (pValues[0]), zText, delete ? -1 : (i-1));
+    int rc = buildTerms(v, iRow, sqlite3_value_int (pValues[0]), zText, delete ? -1 : (i-1), TRUE);
     if( rc!=SQLITE_OK ) return rc;
   }
 
@@ -4955,7 +4956,7 @@ static int index_update(fulltext_vtab *v, sqlite_int64 iRow,
 
   for(i = 0; i < v->nColumn ; ++i){
     char *zText = (char*)sqlite3_value_text(pValues[i]);
-    rc = buildTerms(v, iRow, zText, delete ? -1 : i);
+    rc = buildTerms(v, iRow, zText, delete ? -1 : i, TRUE);
     if( rc!=SQLITE_OK ) return rc;
   }
 
@@ -7775,8 +7776,10 @@ int tracker_fts_update_init(int id){
   return initPendingTerms(tracker_fts_vtab, id);
 }
 
-int tracker_fts_update_text(int id, int column_id, const char *text){
-  return buildTerms(tracker_fts_vtab, id, text, column_id);
+int tracker_fts_update_text(int id, int column_id,
+			    const char *text, gboolean limit_word_length){
+	return buildTerms(tracker_fts_vtab, id, text,
+			  column_id, limit_word_length);
 }
 
 void tracker_fts_update_commit(void){
diff --git a/src/libtracker-fts/tracker-fts.h b/src/libtracker-fts/tracker-fts.h
index b39c4c5..491404d 100644
--- a/src/libtracker-fts/tracker-fts.h
+++ b/src/libtracker-fts/tracker-fts.h
@@ -24,7 +24,7 @@ G_BEGIN_DECLS
 
 int tracker_fts_init (sqlite3 *db);
 int tracker_fts_update_init (int id);
-int tracker_fts_update_text (int id, int column_id, const char *text);
+int tracker_fts_update_text (int id, int column_id, const char *text, gboolean limit_word_length);
 void tracker_fts_update_commit (void);
 void tracker_fts_update_rollback (void);
 gchar * tracker_fts_get_create_fts_table_query (void);
diff --git a/tests/libtracker-fts/data.ontology b/tests/libtracker-fts/data.ontology
index d865fe1..5d87d6b 100644
--- a/tests/libtracker-fts/data.ontology
+++ b/tests/libtracker-fts/data.ontology
@@ -21,3 +21,9 @@ test:p a rdf:Property ;
 	rdfs:range xsd:string ;
 	tracker:fulltextIndexed true .
 
+test:o a rdf:Property ;
+	nrl:maxCardinality 1 ;
+	rdfs:domain test:A ;
+	rdfs:range xsd:string ;
+	tracker:fulltextIndexed true ;
+	tracker:fulltextNoLimit true .
diff --git a/tests/libtracker-fts/prefix/Makefile.am b/tests/libtracker-fts/prefix/Makefile.am
index 7a39f1e..1ae487c 100644
--- a/tests/libtracker-fts/prefix/Makefile.am
+++ b/tests/libtracker-fts/prefix/Makefile.am
@@ -1,7 +1,7 @@
 include $(top_srcdir)/Makefile.decl
 
 EXTRA_DIST = 				\
-	data.ontology			\
 	fts3prefix-data.rq		\
 	fts3prefix-1.rq			\
-	fts3prefix-2.rq
+	fts3prefix-2.rq			\
+	fts3prefix-3.rq
diff --git a/tests/libtracker-fts/prefix/fts3prefix-3.out b/tests/libtracker-fts/prefix/fts3prefix-3.out
new file mode 100644
index 0000000..f18d2cd
--- /dev/null
+++ b/tests/libtracker-fts/prefix/fts3prefix-3.out
@@ -0,0 +1,7 @@
+"http://www.example.org/test#2";
+"http://www.example.org/test#3";
+"http://www.example.org/test#4";
+"http://www.example.org/test#5";
+"http://www.example.org/test#6";
+"http://www.example.org/test#8";
+"http://www.example.org/test#9";
diff --git a/tests/libtracker-fts/prefix/fts3prefix-3.rq b/tests/libtracker-fts/prefix/fts3prefix-3.rq
new file mode 100644
index 0000000..48f43fa
--- /dev/null
+++ b/tests/libtracker-fts/prefix/fts3prefix-3.rq
@@ -0,0 +1 @@
+SELECT ?o WHERE { ?o fts:match "pr*" }
diff --git a/tests/libtracker-fts/prefix/fts3prefix-data.rq b/tests/libtracker-fts/prefix/fts3prefix-data.rq
index e84145f..2290ed5 100644
--- a/tests/libtracker-fts/prefix/fts3prefix-data.rq
+++ b/tests/libtracker-fts/prefix/fts3prefix-data.rq
@@ -1,13 +1,13 @@
 INSERT {
-	test:1 a test:A ; test:p "t" .
-	test:2 a test:A ; test:p "tr" .
-	test:3 a test:A ; test:p "tra" .
-	test:4 a test:A ; test:p "tracker test" .
-	test:5 a test:A ; test:p "tracking tester" .
-	test:6 a test:A ; test:p "trash trash more trash" .
-	test:7 a test:A ; test:p "racker ester" .
-	test:8 a test:A ; test:p "TeStiNg TraCkEr" .
-	test:9 a test:A ; test:p "Prefix search with content" .
-	test:10 a test:A ; test:p "...and a one bit more here" .
+	test:1 a test:A ; test:p "t"                            ; test:o "p" .
+	test:2 a test:A ; test:p "tr"                           ; test:o "pr" .
+	test:3 a test:A ; test:p "tra"                          ; test:o "pra" .
+	test:4 a test:A ; test:p "tracker test"                 ; test:o "pracker pest" .
+	test:5 a test:A ; test:p "tracking tester"              ; test:o "pracking pester" .
+	test:6 a test:A ; test:p "trash trash more trash"       ; test:o "prash prash more prash" .
+	test:7 a test:A ; test:p "racker ester"                 ; test:o "racker ester" .
+	test:8 a test:A ; test:p "TeStiNg TraCkEr"              ; test:o "PeStiNg PraCkEr" .
+	test:9 a test:A ; test:p "Prefix search with content"   ; test:o "Search with content" .
+	test:10 a test:A ; test:p "...and a one bit more here"  ; test:o "...and a one bit more here" .
 }
 
diff --git a/tests/libtracker-fts/tracker-fts-test.c b/tests/libtracker-fts/tracker-fts-test.c
index 9421323..c03c36d 100644
--- a/tests/libtracker-fts/tracker-fts-test.c
+++ b/tests/libtracker-fts/tracker-fts-test.c
@@ -43,7 +43,7 @@ struct _TestInfo {
 const TestInfo tests[] = {
 	{ "fts3aa", 2 },
 	{ "fts3ae", 1 },
-	{ "prefix/fts3prefix", 2 },
+	{ "prefix/fts3prefix", 3 },
 	{ NULL }
 };
 



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