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