code cleanups
Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/0064d335 Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/0064d335 Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/0064d335 Branch: refs/heads/MARMOTTA-584 Commit: 0064d3358325a9fcf7d6dcf7b717107fea1356d8 Parents: 5487333 Author: Sebastian Schaffert <[email protected]> Authored: Sat Dec 19 17:13:49 2015 +0100 Committer: Sebastian Schaffert <[email protected]> Committed: Sat Dec 19 17:13:49 2015 +0100 ---------------------------------------------------------------------- libraries/ostrich/backend/CMakeLists.txt | 2 + .../backend/persistence/leveldb_persistence.cc | 4 +- libraries/ostrich/backend/test/CMakeLists.txt | 1 - .../ostrich/backend/test/PersistenceTest.cc | 45 +++++++++++++++++++- libraries/ostrich/backend/util/iterator.h | 2 +- 5 files changed, 49 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/marmotta/blob/0064d335/libraries/ostrich/backend/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/libraries/ostrich/backend/CMakeLists.txt b/libraries/ostrich/backend/CMakeLists.txt index e05c28b..5a8f110 100644 --- a/libraries/ostrich/backend/CMakeLists.txt +++ b/libraries/ostrich/backend/CMakeLists.txt @@ -28,6 +28,8 @@ if (Tcmalloc_FOUND) message(STATUS "Enabling profiling support (Tcmalloc found)") endif (Tcmalloc_FOUND) +enable_testing() + add_subdirectory(util) add_subdirectory(model) add_subdirectory(sparql) http://git-wip-us.apache.org/repos/asf/marmotta/blob/0064d335/libraries/ostrich/backend/persistence/leveldb_persistence.cc ---------------------------------------------------------------------- diff --git a/libraries/ostrich/backend/persistence/leveldb_persistence.cc b/libraries/ostrich/backend/persistence/leveldb_persistence.cc index f29895c..852f152 100644 --- a/libraries/ostrich/backend/persistence/leveldb_persistence.cc +++ b/libraries/ostrich/backend/persistence/leveldb_persistence.cc @@ -170,6 +170,7 @@ class PatternQuery { return *this; } + // Returns true in case this query pattern cannot be answered by the index alone. bool NeedsFilter() const { return needsFilter; } @@ -260,7 +261,8 @@ class StatementRangeIterator : public LevelDBIterator<Statement> { char *hiKey; }; - +// Return true if the statement matches the pattern. Wildcards (empty fields) +// in the pattern are ignored. bool Matches(const Statement& pattern, const Statement& stmt) { // equality operators defined in rdf_model.h if (pattern.has_context() && stmt.context() != pattern.context()) { http://git-wip-us.apache.org/repos/asf/marmotta/blob/0064d335/libraries/ostrich/backend/test/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/libraries/ostrich/backend/test/CMakeLists.txt b/libraries/ostrich/backend/test/CMakeLists.txt index 660f40f..29491ba 100644 --- a/libraries/ostrich/backend/test/CMakeLists.txt +++ b/libraries/ostrich/backend/test/CMakeLists.txt @@ -1,4 +1,3 @@ -enable_testing() include_directories(${GTEST_INCLUDE_DIRS}) include_directories(..) include_directories(${CMAKE_CURRENT_BINARY_DIR}/..) http://git-wip-us.apache.org/repos/asf/marmotta/blob/0064d335/libraries/ostrich/backend/test/PersistenceTest.cc ---------------------------------------------------------------------- diff --git a/libraries/ostrich/backend/test/PersistenceTest.cc b/libraries/ostrich/backend/test/PersistenceTest.cc index 1b2cfb2..301692e 100644 --- a/libraries/ostrich/backend/test/PersistenceTest.cc +++ b/libraries/ostrich/backend/test/PersistenceTest.cc @@ -73,8 +73,8 @@ TEST_F(PersistenceTest, TestAddStatements) { } } - -TEST_F(PersistenceTest, TestGetStatements) { +// Test pattern queries that can be answered directly by the index. +TEST_F(PersistenceTest, TestGetStatementsIndexed) { std::vector<rdf::proto::Statement> stmts = { rdf::Statement(rdf::URI("http://example.com/s1"), rdf::URI("http://example.com/p1"), rdf::URI("http://example.com/o1")).getMessage(), @@ -121,6 +121,47 @@ TEST_F(PersistenceTest, TestGetStatements) { EXPECT_FALSE(it3->hasNext()); } +// Test pattern queries that trigger filtering because the index alone cannot answer these queries. +TEST_F(PersistenceTest, TestGetStatementsFiltered) { + std::vector<rdf::proto::Statement> stmts = { + rdf::Statement(rdf::URI("http://example.com/s1"), rdf::URI("http://example.com/p1"), + rdf::URI("http://example.com/o1")).getMessage(), + rdf::Statement(rdf::URI("http://example.com/s1"), rdf::URI("http://example.com/p2"), + rdf::URI("http://example.com/o1")).getMessage(), + rdf::Statement(rdf::URI("http://example.com/s1"), rdf::URI("http://example.com/p3"), + rdf::URI("http://example.com/o1")).getMessage(), + rdf::Statement(rdf::URI("http://example.com/s2"), rdf::URI("http://example.com/p1"), + rdf::URI("http://example.com/o2")).getMessage(), + rdf::Statement(rdf::URI("http://example.com/s2"), rdf::URI("http://example.com/p2"), + rdf::URI("http://example.com/o2")).getMessage(), + }; + + util::CollectionIterator<rdf::proto::Statement> it(stmts); + db->AddStatements(it); + + EXPECT_EQ(5, db->Size()); + + rdf::Statement pattern1; + pattern1.setSubject(rdf::URI("http://example.com/s1")); + pattern1.setObject(rdf::URI("http://example.com/o1")); + auto it1 = db->GetStatements(pattern1.getMessage()); + for (int i=0; i<3; i++) { + ASSERT_TRUE(it1->hasNext()); + EXPECT_THAT(stmts, Contains(it1->next())); + } + EXPECT_FALSE(it1->hasNext()); + + rdf::Statement pattern2; + pattern2.setSubject(rdf::URI("http://example.com/s2")); + pattern2.setObject(rdf::URI("http://example.com/o2")); + auto it2 = db->GetStatements(pattern2.getMessage()); + for (int i=0; i<2; i++) { + ASSERT_TRUE(it2->hasNext()); + EXPECT_THAT(stmts, Contains(it2->next())); + } + EXPECT_FALSE(it2->hasNext()); +} + } } http://git-wip-us.apache.org/repos/asf/marmotta/blob/0064d335/libraries/ostrich/backend/util/iterator.h ---------------------------------------------------------------------- diff --git a/libraries/ostrich/backend/util/iterator.h b/libraries/ostrich/backend/util/iterator.h index 0d34a4b..8ba1497 100644 --- a/libraries/ostrich/backend/util/iterator.h +++ b/libraries/ostrich/backend/util/iterator.h @@ -194,7 +194,7 @@ class FilteringIterator : public CloseableIterator<T> { bool nextExists; void findNext() { - current_ = next_; + current_ = std::move(next_); nextExists = false; while (it->hasNext()) {
