[Libreoffice-commits] core.git: sw/inc sw/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Mon Dec 3 07:11:44 UTC 2018


 sw/inc/rdfhelper.hxx             |   17 +++++++++++++--
 sw/source/core/doc/rdfhelper.cxx |   42 +++++++++++++++++++++++++++------------
 2 files changed, 44 insertions(+), 15 deletions(-)

New commits:
commit 7ddfd67e71a1e7ec0769e4277c28b4f6580885b1
Author:     Ashod Nakashian <ashod.nakashian at collabora.co.uk>
AuthorDate: Mon Oct 1 07:22:00 2018 -0400
Commit:     Ashod Nakashian <ashnakash at gmail.com>
CommitDate: Mon Dec 3 08:11:23 2018 +0100

    sw: rdf: Split graph-name lookup from getStatement
    
    The graph-name lookup is significantly costly (compared
    to the statement lookup, esp. when no statements exist).
    Luckily, the graph-names do not change often and in the
    course of enumerating all paragraphs (as happens for
    paragraph-signature validation) it doesn't change at all.
    
    This split allows for doing the graph-name lookup only
    once and also allows for passing custom graph-names
    directly, if we know them already.
    
    Change-Id: I75425df201becb41105ba1fa6ba580af202d035c
    Reviewed-on: https://gerrit.libreoffice.org/63002
    Tested-by: Jenkins
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/sw/inc/rdfhelper.hxx b/sw/inc/rdfhelper.hxx
index 18ddd87127d7..218b81b0708c 100644
--- a/sw/inc/rdfhelper.hxx
+++ b/sw/inc/rdfhelper.hxx
@@ -17,6 +17,7 @@
 #include "swdllapi.h"
 
 #include <com/sun/star/uno/Reference.h>
+#include <com/sun/star/uno/Sequence.h>
 
 class SwTextNode;
 
@@ -26,6 +27,7 @@ namespace com { namespace sun { namespace star {
     }
     namespace rdf {
         class XResource;
+        class XURI;
     }
 }}}
 
@@ -33,11 +35,20 @@ namespace com { namespace sun { namespace star {
 class SW_DLLPUBLIC SwRDFHelper
 {
 public:
+    /// Gets all graph-names in RDF of a given type.
+    static css::uno::Sequence<css::uno::Reference<css::rdf::XURI>>
+    getGraphNames(const css::uno::Reference<css::frame::XModel>& xModel, const OUString& rType);
+
+    /// Gets all (XResource, key, value) statements in RDF graphs given the graph-names.
+    static std::map<OUString, OUString>
+    getStatements(const css::uno::Reference<css::frame::XModel>& xModel,
+                  const css::uno::Sequence<css::uno::Reference<css::rdf::XURI>>& rGraphNames,
+                  const css::uno::Reference<css::rdf::XResource>& xSubject);
 
     /// Gets all (XResource, key, value) statements in RDF graphs of type rType.
-    static std::map<OUString, OUString> getStatements(const css::uno::Reference<css::frame::XModel>& xModel,
-                                                      const OUString& rType,
-                                                      const css::uno::Reference<css::rdf::XResource>& xSubject);
+    static std::map<OUString, OUString>
+    getStatements(const css::uno::Reference<css::frame::XModel>& xModel, const OUString& rType,
+                  const css::uno::Reference<css::rdf::XResource>& xSubject);
 
     /// Add an (XResource, key, value) statement in the graph of type rType -- or if it does not exist, create a graph at rPath first.
     static void addStatement(const css::uno::Reference<css::frame::XModel>& xModel,
diff --git a/sw/source/core/doc/rdfhelper.cxx b/sw/source/core/doc/rdfhelper.cxx
index 8e8c78d90313..29e9e8dcf230 100644
--- a/sw/source/core/doc/rdfhelper.cxx
+++ b/sw/source/core/doc/rdfhelper.cxx
@@ -23,26 +23,36 @@
 
 using namespace com::sun::star;
 
-std::map<OUString, OUString> SwRDFHelper::getStatements(const css::uno::Reference<css::frame::XModel>& xModel,
-                                                        const OUString& rType,
-                                                        const css::uno::Reference<css::rdf::XResource>& xSubject)
+css::uno::Sequence<uno::Reference<css::rdf::XURI>>
+SwRDFHelper::getGraphNames(const css::uno::Reference<css::frame::XModel>& xModel,
+                           const OUString& rType)
 {
-    std::map<OUString, OUString> aRet;
-
-    uno::Reference<uno::XComponentContext> xComponentContext(comphelper::getProcessComponentContext());
+    uno::Reference<uno::XComponentContext> xComponentContext(
+        comphelper::getProcessComponentContext());
     uno::Reference<rdf::XURI> xType = rdf::URI::create(xComponentContext, rType);
     uno::Reference<rdf::XDocumentMetadataAccess> xDocumentMetadataAccess(xModel, uno::UNO_QUERY);
-    uno::Sequence< uno::Reference<rdf::XURI> > aGraphNames = xDocumentMetadataAccess->getMetadataGraphsWithType(xType);
-    if (!aGraphNames.hasElements())
+    return xDocumentMetadataAccess->getMetadataGraphsWithType(xType);
+}
+
+std::map<OUString, OUString>
+SwRDFHelper::getStatements(const css::uno::Reference<css::frame::XModel>& xModel,
+                           const uno::Sequence<uno::Reference<css::rdf::XURI>>& rGraphNames,
+                           const css::uno::Reference<css::rdf::XResource>& xSubject)
+{
+    std::map<OUString, OUString> aRet;
+    if (!rGraphNames.hasElements())
         return aRet;
 
-    for (const uno::Reference<rdf::XURI>& xGraphName : aGraphNames)
+    uno::Reference<rdf::XDocumentMetadataAccess> xDocumentMetadataAccess(xModel, uno::UNO_QUERY);
+    const uno::Reference<rdf::XRepository>& xRepo = xDocumentMetadataAccess->getRDFRepository();
+    for (const uno::Reference<rdf::XURI>& xGraphName : rGraphNames)
     {
-        uno::Reference<rdf::XNamedGraph> xGraph = xDocumentMetadataAccess->getRDFRepository()->getGraph(xGraphName);
-        uno::Reference<container::XEnumeration> xStatements = xGraph->getStatements(xSubject, uno::Reference<rdf::XURI>(), uno::Reference<rdf::XURI>());
+        uno::Reference<rdf::XNamedGraph> xGraph = xRepo->getGraph(xGraphName);
+        uno::Reference<container::XEnumeration> xStatements = xGraph->getStatements(
+            xSubject, uno::Reference<rdf::XURI>(), uno::Reference<rdf::XURI>());
         while (xStatements->hasMoreElements())
         {
-            rdf::Statement aStatement = xStatements->nextElement().get<rdf::Statement>();
+            const rdf::Statement aStatement = xStatements->nextElement().get<rdf::Statement>();
             aRet[aStatement.Predicate->getStringValue()] = aStatement.Object->getStringValue();
         }
     }
@@ -50,6 +60,14 @@ std::map<OUString, OUString> SwRDFHelper::getStatements(const css::uno::Referenc
     return aRet;
 }
 
+std::map<OUString, OUString>
+SwRDFHelper::getStatements(const css::uno::Reference<css::frame::XModel>& xModel,
+                           const OUString& rType,
+                           const css::uno::Reference<css::rdf::XResource>& xSubject)
+{
+    return getStatements(xModel, getGraphNames(xModel, rType), xSubject);
+}
+
 void SwRDFHelper::addStatement(const css::uno::Reference<css::frame::XModel>& xModel,
                                const OUString& rType, const OUString& rPath,
                                const css::uno::Reference<css::rdf::XResource>& xSubject,


More information about the Libreoffice-commits mailing list