view common/FeatureFileIndex.cpp @ 44:ed2befdf1e98

* Index for feature files (e.g. generated by Sonic Annotator)
author Chris Cannam
date Mon, 10 May 2010 17:33:00 +0100
parents
children 0033259c6772
line wrap: on
line source
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */

#include "FeatureFileIndex.h"
#include "TypeRegistrar.h"

#include <QMutexLocker>
#include <QDir>

#include "base/TempDirectory.h"
#include "base/Exceptions.h"

using namespace Dataquay;


namespace ClassicalData {

FeatureFileIndex *
FeatureFileIndex::getInstance()
{
    static FeatureFileIndex instance;
    return &instance;
}

FeatureFileIndex::FeatureFileIndex() :
    m_index(0)
{
    try {
	m_indexFileName = getIndexFileName();
    } catch (DirectoryCreationFailed f) {
        std::cerr << "FeatureFileIndex: ERROR: Failed to find or create index directory: " << f.what() << std::endl;
        return;
    }

    m_index = new BasicStore;

    TypeRegistrar::addMappings(m_index, 0);

    if (QFile(m_indexFileName).exists()) {
	m_index->import(QUrl::fromLocalFile(m_indexFileName),
			BasicStore::ImportIgnoreDuplicates);
	//!!! catch
    }
}

FeatureFileIndex::~FeatureFileIndex()
{
}

QString
FeatureFileIndex::getIndexFileName()
{
    QDir d = TempDirectory::getInstance()->getContainingPath();
    QString n("index");
    QFileInfo fi(d.filePath(n));

    if ((fi.exists() && !fi.isDir()) ||
        (!fi.exists() && !d.mkdir(n))) {
        throw DirectoryCreationFailed(fi.filePath());
    }

    return QDir(fi.filePath()).filePath("features.ttl");
}

QString
FeatureFileIndex::getFeatureDirectoryName()
{
    QDir d = TempDirectory::getInstance()->getContainingPath();
    QString n("features");
    QFileInfo fi(d.filePath(n));

    if ((fi.exists() && !fi.isDir()) ||
        (!fi.exists() && !d.mkdir(n))) {
        throw DirectoryCreationFailed(fi.filePath());
    }

    return fi.filePath();
}

void
FeatureFileIndex::loadFor(TrackFile *tf, BasicStore *store)
{
    if (!m_index) {
	std::cerr << "FeatureFileIndex::loadFor: No index!" << std::endl;
	return;
    }
    updateIndex();

    //...
}

void
FeatureFileIndex::updateIndex()
{
    QMutexLocker locker(&m_mutex);
    if (!m_index) return;

    QDir featureDir;
    try {
	QString s = getFeatureDirectoryName();
        featureDir = QDir(s);
    } catch (DirectoryCreationFailed f) {
        std::cerr << "FeatureFileIndex::updateIndex: ERROR: Failed to find or create feature directory: " << f.what() << std::endl;
        return;
    }

    featureDir.setFilter(QDir::Files);

    for (unsigned int i = 0; i < featureDir.count(); ++i) {

        QFileInfo fi(featureDir.filePath(featureDir[i]));

        if (fi.isFile() && fi.isReadable()) {
	    QUrl fileUrl(QUrl::fromLocalFile(fi.filePath()));
            try {
                BasicStore *b = BasicStore::load(fileUrl);
                Triples ts = b->match
                    (Triple(Node(), "a", m_index->expand("mo:AudioFile")));
                foreach (Triple t, ts) {
                    m_index->add(Triple(Uri(fileUrl), "a", m_index->expand("foaf:Document")));
                    m_index->add(Triple(Uri(fileUrl), "foaf:primaryTopic", t.a));;
                }
            } catch (...) { }
        }
    }

    //!!! remove triples from index that refer to nonexistent files?

    std::cerr << "Saving index to " << m_indexFileName.toStdString() << std::endl;
    m_index->save(m_indexFileName);
}


}