logic: add name delimiter to NameHierarchy

* NameHierarchy now looks like this: <delimiter>\tm<all the rest>
* made new baseclasses for SettingsMigration and SettingsMigrator
* Use the migration system for SqliteBookmarkStorage as well
This commit is contained in:
malte_langkabel
2017-05-16 13:08:12 +02:00
parent 6d0f633d24
commit c551c9a1dd
71 changed files with 692 additions and 523 deletions
-2
View File
@@ -3412,8 +3412,6 @@ public:
private:
std::shared_ptr<TestParserClient> parseCode(std::string code, bool logErrors = true)
{
NameHierarchy::setDelimiter("::");
std::shared_ptr<TestFileRegister> fileRegister = std::make_shared<TestFileRegister>();
std::shared_ptr<TestParserClient> parserClient = std::make_shared<TestParserClient>();
CxxParser parser(parserClient, fileRegister);
+29 -29
View File
@@ -92,7 +92,7 @@ public:
void test_nodes_are_nodes()
{
Node a(1, Node::NODE_NON_INDEXED, NameHierarchy("A"), false);
Node a(1, Node::NODE_NON_INDEXED, NameHierarchy("A", NAME_DELIMITER_CXX), false);
TS_ASSERT(a.isNode());
TS_ASSERT(!a.isEdge());
@@ -100,8 +100,8 @@ public:
void test_edges_are_edges()
{
Node a(1, Node::NODE_NON_INDEXED, NameHierarchy("A"), false);
Node b(2, Node::NODE_NON_INDEXED, NameHierarchy("B"), false);
Node a(1, Node::NODE_NON_INDEXED, NameHierarchy("A", NAME_DELIMITER_CXX), false);
Node b(2, Node::NODE_NON_INDEXED, NameHierarchy("B", NAME_DELIMITER_CXX), false);
Edge e(3, Edge::EDGE_USAGE, &a, &b);
TS_ASSERT(!e.isNode());
@@ -110,27 +110,27 @@ public:
void test_set_type_of_node_from_constructor()
{
Node n(1, Node::NODE_FUNCTION, NameHierarchy("A"), false);
Node n(1, Node::NODE_FUNCTION, NameHierarchy("A", NAME_DELIMITER_CXX), false);
TS_ASSERT_EQUALS(Node::NODE_FUNCTION, n.getType());
}
void test_set_type_of_node_from_non_indexed()
{
Node n(2, Node::NODE_NON_INDEXED, NameHierarchy("A"), false);
Node n(2, Node::NODE_NON_INDEXED, NameHierarchy("A", NAME_DELIMITER_CXX), false);
n.setType(Node::NODE_CLASS);
TS_ASSERT_EQUALS(Node::NODE_CLASS, n.getType());
}
void test_can_not_change_type_of_node_after_it_was_set()
{
Node n(3, Node::NODE_NAMESPACE, NameHierarchy("A"), false);
Node n(3, Node::NODE_NAMESPACE, NameHierarchy("A", NAME_DELIMITER_CXX), false);
n.setType(Node::NODE_CLASS);
TS_ASSERT_DIFFERS(Node::NODE_CLASS, n.getType());
}
void test_node_can_be_copied_and_keeps_same_id()
{
Node n(4, Node::NODE_NAMESPACE, NameHierarchy("A"), false);
Node n(4, Node::NODE_NAMESPACE, NameHierarchy("A", NAME_DELIMITER_CXX), false);
Node n2(n);
TS_ASSERT_DIFFERS(&n, &n2);
@@ -141,15 +141,15 @@ public:
void test_node_type_bit_masking()
{
Node n(1, Node::NODE_NAMESPACE, NameHierarchy("A"), false);
Node n(1, Node::NODE_NAMESPACE, NameHierarchy("A", NAME_DELIMITER_CXX), false);
TS_ASSERT(n.isType(Node::NODE_FUNCTION | Node::NODE_NAMESPACE | Node::NODE_CLASS));
TS_ASSERT(!n.isType(Node::NODE_FUNCTION | Node::NODE_METHOD | Node::NODE_CLASS));
}
void test_get_type_of_edges()
{
Node a(1, Node::NODE_NON_INDEXED, NameHierarchy("A"), false);
Node b(2, Node::NODE_NON_INDEXED, NameHierarchy("B"), false);
Node a(1, Node::NODE_NON_INDEXED, NameHierarchy("A", NAME_DELIMITER_CXX), false);
Node b(2, Node::NODE_NON_INDEXED, NameHierarchy("B", NAME_DELIMITER_CXX), false);
Edge e(3, Edge::EDGE_USAGE, &a, &b);
TS_ASSERT_EQUALS(Edge::EDGE_USAGE, e.getType());
@@ -157,8 +157,8 @@ public:
void test_edge_can_be_copied_and_keeps_same_id()
{
Node a(1, Node::NODE_NON_INDEXED, NameHierarchy("A"), false);
Node b(2, Node::NODE_NON_INDEXED, NameHierarchy("B"), false);
Node a(1, Node::NODE_NON_INDEXED, NameHierarchy("A", NAME_DELIMITER_CXX), false);
Node b(2, Node::NODE_NON_INDEXED, NameHierarchy("B", NAME_DELIMITER_CXX), false);
Edge e(3, Edge::EDGE_USAGE, &a, &b);
Edge e2(e, &a, &b);
@@ -169,8 +169,8 @@ public:
void test_edge_type_bit_masking()
{
Node a(1, Node::NODE_NON_INDEXED, NameHierarchy("A"), false);
Node b(2, Node::NODE_NON_INDEXED, NameHierarchy("B"), false);
Node a(1, Node::NODE_NON_INDEXED, NameHierarchy("A", NAME_DELIMITER_CXX), false);
Node b(2, Node::NODE_NON_INDEXED, NameHierarchy("B", NAME_DELIMITER_CXX), false);
Edge e(3, Edge::EDGE_USAGE, &a, &b);
TS_ASSERT(e.isType(Edge::EDGE_MEMBER | Edge::EDGE_CALL | Edge::EDGE_USAGE));
@@ -179,9 +179,9 @@ public:
void test_node_finds_child_node()
{
Node a(1, Node::NODE_NON_INDEXED, NameHierarchy("A"), false);
Node b(2, Node::NODE_NON_INDEXED, NameHierarchy("B"), false);
Node c(3, Node::NODE_NON_INDEXED, NameHierarchy("C"), false);
Node a(1, Node::NODE_NON_INDEXED, NameHierarchy("A", NAME_DELIMITER_CXX), false);
Node b(2, Node::NODE_NON_INDEXED, NameHierarchy("B", NAME_DELIMITER_CXX), false);
Node c(3, Node::NODE_NON_INDEXED, NameHierarchy("C", NAME_DELIMITER_CXX), false);
Edge e(4, Edge::EDGE_MEMBER, &a, &b);
Edge e2(5, Edge::EDGE_MEMBER, &a, &c);
@@ -198,9 +198,9 @@ public:
void test_node_can_not_find_child_node()
{
Node a(1, Node::NODE_NON_INDEXED, NameHierarchy("A"), false);
Node b(2, Node::NODE_NON_INDEXED, NameHierarchy("B"), false);
Node c(3, Node::NODE_NON_INDEXED, NameHierarchy("C"), false);
Node a(1, Node::NODE_NON_INDEXED, NameHierarchy("A", NAME_DELIMITER_CXX), false);
Node b(2, Node::NODE_NON_INDEXED, NameHierarchy("B", NAME_DELIMITER_CXX), false);
Node c(3, Node::NODE_NON_INDEXED, NameHierarchy("C", NAME_DELIMITER_CXX), false);
Edge e(4, Edge::EDGE_MEMBER, &a, &b);
Edge e2(5, Edge::EDGE_MEMBER, &a, &c);
@@ -216,9 +216,9 @@ public:
void test_node_visits_child_nodes()
{
Node a(1, Node::NODE_NON_INDEXED, NameHierarchy("A"), false);
Node b(2, Node::NODE_NON_INDEXED, NameHierarchy("B"), false);
Node c(3, Node::NODE_NON_INDEXED, NameHierarchy("C"), false);
Node a(1, Node::NODE_NON_INDEXED, NameHierarchy("A", NAME_DELIMITER_CXX), false);
Node b(2, Node::NODE_NON_INDEXED, NameHierarchy("B", NAME_DELIMITER_CXX), false);
Node c(3, Node::NODE_NON_INDEXED, NameHierarchy("C", NAME_DELIMITER_CXX), false);
Edge e(4, Edge::EDGE_MEMBER, &a, &b);
Edge e2(5, Edge::EDGE_MEMBER, &a, &c);
@@ -238,8 +238,8 @@ public:
void test_graph_saves_nodes()
{
Graph graph;
Node* a = graph.createNode(1, Node::NODE_NON_INDEXED, NameHierarchy("A"), false);
Node* b = graph.createNode(2, Node::NODE_NON_INDEXED, NameHierarchy("B"), false);
Node* a = graph.createNode(1, Node::NODE_NON_INDEXED, NameHierarchy("A", NAME_DELIMITER_CXX), false);
Node* b = graph.createNode(2, Node::NODE_NON_INDEXED, NameHierarchy("B", NAME_DELIMITER_CXX), false);
TS_ASSERT_EQUALS(2, graph.getNodeCount());
TS_ASSERT_EQUALS(0, graph.getEdgeCount());
@@ -257,8 +257,8 @@ public:
{
Graph graph;
Node* a = graph.createNode(1, Node::NODE_FUNCTION, NameHierarchy("A"), false);
Node* b = graph.createNode(2, Node::NODE_FUNCTION, NameHierarchy("B"), false);
Node* a = graph.createNode(1, Node::NODE_FUNCTION, NameHierarchy("A", NAME_DELIMITER_CXX), false);
Node* b = graph.createNode(2, Node::NODE_FUNCTION, NameHierarchy("B", NAME_DELIMITER_CXX), false);
Edge* e = graph.createEdge(3, Edge::EDGE_CALL, a, b);
@@ -273,8 +273,8 @@ public:
{
Graph graph;
Node* a = graph.createNode(1, Node::NODE_NON_INDEXED, NameHierarchy("A"), false);
graph.createNode(2, Node::NODE_NON_INDEXED, NameHierarchy("B"), false);
Node* a = graph.createNode(1, Node::NODE_NON_INDEXED, NameHierarchy("A", NAME_DELIMITER_CXX), false);
graph.createNode(2, Node::NODE_NON_INDEXED, NameHierarchy("B", NAME_DELIMITER_CXX), false);
TS_ASSERT_EQUALS(2, graph.getNodeCount());
TS_ASSERT_EQUALS(0, graph.getEdgeCount());
-2
View File
@@ -832,8 +832,6 @@ private:
std::shared_ptr<TestParserClient> parseCode(std::string code, bool logErrors = true)
{
NameHierarchy::setDelimiter(".");
std::shared_ptr<TestParserClient> parserClient = std::make_shared<TestParserClient>();
std::shared_ptr<TextAccess> textAccess = TextAccess::createFromString(code);
+13 -13
View File
@@ -1,8 +1,8 @@
#include "cxxtest/TestSuite.h"
#include "utility/utilityString.h"
#include "data/name/NameHierarchy.h"
#include "data/search/SearchIndex.h"
#include "utility/utilityString.h"
class SearchIndexTestSuite : public CxxTest::TestSuite
{
@@ -11,7 +11,7 @@ public:
void test_search_index_finds_id_of_element_added()
{
SearchIndex index;
index.addNode(1, NameHierarchy::deserialize("foo\tsvoid\tp() const").getQualifiedName());
index.addNode(1, NameHierarchy::deserialize("::\tmfoo\tsvoid\tp() const").getQualifiedName());
index.finishSetup();
std::vector<SearchResult> results = index.search("oo", 0);
@@ -23,7 +23,7 @@ public:
void test_search_index_finds_correct_indices_for_query()
{
SearchIndex index;
index.addNode(1, NameHierarchy::deserialize("foo\tsvoid\tp() const").getQualifiedName());
index.addNode(1, NameHierarchy::deserialize("::\tmfoo\tsvoid\tp() const").getQualifiedName());
index.finishSetup();
std::vector<SearchResult> results = index.search("oo", 0);
@@ -36,8 +36,8 @@ public:
void test_search_index_finds_ids_for_ambiguous_query()
{
SearchIndex index;
index.addNode(1, NameHierarchy::deserialize("for\tsvoid\tp() const").getQualifiedName());
index.addNode(2, NameHierarchy::deserialize("fos\tsvoid\tp() const").getQualifiedName());
index.addNode(1, NameHierarchy::deserialize("::\tmfor\tsvoid\tp() const").getQualifiedName());
index.addNode(2, NameHierarchy::deserialize("::\tmfos\tsvoid\tp() const").getQualifiedName());
index.finishSetup();
std::vector<SearchResult> results = index.search("fo", 0);
@@ -51,7 +51,7 @@ public:
void test_search_index_does_not_find_anything_after_clear()
{
SearchIndex index;
index.addNode(1, NameHierarchy::deserialize("foo\tsvoid\tp() const").getQualifiedName());
index.addNode(1, NameHierarchy::deserialize("::\tmfoo\tsvoid\tp() const").getQualifiedName());
index.finishSetup();
index.clear();
std::vector<SearchResult> results = index.search("oo", 0);
@@ -62,8 +62,8 @@ public:
void test_search_index_does_not_find_all_results_when_max_amount_is_limited()
{
SearchIndex index;
index.addNode(1, NameHierarchy::deserialize("foo1\tsvoid\tp() const").getQualifiedName());
index.addNode(2, NameHierarchy::deserialize("foo2\tsvoid\tp() const").getQualifiedName());
index.addNode(1, NameHierarchy::deserialize("::\tmfoo1\tsvoid\tp() const").getQualifiedName());
index.addNode(2, NameHierarchy::deserialize("::\tmfoo2\tsvoid\tp() const").getQualifiedName());
index.finishSetup();
std::vector<SearchResult> results = index.search("oo", 1);
@@ -73,8 +73,8 @@ public:
void test_search_index_query_is_case_insensitive()
{
SearchIndex index;
index.addNode(1, NameHierarchy::deserialize("foo1\tsvoid\tp() const").getQualifiedName());
index.addNode(2, NameHierarchy::deserialize("FOO2\tsvoid\tp() const").getQualifiedName());
index.addNode(1, NameHierarchy::deserialize("::\tmfoo1\tsvoid\tp() const").getQualifiedName());
index.addNode(2, NameHierarchy::deserialize("::\tmFOO2\tsvoid\tp() const").getQualifiedName());
index.finishSetup();
std::vector<SearchResult> results = index.search("oo", 0);
@@ -85,8 +85,8 @@ public:
{
SearchIndex index;
index.addNode(1, NameHierarchy::deserialize("oaabbcc\tsvoid\tp() const").getQualifiedName());
index.addNode(2, NameHierarchy::deserialize("ocbcabc\tsvoid\tp() const").getQualifiedName());
index.addNode(1, NameHierarchy::deserialize("::\tmoaabbcc\tsvoid\tp() const").getQualifiedName());
index.addNode(2, NameHierarchy::deserialize("::\tmocbcabc\tsvoid\tp() const").getQualifiedName());
index.finishSetup();
std::vector<SearchResult> results = index.search("abc", 0);
+35 -32
View File
@@ -2,8 +2,9 @@
#include "settings/Settings.h"
#include "settings/migration/SettingsMigrator.h"
#include "settings/migration/MigrationLambda.h"
#include "settings/migration/MigrationMoveKey.h"
#include "settings/migration/SettingsMigrationLambda.h"
#include "settings/migration/SettingsMigrationMoveKey.h"
#include "utility/text/TextAccess.h"
class SettingsMigratorTestSuite : public CxxTest::TestSuite
{
@@ -49,7 +50,7 @@ public:
);
SettingsMigrator migrator;
migrator.addMigration(1, std::make_shared<MigrationMoveKey>("value", "int"));
migrator.addMigration(1, std::make_shared<SettingsMigrationMoveKey>("value", "int"));
migrator.migrate(&settingsBefore, 1);
TS_ASSERT_EQUALS(settingsBefore.getAsText(), settingsAfter.getAsText());
@@ -75,7 +76,7 @@ public:
);
SettingsMigrator migrator;
migrator.addMigration(1, std::make_shared<MigrationMoveKey>("value", "sub/int"));
migrator.addMigration(1, std::make_shared<SettingsMigrationMoveKey>("value", "sub/int"));
migrator.migrate(&settingsBefore, 1);
TS_ASSERT_EQUALS(settingsBefore.getAsText(), settingsAfter.getAsText());
@@ -107,7 +108,7 @@ public:
);
SettingsMigrator migrator;
migrator.addMigration(1, std::make_shared<MigrationMoveKey>("values/value", "vals/value"));
migrator.addMigration(1, std::make_shared<SettingsMigrationMoveKey>("values/value", "vals/value"));
migrator.migrate(&settingsBefore, 1);
TS_ASSERT_EQUALS(settingsBefore.getAsText(), settingsAfter.getAsText());
@@ -139,7 +140,7 @@ public:
);
SettingsMigrator migrator;
migrator.addMigration(1, std::make_shared<MigrationMoveKey>("values/value", "values/val"));
migrator.addMigration(1, std::make_shared<SettingsMigrationMoveKey>("values/value", "values/val"));
migrator.migrate(&settingsBefore, 1);
TS_ASSERT_EQUALS(settingsBefore.getAsText(), settingsAfter.getAsText());
@@ -163,8 +164,8 @@ public:
);
SettingsMigrator migrator;
migrator.addMigration(1, std::make_shared<MigrationMoveKey>("value", "int"));
migrator.addMigration(2, std::make_shared<MigrationMoveKey>("int", "val"));
migrator.addMigration(1, std::make_shared<SettingsMigrationMoveKey>("value", "int"));
migrator.addMigration(2, std::make_shared<SettingsMigrationMoveKey>("int", "val"));
migrator.migrate(&settingsBefore, 1);
TS_ASSERT_EQUALS(settingsBefore.getAsText(), settingsAfter.getAsText());
@@ -189,8 +190,8 @@ public:
);
SettingsMigrator migrator;
migrator.addMigration(1, std::make_shared<MigrationMoveKey>("value", "int"));
migrator.addMigration(2, std::make_shared<MigrationMoveKey>("int", "val"));
migrator.addMigration(1, std::make_shared<SettingsMigrationMoveKey>("value", "int"));
migrator.addMigration(2, std::make_shared<SettingsMigrationMoveKey>("int", "val"));
migrator.migrate(&settingsBefore, 2);
TS_ASSERT_EQUALS(settingsBefore.getAsText(), settingsAfter.getAsText());
@@ -214,8 +215,8 @@ public:
);
SettingsMigrator migrator;
migrator.addMigration(1, std::make_shared<MigrationMoveKey>("value", "int"));
migrator.addMigration(2, std::make_shared<MigrationMoveKey>("int", "val"));
migrator.addMigration(1, std::make_shared<SettingsMigrationMoveKey>("value", "int"));
migrator.addMigration(2, std::make_shared<SettingsMigrationMoveKey>("int", "val"));
migrator.migrate(&settingsBefore, 2);
TS_ASSERT_EQUALS(settingsBefore.getAsText(), settingsAfter.getAsText());
@@ -241,8 +242,8 @@ public:
);
SettingsMigrator migrator;
migrator.addMigration(1, std::make_shared<MigrationMoveKey>("value", "val"));
migrator.addMigration(1, std::make_shared<MigrationMoveKey>("element", "ele"));
migrator.addMigration(1, std::make_shared<SettingsMigrationMoveKey>("value", "val"));
migrator.addMigration(1, std::make_shared<SettingsMigrationMoveKey>("element", "ele"));
migrator.migrate(&settingsBefore, 2);
TS_ASSERT_EQUALS(settingsBefore.getAsText(), settingsAfter.getAsText());
@@ -274,10 +275,10 @@ public:
);
SettingsMigrator migrator;
migrator.addMigration(1, std::make_shared<MigrationMoveKey>("value", "int/val"));
migrator.addMigration(1, std::make_shared<MigrationMoveKey>("element", "ele"));
migrator.addMigration(2, std::make_shared<MigrationMoveKey>("int/val", "int"));
migrator.addMigration(3, std::make_shared<MigrationMoveKey>("ele", "elements/element"));
migrator.addMigration(1, std::make_shared<SettingsMigrationMoveKey>("value", "int/val"));
migrator.addMigration(1, std::make_shared<SettingsMigrationMoveKey>("element", "ele"));
migrator.addMigration(2, std::make_shared<SettingsMigrationMoveKey>("int/val", "int"));
migrator.addMigration(3, std::make_shared<SettingsMigrationMoveKey>("ele", "elements/element"));
migrator.migrate(&settingsBefore, 3);
TS_ASSERT_EQUALS(settingsBefore.getAsText(), settingsAfter.getAsText());
@@ -302,8 +303,8 @@ public:
SettingsMigrator migrator;
migrator.addMigration(
1, std::make_shared<MigrationLambda>(
[](const Migration* migration, Settings* settings)
1, std::make_shared<SettingsMigrationLambda>(
[](const SettingsMigration* migration, Settings* settings)
{
migration->setValueInSettings<int>(settings, "value", migration->getValueFromSettings<int>(settings, "value", 0) * 2);
}
@@ -332,19 +333,21 @@ public:
SettingsMigrator migrator;
migrator.addMigration(
1, std::make_shared<MigrationLambda>(
[](const Migration* migration, Settings* settings)
{
migration->setValueInSettings<int>(settings, "value", migration->getValueFromSettings<int>(settings, "value", 0) * 2);
}
));
1, std::make_shared<SettingsMigrationLambda>(
[](const SettingsMigration* migration, Settings* settings)
{
migration->setValueInSettings<int>(settings, "value", migration->getValueFromSettings<int>(settings, "value", 0) * 2);
}
)
);
migrator.addMigration(
2, std::make_shared<MigrationLambda>(
[](const Migration* migration, Settings* settings)
{
migration->setValueInSettings<int>(settings, "value", migration->getValueFromSettings<int>(settings, "value", 0) - 1);
}
));
2, std::make_shared<SettingsMigrationLambda>(
[](const SettingsMigration* migration, Settings* settings)
{
migration->setValueInSettings<int>(settings, "value", migration->getValueFromSettings<int>(settings, "value", 0) - 1);
}
)
);
migrator.migrate(&settingsBefore, 2);
TS_ASSERT_EQUALS(settingsBefore.getAsText(), settingsAfter.getAsText());
+3 -5
View File
@@ -23,7 +23,7 @@ public:
std::string filePath = "path/to/test.h";
std::shared_ptr<IntermediateStorage> intermetiateStorage = std::make_shared<IntermediateStorage>();
Id id = intermetiateStorage->addNode(Node::typeToInt(Node::NODE_FILE), NameHierarchy::serialize(NameHierarchy(filePath)));
Id id = intermetiateStorage->addNode(Node::typeToInt(Node::NODE_FILE), NameHierarchy::serialize(NameHierarchy(filePath, NAME_DELIMITER_FILE)));
intermetiateStorage->addFile(id, filePath, "someTime", true);
storage.inject(intermetiateStorage.get());
@@ -249,8 +249,6 @@ private:
Id getEdgeId(Edge::EdgeType type, const NameHierarchy& fromName, const NameHierarchy& toName) const
{
NameHierarchy from;
return getIdForEdge(type, fromName, toName);
}
};
@@ -271,8 +269,8 @@ private:
NameHierarchy createNameHierarchy(std::string s) const
{
NameHierarchy nameHierarchy;
for (std::string element: utility::splitToVector(s, "::"))
NameHierarchy nameHierarchy(NAME_DELIMITER_CXX);
for (std::string element: utility::splitToVector(s, nameDelimiterTypeToString(NAME_DELIMITER_CXX)))
{
nameHierarchy.push(std::make_shared<NameElement>(element, NameElement::Signature()));
}