From kde-commits Wed Apr 30 22:22:11 2008 From: Sebastian Trueg Date: Wed, 30 Apr 2008 22:22:11 +0000 To: kde-commits Subject: playground/base/nepomuk-kde/search-api Message-Id: <1209594131.731193.18739.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=120959413901032 SVN commit 802869 by trueg: Support full property and resource URIs in query strings. Fixed values in quotes. In the end the problem was that either QRegExp's \b is broken or I did not understand it. M +53 -7 queryparser.cpp --- trunk/playground/base/nepomuk-kde/search-api/queryparser.cpp #802868:802869 @@ -32,21 +32,36 @@ */ namespace { - QString s_plainTermPattern( "([^\\s\"':=\\<\\>]+|(?:([\"'])[^\"':=\\<\\>]+\\2))" ); + QString s_plainTermPattern( "([^\\s\"':=\\<\\>]+|(?:([\"'])[^\"']+\\%1))" ); QString s_inExclusionPattern( "([\\+\\-]?)" ); + QString s_uriPattern( "<([^<>]+)>" ); + QString s_comparatorPattern( "(:|=|\\<|\\>|\\<=|\\>=)" ); // match a simple search text // captures: 1 - The optional + or - sign (may be empty) // 2 - the search text (including optional paranthesis) - QRegExp s_plainTermRx( "\\b" + s_inExclusionPattern + s_plainTermPattern + "\\b" ); + QRegExp s_plainTermRx( QString( s_inExclusionPattern + s_plainTermPattern ).arg( 3 ) ); // match a field search term: fieldname + relation (:, =, etc) + search text with optional paranthesis // captures: 1 - The optional + or - sign (may be empty) // 2 - fieldname // 3 - relation // 4 - search text (including optional paranthesis) - QRegExp s_fieldRx( "\\b" + s_inExclusionPattern + "(\\S+)([:=\\<\\>])" + s_plainTermPattern + "\\b" ); + QRegExp s_fieldRx( QString( s_inExclusionPattern + "(\\S+)" + s_comparatorPattern + s_plainTermPattern ).arg( 5 ) ); + // match a property URI search term: property URI + relation (:, =, etc) + search text with optional paranthesis + // captures: 1 - The optional + or - sign (may be empty) + // 2 - property URI + // 3 - relation + // 4 - search text (including optional paranthesis) + QRegExp s_propertyRx( QString( s_inExclusionPattern + s_uriPattern + s_comparatorPattern + s_plainTermPattern ).arg( 5 ) ); + + // match a property URI search term: property URI + relation (:, =, etc) + resource URI + // captures: 1 - The optional + or - sign (may be empty) + // 2 - property URI + // 3 - resource URI + QRegExp s_resourceRx( QString( s_inExclusionPattern + s_uriPattern + "(?::|=)" + s_uriPattern ) ); + // FIXME: allow comparators in field and values when we have ' or " around them Nepomuk::Search::Term::Comparator fieldTypeRelationFromString( const QString& s ) { @@ -70,6 +85,16 @@ return Nepomuk::Search::Term::Equal; } } + + QString stripQuotes( const QString& s ) { + if ( s[0] == '\'' || + s[0] == '\"' ) { + return s.mid( 1 ).left( s.length()-2 ); + } + else { + return s; + } + } } @@ -123,11 +148,32 @@ Term term; if ( pos < query.length() ) { - if ( s_fieldRx.indexIn( query, pos ) == pos ) { + if ( s_resourceRx.indexIn( query, pos ) == pos ) { // FIXME: honour the +- - kDebug() << "matched field term at" << pos << s_fieldRx.cap( 2 ); + kDebug() << "matched resource term at" << pos << s_resourceRx.cap( 0 ); + term = Term( QUrl( s_resourceRx.cap( 2 ) ), QUrl( s_resourceRx.cap( 3 ) ) ); + pos += s_resourceRx.matchedLength(); + } + else if ( s_propertyRx.indexIn( query, pos ) == pos ) { + // FIXME: honour the +- + kDebug() << "matched property term at" << pos << s_propertyRx.cap( 0 ); + term.setProperty( QUrl( s_propertyRx.cap( 2 ) ) ); + term.setValue( stripQuotes( s_propertyRx.cap( 4 ) ) ); + QString comparator = s_propertyRx.cap( 3 ); + if( comparator == QChar(':') ) { + term.setType( Term::ContainsTerm ); + } + else { + term.setType( Term::ComparisonTerm ); + term.setComparator( fieldTypeRelationFromString( comparator ) ); + } + pos += s_propertyRx.matchedLength(); + } + else if ( s_fieldRx.indexIn( query, pos ) == pos ) { + // FIXME: honour the +- + kDebug() << "matched field term at" << pos << s_fieldRx.cap( 0 ); term.setField( s_fieldRx.cap( 2 ) ); - term.setValue( s_fieldRx.cap( 4 ) ); + term.setValue( stripQuotes( s_fieldRx.cap( 4 ) ) ); QString comparator = s_fieldRx.cap( 3 ); if( comparator == QChar(':') ) { term.setType( Term::ContainsTerm ); @@ -140,7 +186,7 @@ } else if ( s_plainTermRx.indexIn( query, pos ) == pos ) { // FIXME: honour the +- - QString value = s_plainTermRx.cap( 2 ); + QString value = stripQuotes( s_plainTermRx.cap( 2 ) ); if ( value.length() == d->orKeyword.length() && value.toLower() == d->orKeyword ) { inOrBlock = true; }