Chris@10: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@7: Chris@7: #include "Objects.h" Chris@11: #include "EditDistance.h" Chris@7: #include "TypeRegistrar.h" Chris@7: Chris@7: #include Chris@28: #include Chris@28: #include Chris@10: #include Chris@7: Chris@7: #include Chris@10: #include Chris@7: Chris@7: #include Chris@7: Chris@11: #ifdef TURBOT_PROFILER Chris@11: #include Chris@11: #endif Chris@11: Chris@7: using namespace Dataquay; Chris@7: using namespace ClassicalData; Chris@7: Chris@7: bool Chris@7: load(BasicStore *store, QString resourceName) Chris@7: { Chris@7: QTemporaryFile tf; Chris@7: if (!tf.open()) return false; Chris@7: tf.setAutoRemove(true); Chris@7: QFile f(resourceName); Chris@7: if (!f.open(QFile::ReadOnly)) return false; Chris@7: QByteArray buffer; Chris@7: int bufsiz = 10240; Chris@7: while (!f.atEnd()) { Chris@7: buffer = f.read(bufsiz); Chris@7: tf.write(buffer); Chris@7: } Chris@51: tf.close(); Chris@7: std::cerr << "unpacked, importing..." << std::endl; Chris@7: store->import("file://" + tf.fileName(), Chris@7: BasicStore::ImportPermitDuplicates, // fastest mode Chris@7: "ntriples"); Chris@7: return true; Chris@7: } Chris@7: Chris@7: int main(int argc, char **argv) Chris@7: { Chris@7: BasicStore *store = new BasicStore(); Chris@20: store->setBaseUri(Uri("http://dbtune.org/classical/resource/")); Chris@28: ObjectLoader *loader = new ObjectLoader(store); Chris@28: TypeMapping tm; Chris@7: Chris@22: TypeRegistrar::registerTypes(); Chris@28: TypeRegistrar::addMappings(store, &tm); Chris@28: Chris@28: loader->setTypeMapping(tm); Chris@7: Chris@7: if (!load(store, ":data.ntriples")) { Chris@7: std::cerr << "Failed to unpack and load resource" << std::endl; Chris@7: return 1; Chris@7: } Chris@7: Chris@7: std::cerr << "imported, mapping..." << std::endl; Chris@7: Chris@31: // QObject *root = loader->loadAllObjects(0); Chris@31: Chris@31: QObjectList objects; Chris@31: try { Chris@31: objects = loader->loadAll(); Chris@49: // std::cerr << "Loaded " << objects.size() << " objects" << std::endl; Chris@31: } catch (const std::exception &e) { Chris@31: std::cerr << "mapping failed: " << e.what() << std::endl; Chris@31: return 1; Chris@31: } Chris@8: Chris@28: delete loader; Chris@7: delete store; Chris@11: Chris@9: QObjectList composers; Chris@11: // std::cerr << "Known composers:" << std::endl; Chris@31: foreach (QObject *o, objects) { Chris@10: Composer *c = qobject_cast(o); Chris@10: if (c) { Chris@10: QString sn = c->getSortName(true); Chris@10: if (sn == "") { Chris@10: std::cerr << "WARNING: Composer " << c->name().toStdString() << " (URI " << c->property("uri").toString().toStdString() << ") has no sort-name" << std::endl; Chris@10: } else { Chris@11: // std::cerr << sn.toStdString() << std::endl; Chris@10: } Chris@10: composers.push_back(c); Chris@10: } Chris@9: } Chris@11: /* Chris@10: for (int i = 1; i < argc; ++i) { Chris@10: QString name = argv[i]; Chris@9: std::cerr << "Name: " << name.toStdString() << std::endl; Chris@10: QMultiMap matches; Chris@9: foreach (QObject *o, composers) { Chris@9: Composer *c = qobject_cast(o); Chris@9: if (!c) continue; Chris@10: int value = c->matchFuzzyName(name); Chris@10: matches.insert(value, c->getSortName(false)); Chris@9: } Chris@10: for (QMultiMap::const_iterator i = matches.begin(); Chris@10: i != matches.end(); ++i) { Chris@10: if (i.key() < 0) continue; Chris@10: std::cerr << "Score: " << i.key() << " for name: " << i.value().toStdString() << std::endl; Chris@10: } Chris@9: } Chris@11: */ Chris@11: while (!std::cin.eof()) { Chris@14: std::cerr << std::endl << "Enter composer name: "; Chris@11: std::string s; Chris@11: getline(std::cin, s); Chris@15: std::cerr << "[" << s << "]" << std::endl; Chris@14: QMultiMap matches; Chris@13: QRegExp sre("[\\., -]+"); Chris@13: QStringList elements = QString::fromStdString(s) Chris@13: .toLower().split(sre, QString::SkipEmptyParts); Chris@11: foreach (QObject *o, composers) { Chris@11: Composer *c = qobject_cast(o); Chris@11: if (!c) continue; Chris@16: // float value = c->matchFuzzyName(elements); Chris@16: float value = c->matchTyping(QString::fromStdString(s)); Chris@11: matches.insert(value, c->getSortName(false)); Chris@11: } Chris@11: int n = 0; Chris@14: for (QMultiMap::const_iterator i = matches.end(); Chris@11: i != matches.begin(); ) { Chris@11: --i; Chris@15: if (i.key() <= 0) continue; Chris@11: if (n == 0) { Chris@11: std::cerr << "Best match:" << std::endl << " * "; Chris@11: } else if (n == 1) { Chris@11: std::cerr << "Other candidate(s):" << std::endl << " - "; Chris@11: } else { Chris@11: std::cerr << " - "; Chris@11: } Chris@14: std::cerr << i.value().toStdString(); Chris@14: for (int c = i.value().length(); c < 40; ++c) std::cerr << " "; Chris@14: std::cerr << "[" << i.key() << "]" << std::endl; Chris@15: if (++n > 5) break; Chris@11: } Chris@11: if (n == 0) std::cerr << "No matches" << std::endl; Chris@11: } Chris@11: Chris@11: #ifdef TURBOT_PROFILER Chris@11: Turbot::Profiler::dump(); Chris@11: #endif Chris@8: Chris@9: /* Chris@8: std::cerr << "mapped, storing again..." << std::endl; Chris@8: Chris@9: // let's try just writing out the composers Chris@9: Chris@8: BasicStore *outstore = new BasicStore(); Chris@8: outstore->setBaseUri("http://dbtune.org/classical/resource/"); Chris@8: ObjectMapper *outmapper = new ObjectMapper(outstore); Chris@8: Chris@8: TypeRegistrar::addMappings(outstore, outmapper); Chris@8: Chris@9: // outmapper->storeObjectTree(root); Chris@9: outmapper->storeAllObjects(composers); Chris@8: delete outmapper; Chris@8: Chris@8: std::cerr << "stored, saving..." << std::endl; Chris@8: Chris@8: outstore->save("test-output.ttl"); Chris@8: Chris@8: delete outstore; Chris@9: */ Chris@7: } Chris@7: