[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdelibs/nepomuk/query
From:       Sebastian Trueg <sebastian () trueg ! de>
Date:       2010-09-06 19:50:28
Message-ID: 20100906195028.C1F47AC884 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1172247 by trueg:

Moved the implementation of Query::optimized() to the new method Term::optimized(). \
This is more convinient when handling terms.

 M  +2 -65     query.cpp  
 M  +2 -0      query.h  
 M  +64 -0     term.cpp  
 M  +13 -0     term.h  


--- trunk/KDE/kdelibs/nepomuk/query/query.cpp #1172246:1172247
@@ -71,69 +71,6 @@
 
 
 namespace {
-    Nepomuk::Query::Term optimizeTerm( const Nepomuk::Query::Term& term )
-    {
-        switch( term.type() ) {
-        case Nepomuk::Query::Term::And:
-        case Nepomuk::Query::Term::Or: {
-            QList<Nepomuk::Query::Term> subTerms = static_cast<const \
                Nepomuk::Query::GroupTerm&>( term ).subTerms();
-            QList<Nepomuk::Query::Term> newSubTerms;
-            QList<Nepomuk::Query::Term>::const_iterator end( subTerms.constEnd() );
-            for ( QList<Nepomuk::Query::Term>::const_iterator it = \
                subTerms.constBegin();
-                  it != end; ++it ) {
-                const Nepomuk::Query::Term& t = *it;
-                Nepomuk::Query::Term ot = optimizeTerm( t );
-                QList<Nepomuk::Query::Term> terms;
-                if ( ot.type() == term.type() ) {
-                    terms = static_cast<const Nepomuk::Query::GroupTerm&>( ot \
                ).subTerms();
-                }
-                else if( ot.isValid() ) {
-                    terms += ot;
-                }
-                Q_FOREACH( const Nepomuk::Query::Term& t, terms ) {
-                    if( !newSubTerms.contains( t ) )
-                        newSubTerms += t;
-                }
-            }
-            if ( newSubTerms.count() == 0 )
-                return Nepomuk::Query::Term();
-            else if ( newSubTerms.count() == 1 )
-                return *newSubTerms.begin();
-            else if ( term.isAndTerm() )
-                return Nepomuk::Query::AndTerm( newSubTerms );
-            else
-                return Nepomuk::Query::OrTerm( newSubTerms );
-        }
-
-        case Nepomuk::Query::Term::Negation: {
-            Nepomuk::Query::NegationTerm nt = term.toNegationTerm();
-            // a negation in a negation
-            if( nt.subTerm().isNegationTerm() )
-                return optimizeTerm( nt.subTerm().toNegationTerm().subTerm() );
-            else
-                return Nepomuk::Query::NegationTerm::negateTerm( optimizeTerm( \
                nt.subTerm() ) );
-        }
-
-        case Nepomuk::Query::Term::Optional: {
-            Nepomuk::Query::OptionalTerm ot = term.toOptionalTerm();
-            // remove duplicate optional terms
-            if( ot.subTerm().isOptionalTerm() )
-                return optimizeTerm( ot.subTerm() );
-            else
-                return Nepomuk::Query::OptionalTerm::optionalizeTerm( optimizeTerm( \
                ot.subTerm() ) );
-        }
-
-        case Nepomuk::Query::Term::Comparison: {
-            Nepomuk::Query::ComparisonTerm ct( term.toComparisonTerm() );
-            ct.setSubTerm( optimizeTerm( ct.subTerm() ) );
-            return ct;
-        }
-
-        default:
-            return term;
-        }
-    }
-
     Nepomuk::Query::Term prepareForSparql( const Nepomuk::Query::Term& term )
     {
         //
@@ -482,7 +419,7 @@
     }
 
     // optimize whatever we can
-    term = optimizeTerm( prepareForSparql( term ) );
+    term = prepareForSparql( term ).optimized();
 
     // actually build the SPARQL query patterns
     QueryBuilderData qbd( flags );
@@ -607,7 +544,7 @@
 Nepomuk::Query::Query Nepomuk::Query::Query::optimized() const
 {
     Query newQuery( *this );
-    newQuery.setTerm( optimizeTerm( term() ) );
+    newQuery.setTerm( term().optimized() );
     return newQuery;
 }
 
--- trunk/KDE/kdelibs/nepomuk/query/query.h #1172246:1172247
@@ -416,6 +416,8 @@
              * \return An optimized version of this query.
              *
              * \since 4.6
+             *
+             * \sa Query::optimized()
              */
             Query optimized() const;
 
--- trunk/KDE/kdelibs/nepomuk/query/term.cpp #1172246:1172247
@@ -87,6 +87,70 @@
 }
 
 
+Nepomuk::Query::Term Nepomuk::Query::Term::optimized() const
+{
+    switch( type() ) {
+    case Nepomuk::Query::Term::And:
+    case Nepomuk::Query::Term::Or: {
+        QList<Nepomuk::Query::Term> subTerms = static_cast<const \
Nepomuk::Query::GroupTerm&>( *this ).subTerms(); +        QList<Nepomuk::Query::Term> \
newSubTerms; +        QList<Nepomuk::Query::Term>::const_iterator end( \
subTerms.constEnd() ); +        for ( QList<Nepomuk::Query::Term>::const_iterator it \
= subTerms.constBegin(); +              it != end; ++it ) {
+            const Nepomuk::Query::Term& t = *it;
+            Nepomuk::Query::Term ot = t.optimized();
+            QList<Nepomuk::Query::Term> terms;
+            if ( ot.type() == type() ) {
+                terms = static_cast<const Nepomuk::Query::GroupTerm&>( ot \
).subTerms(); +            }
+            else if( ot.isValid() ) {
+                terms += ot;
+            }
+            Q_FOREACH( const Nepomuk::Query::Term& t, terms ) {
+                if( !newSubTerms.contains( t ) )
+                    newSubTerms += t;
+            }
+        }
+        if ( newSubTerms.count() == 0 )
+            return Nepomuk::Query::Term();
+        else if ( newSubTerms.count() == 1 )
+            return *newSubTerms.begin();
+        else if ( isAndTerm() )
+            return Nepomuk::Query::AndTerm( newSubTerms );
+        else
+            return Nepomuk::Query::OrTerm( newSubTerms );
+    }
+
+    case Nepomuk::Query::Term::Negation: {
+        Nepomuk::Query::NegationTerm nt = toNegationTerm();
+        // a negation in a negation
+        if( nt.subTerm().isNegationTerm() )
+            return nt.subTerm().toNegationTerm().subTerm().optimized();
+        else
+            return Nepomuk::Query::NegationTerm::negateTerm( \
nt.subTerm().optimized() ); +    }
+
+    case Nepomuk::Query::Term::Optional: {
+        Nepomuk::Query::OptionalTerm ot = toOptionalTerm();
+        // remove duplicate optional terms
+        if( ot.subTerm().isOptionalTerm() )
+            return ot.subTerm().optimized();
+        else
+            return Nepomuk::Query::OptionalTerm::optionalizeTerm( \
ot.subTerm().optimized() ); +    }
+
+    case Nepomuk::Query::Term::Comparison: {
+        Nepomuk::Query::ComparisonTerm ct( toComparisonTerm() );
+        ct.setSubTerm( ct.subTerm().optimized() );
+        return ct;
+    }
+
+    default:
+        return *this;
+    }
+}
+
+
 bool Nepomuk::Query::Term::isLiteralTerm() const
 {
     return type() == Literal;
--- trunk/KDE/kdelibs/nepomuk/query/term.h #1172246:1172247
@@ -168,6 +168,19 @@
             Type type() const;
 
             /**
+             * Optimizes the term without chaning its meaning. This removes
+             * redundant terms such as NegationTerm and OptionalTerm nestings and \
flattens +             * AndTerm and OrTerm hierarchies.
+             *
+             * \return An optimized version of this term.
+             *
+             * \since 4.6
+             *
+             * \sa Query::optimized()
+             */
+            Term optimized() const;
+
+            /**
              * \return \p true if this term is a LiteralTerm.
              */
             bool isLiteralTerm() const;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic