# HG changeset patch # User Chris Cannam # Date 1337428236 -3600 # Node ID f2de9a42830ef2b5248bed47d62bdd7d08b6afdb # Parent 211efc7703350a45f7c03244fad08eff96f4edae Convert a bit more of RDFTransformFactory to Dataquay diff -r 211efc770335 -r f2de9a42830e rdf/RDFTransformFactory.cpp --- a/rdf/RDFTransformFactory.cpp Fri May 18 21:23:12 2012 +0100 +++ b/rdf/RDFTransformFactory.cpp Sat May 19 12:50:36 2012 +0100 @@ -162,33 +162,22 @@ Nodes tnodes = m_store->match (Triple(Node(), "a", m_store->expand("vamp:Transform"))).a(); + PluginRDFIndexer *indexer = PluginRDFIndexer::getInstance(); + foreach (Node tnode, tnodes) { Node pnode = m_store->matchFirst (Triple(tnode, "vamp:plugin", Node())).c; - // There are various queries we need to make that might - // include data from either the transform RDF or the model - // accumulated from plugin descriptions. For example, the - // transform RDF may specify the output's true URI, or it - // might have a blank node or some other URI with the - // appropriate vamp:identifier included in the file. To cover - // both cases, we need to add the file itself into the model - // and always query the model using the transform URI rather - // than querying the file itself subsequently. + if (pnode == Node()) { + cerr << "RDFTransformFactory: WARNING: No vamp:plugin for " + << "vamp:Transform node " << tnode + << ", skipping this transform" << endl; + continue; + } -//!!! ^^^ what does this mean for us with Dataquay? do we need to cross-check outputs against the indexer? - - SimpleSPARQLQuery::addSourceToModel(m_urlString); - - PluginRDFIndexer *indexer = PluginRDFIndexer::getInstance(); - - for (int i = 0; i < transformResults.size(); ++i) { - - SimpleSPARQLQuery::KeyValueMap &result = transformResults[i]; - - QString transformUri = result["transform"].value; - QString pluginUri = result["plugin"].value; + QString transformUri = tnode.value; + QString pluginUri = pnode.value; QString pluginId = indexer->getIdForPluginURI(pluginUri); if (pluginId == "") { @@ -212,12 +201,7 @@ uriTransformMap[transformUri] = transform; - // We have to do this a very long way round, to work around - // rasqal's current inability to handle correctly more than one - // OPTIONAL graph in a query - static const char *optionals[] = { - "output", "program", "summary_type", "step_size", @@ -232,59 +216,34 @@ QString optional = optionals[j]; - QString queryTemplate = - " PREFIX vamp: " - - " SELECT ?%1 " - - " WHERE { " - " <%2> vamp:%1 ?%1 " - " } "; - - SimpleSPARQLQuery query - (SimpleSPARQLQuery::QueryFromModel, - queryTemplate.arg(optional).arg(transformUri)); - - SimpleSPARQLQuery::ResultList results = query.execute(); + Node onode = m_store->matchFirst + (Triple(Uri(transformUri), optional, Node())).c; - if (!query.isOK()) { - m_errorString = query.getErrorString(); - return transforms; - } + if (onode.type != Node::Literal) continue; - if (results.empty()) continue; - - for (int k = 0; k < results.size(); ++k) { - - const SimpleSPARQLQuery::Value &v = results[k][optional]; - - if (v.type == SimpleSPARQLQuery::LiteralValue) { - - if (optional == "program") { - transform.setProgram(v.value); - } else if (optional == "summary_type") { - transform.setSummaryType - (transform.stringToSummaryType(v.value)); - } else if (optional == "step_size") { - transform.setStepSize(v.value.toUInt()); - } else if (optional == "block_size") { - transform.setBlockSize(v.value.toUInt()); - } else if (optional == "window_type") { - transform.setWindowType - (Window::getTypeForName - (v.value.toLower().toStdString())); - } else if (optional == "sample_rate") { - transform.setSampleRate(v.value.toFloat()); - } else if (optional == "start") { - transform.setStartTime - (RealTime::fromXsdDuration(v.value.toStdString())); - } else if (optional == "duration") { - transform.setDuration - (RealTime::fromXsdDuration(v.value.toStdString())); - } else { - cerr << "RDFTransformFactory: ERROR: Inconsistent optionals lists (unexpected optional \"" << optional << "\"" << endl; - } - } + if (optional == "program") { + transform.setProgram(onode.value); + } else if (optional == "summary_type") { + transform.setSummaryType + (transform.stringToSummaryType(onode.value)); + } else if (optional == "step_size") { + transform.setStepSize(onode.value.toUInt()); + } else if (optional == "block_size") { + transform.setBlockSize(onode.value.toUInt()); + } else if (optional == "window_type") { + transform.setWindowType + (Window::getTypeForName + (onode.value.toLower().toStdString())); + } else if (optional == "sample_rate") { + transform.setSampleRate(onode.value.toFloat()); + } else if (optional == "start") { + transform.setStartTime + (RealTime::fromXsdDuration(onode.value.toStdString())); + } else if (optional == "duration") { + transform.setDuration + (RealTime::fromXsdDuration(onode.value.toStdString())); + } else { + cerr << "RDFTransformFactory: ERROR: Inconsistent optionals lists (unexpected optional \"" << optional << "\"" << endl; } } @@ -301,33 +260,36 @@ RDFTransformFactoryImpl::setOutput(Transform &transform, QString transformUri) { - SimpleSPARQLQuery::Value outputValue = - SimpleSPARQLQuery::singleResultQuery - (SimpleSPARQLQuery::QueryFromModel, - QString - ( - " PREFIX vamp: " - - " SELECT ?output_id " + Node outputNode = m_store->matchFirst + (Triple(Uri(transformUri), "vamp:output", Node())).c; + + if (outputNode == Node()) return true; - " WHERE { " - " <%1> vamp:output ?output . " - " ?output vamp:identifier ?output_id " - " } " - ) - .arg(transformUri), - "output_id"); - - if (outputValue.type == SimpleSPARQLQuery::NoValue) { - return true; + if (outputNode.type != Node::URI && outputNode.type != Node::Blank) { + m_errorString = QString("vamp:output for output of transform <%1> is not a URI or blank node").arg(transformUri); + return false; } - - if (outputValue.type != SimpleSPARQLQuery::LiteralValue) { + + // Now, outputNode might be the subject of a triple within m_store + // that tells us the vamp:identifier, or it might be the subject + // of a triple within the indexer that tells us it + + Node identNode = m_store->matchFirst + (Triple(outputNode, "vamp:identifier", Node())).c; + + if (identNode == Node()) { + PluginRDFIndexer *indexer = PluginRDFIndexer::getInstance(); + const BasicStore *index = indexer->getIndex(); + identNode = index->matchFirst + (Triple(outputNode, "vamp:identifier", Node())).c; + } + + if (identNode == Node() || identNode.type != Node::Literal) { m_errorString = QString("No vamp:identifier found for output of transform <%1>, or vamp:identifier is not a literal").arg(transformUri); return false; } - transform.setOutput(outputValue.value); + transform.setOutput(identNode.value); return true; }