Exemplo n.º 1
0
double Soprano::Index::CLuceneIndex::getScore( const Soprano::Node& resource, lucene::search::Query* query )
{
    QMutexLocker lock( &d->mutex );

    clearError();
    try {
        // rewrite the query
        lucene::index::Term queryTerm( idFieldName().data(), TString( d->getId( resource ) ).data() );
        lucene::search::TermQuery idQuery( &queryTerm );
        lucene::search::BooleanQuery combinedQuery;
        combinedQuery.add( &idQuery, true, false );
        combinedQuery.add( query, true, false );

        // fetch the score when the URI matches the original query
        lucene::search::TopDocs* docs = static_cast<lucene::search::Searchable*>( d->getIndexSearcher() )->_search( &combinedQuery, 0, 1 );
        double r = -1.0;
        if ( docs->totalHits > 0 ) {
#ifdef CL_VERSION_19_OR_GREATER
            r = docs->scoreDocs[0].score;
#else
            r = docs->scoreDocs[0]->score;
#endif
        }
        _CLDELETE( docs );
        return r;
    }
    catch( CLuceneError& err ) {
        qDebug() << "search failed: " << err.what();
        setError( exceptionToError( err ) );
        return 0.0;
    }
}
Exemplo n.º 2
0
void Soprano::Index::CLuceneIndex::dump( QTextStream& s ) const
{
    QMutexLocker lock( &d->mutex );

    clearError();
    try  {
        lucene::index::IndexReader* reader = d->getIndexReader();

        for ( int i = 0; i < reader->numDocs(); ++i ) {
            lucene::document::Document* doc = reader->document( i );
            s << "Document " << i << endl
              << "====================" << endl;
            lucene::document::DocumentFieldEnumeration* e = doc->fields();
            while ( e->hasMoreElements() ) {
                lucene::document::Field* field = e->nextElement();

                s << TString( field->name(), true ).toQString() << ": "
                  << TString( field->stringValue(), true ).toQString()
                  << endl;
            }
            s << endl;
            _CLDELETE( e );
            _CLDELETE( doc );
        }

        s << flush;
    }
    catch( CLuceneError& err ) {
        qDebug() << "(Soprano::Index::CLuceneIndex) failed to dump index.";
        setError( exceptionToError( err ) );
    }
}
Exemplo n.º 3
0
Soprano::Iterator<Soprano::Index::QueryHit> Soprano::Index::CLuceneIndex::search( const QString& query )
{
    clearError();
    try {
        lucene::queryParser::QueryParser parser( textFieldName().data(), d->queryAnalyzer ? d->queryAnalyzer : d->analyzer );
        lucene::search::Query* q = parser.parse( TString( query ).data() );
        if ( !q ) {
            setError( QString( "Failed to parse CLucene query: '%1'" ).arg( query ) );
            return Iterator<QueryHit>();
        }
        else {
            Iterator<QueryHit> hits = search( q );
            // FIXME: is it possible to use the CLucene ref counting here?
            if ( !hits.isValid() ) {
                delete q;
            }
            return hits;
        }
    }
    catch( CLuceneError& err ) {
        qDebug() << "search" << query << "failed: " << err.what();
        setError( exceptionToError( err ) );
        return Iterator<QueryHit>();
    }
}
Exemplo n.º 4
0
Soprano::Iterator<Soprano::Index::QueryHit> Soprano::Index::CLuceneIndex::search( lucene::search::Query* query )
{
    QMutexLocker lock( &d->mutex );

    if ( query ) {
        clearError();
        try {
            lucene::search::Hits* hits = d->getIndexSearcher()->search( query );
            if ( hits ) {
                return new QueryHitIteratorBackend( hits, query );
            }
            else {
                return Iterator<QueryHit>();
            }
        }
        catch( CLuceneError& err ) {
            qDebug() << "search failed: " << err.what();
            setError( exceptionToError( err ) );
            return Iterator<QueryHit>();
        }
    }
    else {
        setError( "Invalid CLucene query" );
        return Iterator<QueryHit>();
    }
}
Exemplo n.º 5
0
bool Soprano::Index::CLuceneIndex::closeTransaction( int id )
{
//    qDebug() << "CLuceneIndex::closeTransaction in thread " << QThread::currentThreadId();
    QMutexLocker lock( &d->mutex );

    if ( id == d->transactionID && id > 0 ) {
        clearError();
        try {
            d->commit();
        }
        catch( CLuceneError& err ) {
            setError( exceptionToError( err ) );
//            qDebug() << "CLuceneIndex::closeTransaction done in thread " << QThread::currentThreadId();
            return false;
        }

        d->transactionID = 0;
//        qDebug() << "CLuceneIndex::closeTransaction done in thread " << QThread::currentThreadId();
        return true;
    }
    else {
        setError( QString( "Invalid transaction ID: %1" ).arg( id ) );
//        qDebug() << "CLuceneIndex::closeTransaction done in thread " << QThread::currentThreadId();
        return false;
    }
}
Exemplo n.º 6
0
void Soprano::Index::CLuceneIndex::clear()
{
    if ( d->indexPresent() ) {
        try {
            int numDocs = d->getIndexReader()->maxDoc();
            for ( int i = 0; i < numDocs; ++i ) {
                d->getIndexReader()->deleteDocument( i );
            }
            d->closeReader();
        }
        catch( CLuceneError& err ) {
            setError( exceptionToError( err ) );
        }
    }
}
Exemplo n.º 7
0
double Soprano::Index::CLuceneIndex::getScore( const Soprano::Node& resource, const QString& query )
{
    clearError();
    try {
        lucene::search::Query* q = lucene::queryParser::QueryParser::parse( TString( query ).data(), textFieldName().data(), d->analyzer );
        double score = getScore( resource, q );
        delete( q );
        return score;
    }
    catch( CLuceneError& err ) {
        qDebug() << "search failed: " << err.what();
        setError( exceptionToError( err ) );
        return 0.0;
    }
}
Exemplo n.º 8
0
int Soprano::Index::CLuceneIndex::resourceCount() const
{
    QMutexLocker lock( &d->mutex );

    clearError();
    try  {
        lucene::index::IndexReader* reader = d->getIndexReader();
        return reader->numDocs();
    }
    catch( CLuceneError& err ) {
        qDebug() << "(Soprano::Index::CLuceneIndex) failed to dump index.";
        setError( exceptionToError( err ) );
        return -1;
    }
}
Exemplo n.º 9
0
Soprano::Error::ErrorCode Soprano::Index::CLuceneIndex::removeStatement( const Soprano::Statement& statement )
{
//    qDebug() << "CLuceneIndex::removeStatement in thread " << QThread::currentThreadId();
    QMutexLocker lock( &d->mutex );

    clearError();

    // just for speed
    if ( !d->indexPresent() ) {
//        qDebug() << "CLuceneIndex::removeStatement done in thread " << QThread::currentThreadId();
        return Error::ErrorNone;
    }

    bool success = false;

    QString field = QString::fromLatin1( statement.predicate().uri().toEncoded() );
    QString text = statement.object().isResource()
                   ? QString::fromLatin1( statement.object().uri().toEncoded() )
                   : statement.object().toString();

    if( text.isEmpty() ) {
        return Error::ErrorNone;
    }

    try {
        lucene::document::Document* document = d->getDocument( statement.subject() );
        if ( document ) {
            CLuceneDocumentWrapper docWrapper( document );
            docWrapper.removeProperty( field, text, statement.object().isResource() );
            if ( d->transactionID == 0 ) {
                d->commit();
            }
            success = true;
        }
    }
    catch( CLuceneError& err ) {
        qDebug() << "(Soprano::Index::CLuceneIndex::removeStatement) Exception occurred: " << err.what();
        setError( exceptionToError( err ) );
        success = false;
    }

//    qDebug() << "CLuceneIndex::removeStatement done in thread " << QThread::currentThreadId();
    return success ? Error::ErrorNone : Error::ErrorUnknown;
}
Exemplo n.º 10
0
Soprano::Error::ErrorCode Soprano::Index::CLuceneIndex::addStatement( const Soprano::Statement& statement )
{
//    qDebug() << "CLuceneIndex::addStatement in thread " << QThread::currentThreadId();
    QMutexLocker lock( &d->mutex );

    clearError();

    QString field = QString::fromLatin1( statement.predicate().uri().toEncoded() );
    QString text = statement.object().isResource()
                   ? QString::fromLatin1( statement.object().uri().toEncoded() )
                   : statement.object().toString();

    if( text.isEmpty() ) {
        setError( "Cannot index object nodes that convert to an empty string." );
//        qDebug() << "CLuceneIndex::addStatement done in thread " << QThread::currentThreadId();
        return Error::ErrorUnknown;
    }

    bool success = true;

    try {
        lucene::document::Document* document = d->getDocument( statement.subject() );
        if ( document ) {
            CLuceneDocumentWrapper docWrapper( document );
            docWrapper.addProperty( field, text, statement.object().isResource() );
            if ( d->transactionID == 0 ) {
                d->commit();
            }
            success = true;
        }
        else {
            // error already set in documentForResource
            success = false;
        }
    }
    catch( CLuceneError& err ) {
        setError( exceptionToError( err ) );
        success = false;
    }

//    qDebug() << "CLuceneIndex::addStatement done in thread " << QThread::currentThreadId();
    return success ? Error::ErrorNone : Error::ErrorUnknown;
}
Exemplo n.º 11
0
lucene::document::Document* Soprano::Index::CLuceneIndex::documentForResource( const Node& resource )
{
    QMutexLocker lock( &d->mutex );

    clearError();

    if ( d->transactionID == 0 ) {
        setError( "No transaction started." );
        return 0;
    }
    try {
        return d->getDocument( resource );
    }
    catch( CLuceneError& err ) {
        qDebug() << "(Soprano::Index::CLuceneIndex) Exception occurred: " << err.what();
        setError( exceptionToError( err ) );
        return 0;
    }
}
Exemplo n.º 12
0
bool Soprano::Index::CLuceneIndex::open( const QString& folder, bool force )
{
//    qDebug() << "CLuceneIndex::open in thread " << QThread::currentThreadId();
    close();

    clearError();

    QMutexLocker lock( &d->mutex );

    try {
        d->indexDir = lucene::store::FSDirectory::getDirectory( QFile::encodeName( folder ).data(), !QFile::exists( folder ) );
    }
    catch( CLuceneError& err ) {
        qDebug() << "(Soprano::Index::CLuceneIndex) failed to open index folder " << folder << " (" << err.what() << ")";
        setError( exceptionToError( err ) );
        return false;
    }

    if ( !d->indexDir ) {
        return false;
    }

    // get rid of any locks that may have been left by previous (crashed)
    // sessions
    if ( lucene::index::IndexReader::isLocked( d->indexDir ) ) {
        if ( force ) {
            qDebug() << "(Soprano::Index::CLuceneIndex::open) unlocking directory " << folder;
            lucene::index::IndexReader::unlock( d->indexDir );
        }
        else {
            qDebug() << "(Soprano::Index::CLuceneIndex::open) index folder is locked! Make sure no other clucene processes work on the same data." << folder;

            setError( QString( "Index folder '%1' is locked." ).arg( folder ) );
            return false;
        }
    }

//    qDebug() << "CLuceneIndex::open done in thread " << QThread::currentThreadId();

    return true;
}
Exemplo n.º 13
0
QVariant QDeclarativeExpressionPrivate::evalQtScript(QObject *secondaryScope, bool *isUndefined)
{
    QDeclarativeExpressionData *data = this->data;
    QDeclarativeEngine *engine = data->context()->engine;
    QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(engine);

    QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine);

    if (!data->expressionFunctionValid) {

        QScriptContext *scriptContext = QScriptDeclarativeClass::pushCleanContext(scriptEngine);
        data->expressionContext = ep->contextClass->newContext(data->context(), data->me);
        scriptContext->pushScope(data->expressionContext);
        scriptContext->pushScope(ep->globalClass->globalObject());

        if (data->expressionRewritten) {
            data->expressionFunction = scriptEngine->evaluate(data->expression, 
                                                              data->url, data->line);
        } else {
            QDeclarativeRewrite::RewriteBinding rewriteBinding;

            bool ok = true;
            const QString code = rewriteBinding(data->expression, &ok);
            if (!ok) {
                scriptEngine->popContext();
                return QVariant();
            }
            data->expressionFunction = scriptEngine->evaluate(code, data->url, data->line);
        }

        scriptEngine->popContext();
        data->expressionFunctionValid = true;
    }

    QDeclarativeContextData *oldSharedContext = 0;
    QObject *oldSharedScope = 0;
    QObject *oldOverride = 0;
    if (data->isShared) {
        oldSharedContext = ep->sharedContext;
        oldSharedScope = ep->sharedScope;
        ep->sharedContext = data->context();
        ep->sharedScope = data->me;
    } else {
        oldOverride = ep->contextClass->setOverrideObject(data->expressionContext, secondaryScope);
    }

    QScriptValue svalue = data->expressionFunction.call();

    if (data->isShared) {
        ep->sharedContext = oldSharedContext;
        ep->sharedScope = oldSharedScope;
    } else {
        ep->contextClass->setOverrideObject(data->expressionContext, oldOverride);
    }

    if (isUndefined)
        *isUndefined = svalue.isUndefined() || scriptEngine->hasUncaughtException();

    // Handle exception
    if (scriptEngine->hasUncaughtException()) {
       exceptionToError(scriptEngine, data->error);
       scriptEngine->clearExceptions();
       return QVariant();
    } else {
        data->error = QDeclarativeError();
    }

    QVariant rv;

    if (svalue.isArray()) {
        int length = svalue.property(QLatin1String("length")).toInt32();
        if (length && svalue.property(0).isObject()) {
            QList<QObject *> list;
            for (int ii = 0; ii < length; ++ii) {
                QScriptValue arrayItem = svalue.property(ii);
                QObject *d = arrayItem.toQObject();
                list << d;
            }
            rv = QVariant::fromValue(list);
        }
    } else if (svalue.isObject() &&
               ep->objectClass->scriptClass(svalue) == ep->objectClass) {
        QObject *o = svalue.toQObject();
        int type = QMetaType::QObjectStar;
        // If the object is null, we extract the predicted type.  While this isn't
        // 100% reliable, in many cases it gives us better error messages if we
        // assign this null-object to an incompatible property
        if (!o) type = ep->objectClass->objectType(svalue);

        return QVariant(type, &o);
    }

    if (rv.isNull())
        rv = svalue.toVariant();

    return rv;
}