Chris@10
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
Chris@7
|
2
|
Chris@7
|
3 #include "Objects.h"
|
Chris@11
|
4 #include "EditDistance.h"
|
Chris@7
|
5 #include "TypeRegistrar.h"
|
Chris@7
|
6
|
Chris@7
|
7 #include <dataquay/BasicStore.h>
|
Chris@28
|
8 #include <dataquay/objectmapper/ObjectLoader.h>
|
Chris@28
|
9 #include <dataquay/objectmapper/TypeMapping.h>
|
Chris@10
|
10 #include <dataquay/Debug.h>
|
Chris@7
|
11
|
Chris@7
|
12 #include <QTemporaryFile>
|
Chris@10
|
13 #include <QMultiMap>
|
Chris@7
|
14
|
Chris@7
|
15 #include <iostream>
|
Chris@7
|
16
|
Chris@11
|
17 #ifdef TURBOT_PROFILER
|
Chris@11
|
18 #include <base/Profiler.h>
|
Chris@11
|
19 #endif
|
Chris@11
|
20
|
Chris@7
|
21 using namespace Dataquay;
|
Chris@7
|
22 using namespace ClassicalData;
|
Chris@7
|
23
|
Chris@7
|
24 bool
|
Chris@7
|
25 load(BasicStore *store, QString resourceName)
|
Chris@7
|
26 {
|
Chris@7
|
27 QTemporaryFile tf;
|
Chris@7
|
28 if (!tf.open()) return false;
|
Chris@7
|
29 tf.setAutoRemove(true);
|
Chris@7
|
30 QFile f(resourceName);
|
Chris@7
|
31 if (!f.open(QFile::ReadOnly)) return false;
|
Chris@7
|
32 QByteArray buffer;
|
Chris@7
|
33 int bufsiz = 10240;
|
Chris@7
|
34 while (!f.atEnd()) {
|
Chris@7
|
35 buffer = f.read(bufsiz);
|
Chris@7
|
36 tf.write(buffer);
|
Chris@7
|
37 }
|
Chris@51
|
38 tf.close();
|
Chris@7
|
39 std::cerr << "unpacked, importing..." << std::endl;
|
Chris@7
|
40 store->import("file://" + tf.fileName(),
|
Chris@7
|
41 BasicStore::ImportPermitDuplicates, // fastest mode
|
Chris@7
|
42 "ntriples");
|
Chris@7
|
43 return true;
|
Chris@7
|
44 }
|
Chris@7
|
45
|
Chris@7
|
46 int main(int argc, char **argv)
|
Chris@7
|
47 {
|
Chris@7
|
48 BasicStore *store = new BasicStore();
|
Chris@20
|
49 store->setBaseUri(Uri("http://dbtune.org/classical/resource/"));
|
Chris@28
|
50 ObjectLoader *loader = new ObjectLoader(store);
|
Chris@28
|
51 TypeMapping tm;
|
Chris@7
|
52
|
Chris@22
|
53 TypeRegistrar::registerTypes();
|
Chris@28
|
54 TypeRegistrar::addMappings(store, &tm);
|
Chris@28
|
55
|
Chris@28
|
56 loader->setTypeMapping(tm);
|
Chris@7
|
57
|
Chris@7
|
58 if (!load(store, ":data.ntriples")) {
|
Chris@7
|
59 std::cerr << "Failed to unpack and load resource" << std::endl;
|
Chris@7
|
60 return 1;
|
Chris@7
|
61 }
|
Chris@7
|
62
|
Chris@7
|
63 std::cerr << "imported, mapping..." << std::endl;
|
Chris@7
|
64
|
Chris@31
|
65 // QObject *root = loader->loadAllObjects(0);
|
Chris@31
|
66
|
Chris@31
|
67 QObjectList objects;
|
Chris@31
|
68 try {
|
Chris@31
|
69 objects = loader->loadAll();
|
Chris@49
|
70 // std::cerr << "Loaded " << objects.size() << " objects" << std::endl;
|
Chris@31
|
71 } catch (const std::exception &e) {
|
Chris@31
|
72 std::cerr << "mapping failed: " << e.what() << std::endl;
|
Chris@31
|
73 return 1;
|
Chris@31
|
74 }
|
Chris@8
|
75
|
Chris@28
|
76 delete loader;
|
Chris@7
|
77 delete store;
|
Chris@11
|
78
|
Chris@9
|
79 QObjectList composers;
|
Chris@11
|
80 // std::cerr << "Known composers:" << std::endl;
|
Chris@31
|
81 foreach (QObject *o, objects) {
|
Chris@10
|
82 Composer *c = qobject_cast<Composer *>(o);
|
Chris@10
|
83 if (c) {
|
Chris@10
|
84 QString sn = c->getSortName(true);
|
Chris@10
|
85 if (sn == "") {
|
Chris@10
|
86 std::cerr << "WARNING: Composer " << c->name().toStdString() << " (URI " << c->property("uri").toString().toStdString() << ") has no sort-name" << std::endl;
|
Chris@10
|
87 } else {
|
Chris@11
|
88 // std::cerr << sn.toStdString() << std::endl;
|
Chris@10
|
89 }
|
Chris@10
|
90 composers.push_back(c);
|
Chris@10
|
91 }
|
Chris@9
|
92 }
|
Chris@11
|
93 /*
|
Chris@10
|
94 for (int i = 1; i < argc; ++i) {
|
Chris@10
|
95 QString name = argv[i];
|
Chris@9
|
96 std::cerr << "Name: " << name.toStdString() << std::endl;
|
Chris@10
|
97 QMultiMap<int, QString> matches;
|
Chris@9
|
98 foreach (QObject *o, composers) {
|
Chris@9
|
99 Composer *c = qobject_cast<Composer *>(o);
|
Chris@9
|
100 if (!c) continue;
|
Chris@10
|
101 int value = c->matchFuzzyName(name);
|
Chris@10
|
102 matches.insert(value, c->getSortName(false));
|
Chris@9
|
103 }
|
Chris@10
|
104 for (QMultiMap<int, QString>::const_iterator i = matches.begin();
|
Chris@10
|
105 i != matches.end(); ++i) {
|
Chris@10
|
106 if (i.key() < 0) continue;
|
Chris@10
|
107 std::cerr << "Score: " << i.key() << " for name: " << i.value().toStdString() << std::endl;
|
Chris@10
|
108 }
|
Chris@9
|
109 }
|
Chris@11
|
110 */
|
Chris@11
|
111 while (!std::cin.eof()) {
|
Chris@14
|
112 std::cerr << std::endl << "Enter composer name: ";
|
Chris@11
|
113 std::string s;
|
Chris@11
|
114 getline(std::cin, s);
|
Chris@15
|
115 std::cerr << "[" << s << "]" << std::endl;
|
Chris@14
|
116 QMultiMap<float, QString> matches;
|
Chris@13
|
117 QRegExp sre("[\\., -]+");
|
Chris@13
|
118 QStringList elements = QString::fromStdString(s)
|
Chris@13
|
119 .toLower().split(sre, QString::SkipEmptyParts);
|
Chris@11
|
120 foreach (QObject *o, composers) {
|
Chris@11
|
121 Composer *c = qobject_cast<Composer *>(o);
|
Chris@11
|
122 if (!c) continue;
|
Chris@16
|
123 // float value = c->matchFuzzyName(elements);
|
Chris@16
|
124 float value = c->matchTyping(QString::fromStdString(s));
|
Chris@11
|
125 matches.insert(value, c->getSortName(false));
|
Chris@11
|
126 }
|
Chris@11
|
127 int n = 0;
|
Chris@14
|
128 for (QMultiMap<float, QString>::const_iterator i = matches.end();
|
Chris@11
|
129 i != matches.begin(); ) {
|
Chris@11
|
130 --i;
|
Chris@15
|
131 if (i.key() <= 0) continue;
|
Chris@11
|
132 if (n == 0) {
|
Chris@11
|
133 std::cerr << "Best match:" << std::endl << " * ";
|
Chris@11
|
134 } else if (n == 1) {
|
Chris@11
|
135 std::cerr << "Other candidate(s):" << std::endl << " - ";
|
Chris@11
|
136 } else {
|
Chris@11
|
137 std::cerr << " - ";
|
Chris@11
|
138 }
|
Chris@14
|
139 std::cerr << i.value().toStdString();
|
Chris@14
|
140 for (int c = i.value().length(); c < 40; ++c) std::cerr << " ";
|
Chris@14
|
141 std::cerr << "[" << i.key() << "]" << std::endl;
|
Chris@15
|
142 if (++n > 5) break;
|
Chris@11
|
143 }
|
Chris@11
|
144 if (n == 0) std::cerr << "No matches" << std::endl;
|
Chris@11
|
145 }
|
Chris@11
|
146
|
Chris@11
|
147 #ifdef TURBOT_PROFILER
|
Chris@11
|
148 Turbot::Profiler::dump();
|
Chris@11
|
149 #endif
|
Chris@8
|
150
|
Chris@9
|
151 /*
|
Chris@8
|
152 std::cerr << "mapped, storing again..." << std::endl;
|
Chris@8
|
153
|
Chris@9
|
154 // let's try just writing out the composers
|
Chris@9
|
155
|
Chris@8
|
156 BasicStore *outstore = new BasicStore();
|
Chris@8
|
157 outstore->setBaseUri("http://dbtune.org/classical/resource/");
|
Chris@8
|
158 ObjectMapper *outmapper = new ObjectMapper(outstore);
|
Chris@8
|
159
|
Chris@8
|
160 TypeRegistrar::addMappings(outstore, outmapper);
|
Chris@8
|
161
|
Chris@9
|
162 // outmapper->storeObjectTree(root);
|
Chris@9
|
163 outmapper->storeAllObjects(composers);
|
Chris@8
|
164 delete outmapper;
|
Chris@8
|
165
|
Chris@8
|
166 std::cerr << "stored, saving..." << std::endl;
|
Chris@8
|
167
|
Chris@8
|
168 outstore->save("test-output.ttl");
|
Chris@8
|
169
|
Chris@8
|
170 delete outstore;
|
Chris@9
|
171 */
|
Chris@7
|
172 }
|
Chris@7
|
173
|