sw/inc/rdfhelper.hxx | 11 ++++++++++ sw/source/core/doc/rdfhelper.cxx | 42 +++++++++++++++++++++++++++------------ 2 files changed, 41 insertions(+), 12 deletions(-)
New commits: commit 391db9909b9456042492b3fdc73eff140d724adf Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> AuthorDate: Mon Oct 1 07:22:00 2018 -0400 Commit: Ashod Nakashian <ashnak...@gmail.com> CommitDate: Thu Dec 26 03:42:46 2019 +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. Reviewed-on: https://gerrit.libreoffice.org/63002 Tested-by: Jenkins Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> (cherry picked from commit d5c9288e00cf39292d077d58be550af566b779ac) Change-Id: I75425df201becb41105ba1fa6ba580af202d035c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/85802 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/sw/inc/rdfhelper.hxx b/sw/inc/rdfhelper.hxx index 18ddd87127d7..9ccb39156cb3 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.hxx> class SwTextNode; @@ -26,6 +27,7 @@ namespace com { namespace sun { namespace star { } namespace rdf { class XResource; + class XURI; } }}} @@ -33,6 +35,15 @@ 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, 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, _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits