Ignore:
Timestamp:
May 5, 2011, 5:36:53 AM (14 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

Location:
trunk
Files:
76 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/tools/assistant/lib/fulltextsearch/fulltextsearch.pro

    r631 r846  
    3232    CONFIG -= exceptions_off
    3333    CONFIG += exceptions
    34     !win32|win32-g++ {
     34    !win32|win32-g++* {
    3535        QMAKE_CFLAGS -= -fno-exceptions
    3636        QMAKE_CXXFLAGS -= -fno-exceptions
     
    4949# the following define could be set globally in case we need it elsewhere
    5050solaris* {
    51     DEFINES += Q_SOLARIS_VERSION=$$system(uname -r | sed -e 's/5\.//')
     51    DEFINES += Q_SOLARIS_VERSION=$$system(uname -r | sed -e 's/5\\.//')
    5252}
  • trunk/tools/assistant/lib/fulltextsearch/qanalyzer.cpp

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qanalyzer_p.h

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qclucene-config_p.h

    r769 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
     
    315315#endif
    316316
    317 // Do not use the tchar.h that ships with mingw, this causes the qt build to
    318 // fail (211547, 211401, etc...), reuse the replacement as with any other compiler
    319 // #if defined(__MINGW32__)
    320 //     /* Define to 1 if you have the <tchar.h> header file. */
    321 // #   ifndef _CL_HAVE_TCHAR_H
    322 // #   define _CL_HAVE_TCHAR_H  1
    323 // #   endif
    324 // #endif
     317#if defined(__MINGW32__)
     318     /* Define to 1 if you have the <tchar.h> header file. */
     319 #   ifndef _CL_HAVE_TCHAR_H
     320 #   define _CL_HAVE_TCHAR_H  1
     321 #   endif
     322#endif
    325323
    326324#if defined(__MINGW32__) || defined(__SUNPRO_CC) || defined(__SUNPRO_C)
  • trunk/tools/assistant/lib/fulltextsearch/qclucene_global_p.h

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
     
    3737#include <QtCore/QString>
    3838
    39 #if !defined(_MSC_VER)
     39#if !defined(_MSC_VER) && !defined(__MINGW32__) && defined(_CL_HAVE_WCHAR_H) && defined(_CL_HAVE_WCHAR_T)
    4040#   if !defined(TCHAR)
    4141#       if defined(_CL_HAVE_WCHAR_H) && defined(_CL_HAVE_WCHAR_T) && !defined(_ASCII)
  • trunk/tools/assistant/lib/fulltextsearch/qdocument.cpp

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qdocument_p.h

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qfield.cpp

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qfield_p.h

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qfilter.cpp

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qfilter_p.h

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qhits.cpp

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qhits_p.h

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qindexreader.cpp

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qindexreader_p.h

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qindexwriter.cpp

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
     
    8989
    9090    d->writer->addIndexes(readerArray);
    91     delete readerArray;
     91    delete [] readerArray;
    9292}
    9393
  • trunk/tools/assistant/lib/fulltextsearch/qindexwriter_p.h

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qquery.cpp

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qquery_p.h

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qqueryparser.cpp

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qqueryparser_p.h

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qreader.cpp

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qreader_p.h

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qsearchable.cpp

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qsearchable_p.h

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qsort.cpp

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
     
    8585    for (int i = 0; i < fieldNames.count(); ++i)
    8686        delete [] nameArray[i];
    87     delete nameArray;
     87    delete [] nameArray;
    8888}
    8989
  • trunk/tools/assistant/lib/fulltextsearch/qsort_p.h

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
     
    6565{
    6666public:
    67         QCLuceneSort();
    68         QCLuceneSort(const QStringList &fieldNames);
    69     QCLuceneSort(const QString &field, bool reverse = false);
     67    QCLuceneSort();
     68    explicit QCLuceneSort(const QStringList &fieldNames);
     69    explicit QCLuceneSort(const QString &field, bool reverse = false);
    7070
    7171    virtual ~QCLuceneSort();
     
    7373    QString toString() const;
    7474    void setSort(const QStringList &fieldNames);
    75         void setSort(const QString &field, bool reverse = false);
     75    void setSort(const QString &field, bool reverse = false);
    7676
    7777protected:
  • trunk/tools/assistant/lib/fulltextsearch/qterm.cpp

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qterm_p.h

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qtoken.cpp

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qtoken_p.h

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qtokenizer.cpp

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qtokenizer_p.h

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qtokenstream.cpp

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/fulltextsearch/qtokenstream_p.h

    r651 r846  
    44** All rights reserved.
    55**
    6 ** Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     6** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    77** All rights reserved.
    88**
  • trunk/tools/assistant/lib/lib.pro

    r561 r846  
    2424    QtXml
    2525LIBS_PRIVATE += -l$$qclucene
    26 
    2726RESOURCES += helpsystem.qrc
    2827SOURCES += qhelpenginecore.cpp \
     
    4241    qhelpsearchindexreader_default.cpp \
    4342    qhelpsearchindexreader.cpp \
     43    qclucenefieldnames.cpp \
    4444    qhelp_global.cpp
    4545
     
    6464    qhelpsearchindexwriter_default_p.h \
    6565    qhelpsearchindexreader_default_p.h \
    66     qhelpsearchindexreader_p.h
     66    qhelpsearchindexreader_p.h \
     67    qclucenefieldnames_p.h
    6768
    6869# access to clucene
  • trunk/tools/assistant/lib/qhelp_global.cpp

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    4040****************************************************************************/
    4141
     42#include <QtCore/QCoreApplication>
    4243#include <QtCore/QRegExp>
    4344#include <QtCore/QMutexLocker>
     
    5657
    5758    return QString::fromLatin1("%1-%2-%3").
    58         arg(name).arg(long(pointer)).arg(counter);
     59        arg(name).arg(quintptr(pointer)).arg(counter);
    5960}
    6061
    6162QString QHelpGlobal::documentTitle(const QString &content)
    6263{
    63     QString title = QObject::tr("Untitled");
     64    QString title = QCoreApplication::translate("QHelp", "Untitled");
    6465    if (!content.isEmpty()) {
    6566        int start = content.indexOf(QLatin1String("<title>"), 0, Qt::CaseInsensitive) + 7;
     
    8788QString QHelpGlobal::codecFromHtmlData(const QByteArray &data)
    8889{
    89     QString content = QString::fromUtf8(data.constData(), data.size());
    90     int start = content.indexOf(QLatin1String("<meta"), 0, Qt::CaseInsensitive);
     90    QString head = QString::fromUtf8(data.constData(), qMin(1000, data.size()));
     91    int start = head.indexOf(QLatin1String("<meta"), 0, Qt::CaseInsensitive);
    9192    if (start > 0) {
    92         int end;
    9393        QRegExp r(QLatin1String("charset=([^\"\\s]+)"));
    9494        while (start != -1) {
    95             end = content.indexOf(QLatin1Char('>'), start) + 1;
    96             const QString &meta = content.mid(start, end - start).toLower();
     95            const int end = head.indexOf(QLatin1Char('>'), start) + 1;
     96            if (end <= start)
     97                break;
     98            const QString &meta = head.mid(start, end - start).toLower();
    9799            if (r.indexIn(meta) != -1)
    98100                return r.cap(1);
    99             start = content.indexOf(QLatin1String("<meta"), end,
     101            start = head.indexOf(QLatin1String("<meta"), end,
    100102                                    Qt::CaseInsensitive);
    101103        }
     
    106108QString QHelpGlobal::codecFromXmlData(const QByteArray &data)
    107109{
    108     QString content = QString::fromUtf8(data.constData(), data.size());
     110    QString head = QString::fromUtf8(data.constData(), qMin(1000, data.size()));
    109111    const QRegExp encodingExp(QLatin1String("^\\s*<\\?xml version="
    110112        "\"\\d\\.\\d\" encoding=\"([^\"]+)\"\\?>.*"));
    111     return encodingExp.exactMatch(content) ? encodingExp.cap(1) : QString();
     113    return encodingExp.exactMatch(head) ? encodingExp.cap(1) : QString();
    112114}
  • trunk/tools/assistant/lib/qhelp_global.h

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/tools/assistant/lib/qhelpcollectionhandler.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    115115    }
    116116
     117    m_query.exec(QLatin1String("PRAGMA synchronous=OFF"));
     118    m_query.exec(QLatin1String("PRAGMA cache_size=3000"));
     119
    117120    m_query.exec(QLatin1String("SELECT COUNT(*) FROM sqlite_master WHERE TYPE=\'table\'"
    118121                               "AND Name=\'NamespaceTable\'"));
     
    163166        return false;
    164167    }
     168
     169    copyQuery->exec(QLatin1String("PRAGMA synchronous=OFF"));
     170    copyQuery->exec(QLatin1String("PRAGMA cache_size=3000"));
    165171
    166172    if (!createTables(copyQuery)) {
     
    309315    m_query.bindValue(0, filterName);
    310316    m_query.exec();
    311     while (m_query.next()) {
     317    if (m_query.next())
    312318        nameId = m_query.value(0).toInt();
    313         break;
    314     }
    315319
    316320    m_query.exec(QLatin1String("SELECT Id, Name FROM FilterAttributeTable"));
     
    585589
    586590        QSqlQuery query(db);
     591        db.exec(QLatin1String("PRAGMA synchronous=OFF"));
     592        db.exec(QLatin1String("PRAGMA cache_size=3000"));
    587593        db.exec(QLatin1String("CREATE INDEX IF NOT EXISTS NameIndex ON IndexTable(Name)"));
    588594        db.exec(QLatin1String("CREATE INDEX IF NOT EXISTS FileNameIndex ON FileNameTable(Name)"));
  • trunk/tools/assistant/lib/qhelpcollectionhandler_p.h

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    7777    typedef QList<DocInfo> DocInfoList;
    7878
    79     QHelpCollectionHandler(const QString &collectionFile, QObject *parent = 0);
     79    explicit QHelpCollectionHandler(const QString &collectionFile,
     80        QObject *parent = 0);
    8081    ~QHelpCollectionHandler();
    8182
  • trunk/tools/assistant/lib/qhelpcontentwidget.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    371371        d->rootItem = 0;
    372372    }
    373     reset();
     373    if (!onShutDown)
     374        reset();
    374375}
    375376
  • trunk/tools/assistant/lib/qhelpcontentwidget.h

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/tools/assistant/lib/qhelpdatainterface.cpp

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/tools/assistant/lib/qhelpdatainterface_p.h

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/tools/assistant/lib/qhelpdbreader.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    206206        "AND c.Name=? AND c.NamespaceId=d.Id AND d.Name=?"));
    207207    m_query->bindValue(0, filePath);
    208     m_query->bindValue(1, QLatin1String("./") + filePath);
     208    m_query->bindValue(1, QString(QLatin1String("./") + filePath));
    209209    m_query->bindValue(2, virtualFolder);
    210210    m_query->bindValue(3, m_namespace);
  • trunk/tools/assistant/lib/qhelpdbreader_p.h

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/tools/assistant/lib/qhelpengine.cpp

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    7676    QHelpEngineCorePrivate::init(collectionFile, helpEngineCore);
    7777
    78     contentModel = new QHelpContentModel(this);
    79     indexModel = new QHelpIndexModel(this);
    80 
    81     connect(helpEngineCore, SIGNAL(setupFinished()),
    82         this, SLOT(applyCurrentFilter()));
    83     connect(helpEngineCore, SIGNAL(currentFilterChanged(QString)),
    84         this, SLOT(applyCurrentFilter()));
    85 
     78    if (!contentModel)
     79        contentModel = new QHelpContentModel(this);
     80    if (!indexModel)
     81        indexModel = new QHelpIndexModel(this);
     82
     83    connect(helpEngineCore, SIGNAL(setupFinished()), this,
     84        SLOT(applyCurrentFilter()));
     85    connect(helpEngineCore, SIGNAL(currentFilterChanged(QString)), this,
     86        SLOT(applyCurrentFilter()));
    8687}
    8788
  • trunk/tools/assistant/lib/qhelpengine.h

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    6363
    6464public:
    65     QHelpEngine(const QString &collectionFile, QObject *parent = 0);
     65    explicit QHelpEngine(const QString &collectionFile, QObject *parent = 0);
    6666    ~QHelpEngine();
    6767
  • trunk/tools/assistant/lib/qhelpengine_p.h

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/tools/assistant/lib/qhelpenginecore.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    120120            QHelpGlobal::uniquifyConnectionName(info.fileName, this), this);
    121121        if (!reader->init()) {
    122             emit q->warning(tr("Cannot open documentation file %1: %2!")
     122            emit q->warning(QHelpEngineCore::tr("Cannot open documentation file %1: %2!")
    123123                .arg(absFileName, reader->errorMessage()));
    124124            continue;
     
    407407/*!
    408408    Adds the new custom filter \a filterName. The filter attributes
    409     are specified by \a attributes. The function returns false if
    410     the filter can not be added, e.g. when the filter already exists.
     409    are specified by \a attributes. If the filter already exists,
     410    its attribute set is replaced. The function returns true if
     411    the operation succeeded, otherwise it returns false.
    411412
    412413    \sa customFilters(), removeCustomFilter()
     
    706707
    707708/*!
    708     Returns a description of the last error that occured.
     709    Returns a description of the last error that occurred.
    709710*/
    710711QString QHelpEngineCore::error() const
  • trunk/tools/assistant/lib/qhelpenginecore.h

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    6666   
    6767public:
    68     QHelpEngineCore(const QString &collectionFile, QObject *parent = 0);
     68    explicit QHelpEngineCore(const QString &collectionFile, QObject *parent = 0);
    6969    virtual ~QHelpEngineCore();
    7070
  • trunk/tools/assistant/lib/qhelpgenerator.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    4848#include <QtCore/QDir>
    4949#include <QtCore/QDebug>
     50#include <QtCore/QSet>
    5051#include <QtCore/QVariant>
    5152#include <QtCore/QDateTime>
     
    190191        return false;
    191192    }
     193
     194    d->query->exec(QLatin1String("PRAGMA synchronous=OFF"));
     195    d->query->exec(QLatin1String("PRAGMA cache_size=3000"));
    192196
    193197    addProgress(1.0);
     
    538542
    539543        int fileId = -1;
    540         if (!d->fileMap.contains(fileName)) {
     544        QMap<QString, int>::Iterator fileMapIt = d->fileMap.find(fileName);
     545        if (fileMapIt == d->fileMap.end()) {
    541546            fileDataList.append(qCompress(data));
    542547
     
    552557            ++tableFileId;
    553558        } else {
    554             fileId = d->fileMap.value(fileName);
     559            fileId = fileMapIt.value();
     560            QSet<int> &fileFilterSet = d->fileFilterMap[fileId];
     561            QSet<int> &tmpFileFilterSet = tmpFileFilterMap[fileId];
    555562            foreach (const int &filter, filterAtts) {
    556                 if (!d->fileFilterMap.value(fileId).contains(filter)
    557                     && !tmpFileFilterMap.value(fileId).contains(filter)) {
    558                         d->fileFilterMap[fileId].insert(filter);
    559                         tmpFileFilterMap[fileId].insert(filter);
     563                if (!fileFilterSet.contains(filter)
     564                    && !tmpFileFilterSet.contains(filter)) {
     565                    fileFilterSet.insert(filter);
     566                    tmpFileFilterSet.insert(filter);
    560567                }
    561568            }
     
    563570    }
    564571
    565     if (tmpFileFilterMap.count()) {
     572    if (!tmpFileFilterMap.isEmpty()) {
    566573        d->query->exec(QLatin1String("BEGIN"));
    567574        QMap<int, QSet<int> >::const_iterator it = tmpFileFilterMap.constBegin();
     
    626633        attributeMap.insert(d->query->value(1).toString(),
    627634            d->query->value(0).toInt());
    628         if (idsToInsert.contains(d->query->value(1).toString()))
    629             idsToInsert.removeAll(d->query->value(1).toString());
     635        idsToInsert.removeAll(d->query->value(1).toString());
    630636    }
    631637
     
    675681}
    676682
    677 bool QHelpGenerator::insertKeywords(const QList<QHelpDataIndexItem> keywords,
     683bool QHelpGenerator::insertKeywords(const QList<QHelpDataIndexItem> &keywords,
    678684                                    const QStringList &filterAttributes)
    679685{
     
    705711    int i = 0;
    706712    d->query->exec(QLatin1String("BEGIN"));
     713    QSet<QString> indices;
    707714    foreach (const QHelpDataIndexItem &itm, keywords) {
     715         // Identical ids make no sense and just confuse the Assistant user,
     716         // so we ignore all repetitions.
     717        if (indices.contains(itm.identifier))
     718            continue;
     719
     720        // Still empty ids should be ignored, as otherwise we will include only
     721        // the first keyword with an empty id.
     722        if (!itm.identifier.isEmpty())
     723            indices.insert(itm.identifier);
     724
    708725        pos = itm.reference.indexOf(QLatin1Char('#'));
    709726        fileName = itm.reference.left(pos);
     
    717734            fName = fName.mid(2);
    718735
    719         if (d->fileMap.contains(fName))
    720             fileId = d->fileMap.value(fName);
     736        QMap<QString, int>::ConstIterator it = d->fileMap.find(fName);
     737        if (it != d->fileMap.end())
     738            fileId = it.value();
    721739        else
    722740            fileId = 1;
     
    750768
    751769    d->query->exec(QLatin1String("SELECT COUNT(Id) FROM IndexTable"));
    752     if (d->query->next() && d->query->value(0).toInt() >= keywords.count())
     770    if (d->query->next() && d->query->value(0).toInt() >= indices.count())
    753771        return true;
    754772    return false;
     
    825843}
    826844
     845bool QHelpGenerator::checkLinks(const QHelpDataInterface &helpData)
     846{
     847    /*
     848     * Step 1: Gather the canoncal file paths of all files in the project.
     849     *         We use a set, because there will be a lot of look-ups.
     850     */
     851    QSet<QString> files;
     852    foreach (const QHelpDataFilterSection &filterSection, helpData.filterSections()) {
     853        foreach (const QString &file, filterSection.files()) {
     854            QFileInfo fileInfo(helpData.rootPath() + QDir::separator() + file);
     855            const QString &canonicalFileName = fileInfo.canonicalFilePath();
     856            if (!fileInfo.exists())
     857                emit warning(tr("File '%1' does not exist.").arg(file));
     858            else
     859                files.insert(canonicalFileName);
     860        }
     861    }
     862
     863    /*
     864     * Step 2: Check the hypertext and image references of all HTML files.
     865     *         Note that we don't parse the files, but simply grep for the
     866     *         respective HTML elements. Therefore. contents that are e.g.
     867     *         commented out can cause false warning.
     868     */
     869    bool allLinksOk = true;
     870    foreach (const QString &fileName, files) {
     871        if (!fileName.endsWith(QLatin1String("html"))
     872            && !fileName.endsWith(QLatin1String("htm")))
     873            continue;
     874        QFile htmlFile(fileName);
     875        if (!htmlFile.open(QIODevice::ReadOnly)) {
     876            emit warning(tr("File '%1' cannot be opened.").arg(fileName));
     877            continue;
     878        }
     879        const QRegExp linkPattern(QLatin1String("<(?:a href|img src)=\"?([^#\">]+)[#\">]"));
     880        QTextStream stream(&htmlFile);
     881        const QString codec = QHelpGlobal::codecFromData(htmlFile.read(1000));
     882        stream.setCodec(QTextCodec::codecForName(codec.toLatin1().constData()));
     883        const QString &content = stream.readAll();
     884        QStringList invalidLinks;
     885        for (int pos = linkPattern.indexIn(content); pos != -1;
     886             pos = linkPattern.indexIn(content, pos + 1)) {
     887            const QString& linkedFileName = linkPattern.cap(1);
     888            if (linkedFileName.contains(QLatin1String("://")))
     889                continue;
     890            const QString curDir = QFileInfo(fileName).dir().path();
     891            const QString &canonicalLinkedFileName =
     892                QFileInfo(curDir + QDir::separator() + linkedFileName).canonicalFilePath();
     893            if (!files.contains(canonicalLinkedFileName)
     894                && !invalidLinks.contains(canonicalLinkedFileName)) {
     895                emit warning(tr("File '%1' contains an invalid link to file '%2'").
     896                         arg(fileName).arg(linkedFileName));
     897                allLinksOk = false;
     898                invalidLinks.append(canonicalLinkedFileName);
     899            }
     900        }
     901    }
     902
     903    if (!allLinksOk)
     904        d->error = tr("Invalid links in HTML files.");
     905    return allLinksOk;
     906}
     907
    827908QT_END_NAMESPACE
     909
  • trunk/tools/assistant/lib/qhelpgenerator_p.h

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    7575    bool generate(QHelpDataInterface *helpData,
    7676        const QString &outputFileName);
     77    bool checkLinks(const QHelpDataInterface &helpData);
    7778    QString error() const;
    7879
     
    9798    bool registerVirtualFolder(const QString &folderName, const QString &ns);
    9899    bool insertFilterAttributes(const QStringList &attributes);
    99     bool insertKeywords(const QList<QHelpDataIndexItem> keywords,
     100    bool insertKeywords(const QList<QHelpDataIndexItem> &keywords,
    100101        const QStringList &filterAttributes);
    101102    bool insertFiles(const QStringList &files, const QString &rootPath,
  • trunk/tools/assistant/lib/qhelpindexwidget.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    245245    d->indexProvider->stopCollecting();
    246246    d->indices.clear();
    247     filter(QString());
     247    if (!onShutDown)
     248        filter(QString());
    248249}
    249250
  • trunk/tools/assistant/lib/qhelpindexwidget.h

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/tools/assistant/lib/qhelpprojectdata.cpp

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    4242#include "qhelpprojectdata_p.h"
    4343
     44#include <QtCore/QCoreApplication>
    4445#include <QtCore/QDir>
    4546#include <QtCore/QFileInfo>
     
    4748#include <QtCore/QMap>
    4849#include <QtCore/QRegExp>
     50#include <QtCore/QUrl>
    4951#include <QtCore/QVariant>
    5052#include <QtXml/QXmlStreamReader>
     
    7779    void raiseUnknownTokenError();
    7880    void addMatchingFiles(const QString &pattern);
     81    bool hasValidSyntax(const QString &nameSpace, const QString &vFolder) const;
    7982
    8083    QMap<QString, QStringList> dirEntriesCache;
     
    8386void QHelpProjectDataPrivate::raiseUnknownTokenError()
    8487{
    85     raiseError(QObject::tr("Unknown token."));
     88    raiseError(QCoreApplication::translate("QHelpProject", "Unknown token."));
    8689}
    8790
     
    9699                readProject();
    97100            else
    98                 raiseError(QObject::tr("Unknown token. Expected \"QtHelpProject\"!"));
     101                raiseError(QCoreApplication::translate("QHelpProject",
     102                               "Unknown token. Expected \"QtHelpProject\"!"));
    99103        }
    100104    }
    101105
    102106    if (hasError()) {
    103         raiseError(QObject::tr("Error in line %1: %2").arg(lineNumber())
     107        raiseError(QCoreApplication::translate("QHelpProject",
     108                       "Error in line %1: %2").arg(lineNumber())
    104109            .arg(errorString()));
    105110    }
     
    113118            if (name() == QLatin1String("virtualFolder")) {
    114119                virtualFolder = readElementText();
    115                 if (virtualFolder.contains(QLatin1String("/")))
    116                     raiseError(QObject::tr("A virtual folder must not contain a \'/\' character!"));
     120                if (!hasValidSyntax(QLatin1String("test"), virtualFolder))
     121                    raiseError(QCoreApplication::translate("QHelpProject",
     122                                   "Virtual folder has invalid syntax."));
    117123            } else if (name() == QLatin1String("namespace")) {
    118124                namespaceName = readElementText();
    119                 if (namespaceName.contains(QLatin1String("/")))
    120                     raiseError(QObject::tr("A namespace must not contain a \'/\' character!"));
     125                if (!hasValidSyntax(namespaceName, QLatin1String("test")))
     126                    raiseError(QCoreApplication::translate("QHelpProject",
     127                                   "Namespace has invalid syntax."));
    121128            } else if (name() == QLatin1String("customFilter")) {
    122129                readCustomFilter();
     
    126133                QString n = attributes().value(QLatin1String("name")).toString();
    127134                if (!metaData.contains(n))
    128                     metaData[n] = attributes().value(QLatin1String("value")).toString();
     135                    metaData[n]
     136                        = attributes().value(QLatin1String("value")).toString();
    129137                else
    130                     metaData.insert(n, attributes().value(QLatin1String("value")).toString());
     138                    metaData.insert(n, attributes().
     139                                    value(QLatin1String("value")).toString());
    131140            } else {
    132141                raiseUnknownTokenError();
     
    134143        } else if (isEndElement() && name() == QLatin1String("QtHelpProject")) {
    135144            if (namespaceName.isEmpty())
    136                 raiseError(QObject::tr("Missing namespace in QtHelpProject."));
     145                raiseError(QCoreApplication::translate("QHelpProject",
     146                              "Missing namespace in QtHelpProject."));
    137147            else if (virtualFolder.isEmpty())
    138                 raiseError(QObject::tr("Missing virtual folder in QtHelpProject"));
     148                raiseError(QCoreApplication::translate("QHelpProject",
     149                               "Missing virtual folder in QtHelpProject"));
    139150            break;
    140151        }
     
    224235                    || (attributes().value(QLatin1String("name")).toString().isEmpty()
    225236                    && attributes().value(QLatin1String("id")).toString().isEmpty()))
    226                     raiseError(QObject::tr("Missing attribute in keyword at line %1.")
    227                         .arg(lineNumber()));
    228                 filterSectionList.last().addIndex(
    229                     QHelpDataIndexItem(attributes().value(QLatin1String("name")).toString(),
    230                         attributes().value(QLatin1String("id")).toString(),
    231                         attributes().value(QLatin1String("ref")).toString()));
     237                    raiseError(QCoreApplication::translate("QHelpProject",
     238                                   "Missing attribute in keyword at line %1.")
     239                               .arg(lineNumber()));
     240                filterSectionList.last()
     241                    .addIndex(QHelpDataIndexItem(attributes().
     242                                  value(QLatin1String("name")).toString(),
     243                              attributes().value(QLatin1String("id")).toString(),
     244                              attributes().value(QLatin1String("ref")).toString()));
    232245            } else {
    233246                raiseUnknownTokenError();
     
    306319}
    307320
     321bool QHelpProjectDataPrivate::hasValidSyntax(const QString &nameSpace,
     322                                             const QString &vFolder) const
     323{
     324    const QLatin1Char slash('/');
     325    if (nameSpace.contains(slash) || vFolder.contains(slash))
     326        return false;
     327    QUrl url;
     328    const QLatin1String scheme("qthelp");
     329    url.setScheme(scheme);
     330    const QString canonicalNamespace = nameSpace.toLower();
     331    url.setHost(canonicalNamespace);
     332    url.setPath(vFolder);
     333
     334    const QString expectedUrl(scheme + QLatin1String("://")
     335        + canonicalNamespace + slash + vFolder);
     336    return url.isValid() && url.toString() == expectedUrl;
     337}
     338
    308339/*!
    309340    \internal
     
    347378    QFile file(fileName);
    348379    if (!file.open(QIODevice::ReadOnly)) {
    349         d->errorMsg = QObject::tr("The input file %1 could not be opened!")
    350             .arg(fileName);
     380        d->errorMsg = QCoreApplication::translate("QHelpProject",
     381                          "The input file %1 could not be opened!").arg(fileName);
    351382        return false;
    352383    }
  • trunk/tools/assistant/lib/qhelpprojectdata_p.h

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/tools/assistant/lib/qhelpsearchengine.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    264264
    265265    After starting the indexing process the signal indexingStarted() is emitted and
    266     on the end of the indexing process the indexingFinished() is emited. To stop
     266    on the end of the indexing process the indexingFinished() is emitted. To stop
    267267    the indexing one can call cancelIndexing().
    268268
     
    270270    thru its index for a given term. To do this one may use the possibility of creating the
    271271    QHelpSearchQuery list by self or reuse the QHelpSearchQueryWidget which has the inbuild
    272     functionality to set up a proper search querys list that get's passed to the search engines
     272    functionality to set up a proper search queries list that get's passed to the search engines
    273273    search() function.
    274274
    275275    After the list of querys has been passed to the search engine, the signal searchingStarted()
    276     is emited and after the search has finished the searchingFinished() signal is emited. The
     276    is emitted and after the search has finished the searchingFinished() signal is emitted. The
    277277    search process can be stopped by calling cancelSearching().
    278278
     
    319319    The QHelpEngine's setupFinished() signal is automatically connected to the
    320320    QHelpSearchEngine's indexing function, so that new documentation will be indexed
    321     after the signal is emited.
     321    after the signal is emitted.
    322322*/
    323323QHelpSearchEngine::QHelpSearchEngine(QHelpEngineCore *helpEngine, QObject *parent)
     
    435435
    436436/*!
    437     Starts the search process using the given list of querys \a queryList
     437    Starts the search process using the given list of queries \a queryList
    438438    build by the search field name and the values to search for.
    439439*/
  • trunk/tools/assistant/lib/qhelpsearchengine.h

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    8181
    8282public:
    83     QHelpSearchEngine(QHelpEngineCore *helpEngine, QObject *parent = 0);
     83    explicit QHelpSearchEngine(QHelpEngineCore *helpEngine,
     84        QObject *parent = 0);
    8485    ~QHelpSearchEngine();
    8586
  • trunk/tools/assistant/lib/qhelpsearchindex_default.cpp

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/tools/assistant/lib/qhelpsearchindex_default_p.h

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/tools/assistant/lib/qhelpsearchindexreader.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/tools/assistant/lib/qhelpsearchindexreader_clucene.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    4040****************************************************************************/
    4141
     42#include "fulltextsearch/qindexreader_p.h"
     43#include "fulltextsearch/qqueryparser_p.h"
     44#include "fulltextsearch/qsearchable_p.h"
     45#include "qclucenefieldnames_p.h"
    4246#include "qhelpenginecore.h"
    43 #include "fulltextsearch/qsearchable_p.h"
    44 #include "fulltextsearch/qqueryparser_p.h"
    45 #include "fulltextsearch/qindexreader_p.h"
     47
    4648#include "qhelpsearchindexreader_clucene_p.h"
    4749
     
    5052#include <QtCore/QString>
    5153#include <QtCore/QFileInfo>
     54#include <QtCore/QSharedPointer>
    5255#include <QtCore/QStringList>
    5356#include <QtCore/QTextStream>
     
    108111        try {
    109112#endif
    110             QCLuceneBooleanQuery booleanQuery;
     113            QCLuceneBooleanQuery booleanQueryTitle;
     114            QCLuceneBooleanQuery booleanQueryContent;
    111115            QCLuceneStandardAnalyzer analyzer;
    112             if (!buildQuery(booleanQuery, queryList, analyzer)) {
     116            const QStringList& attribList =
     117                engine.filterAttributes(engine.currentFilter());
     118            bool titleQueryIsValid = buildQuery(queryList, TitleTokenizedField,
     119                                       attribList, booleanQueryTitle, analyzer);
     120            bool contentQueryIsValid = buildQuery(queryList, ContentField,
     121                                     attribList, booleanQueryContent, analyzer);
     122            if (!titleQueryIsValid && !contentQueryIsValid) {
    113123                emit searchingFinished(0);
    114124                return;
    115125            }
    116126
    117             const QStringList attribList = engine.filterAttributes(engine.currentFilter());
    118             if (!attribList.isEmpty()) {
    119                 QCLuceneQuery* query = QCLuceneQueryParser::parse(QLatin1String("+")
    120                     + attribList.join(QLatin1String(" +")), QLatin1String("attribute"), analyzer);
    121 
    122                 if (!query) {
     127            QCLuceneIndexSearcher indexSearcher(indexPath);
     128
     129            // QCLuceneHits object must be allocated on the heap, because
     130            // there is no default constructor.
     131            QSharedPointer<QCLuceneHits> titleHits;
     132            QSharedPointer<QCLuceneHits> contentHits;
     133            if (titleQueryIsValid) {
     134                titleHits = QSharedPointer<QCLuceneHits>(new QCLuceneHits(
     135                    indexSearcher.search(booleanQueryTitle)));
     136            }
     137            if (contentQueryIsValid) {
     138                contentHits = QSharedPointer<QCLuceneHits>(new QCLuceneHits(
     139                    indexSearcher.search(booleanQueryContent)));
     140            }
     141            bool boost = true;
     142            if ((titleHits.isNull() || titleHits->length() == 0)
     143                && (contentHits.isNull() || contentHits->length() == 0)) {
     144                booleanQueryTitle = QCLuceneBooleanQuery();
     145                booleanQueryContent = QCLuceneBooleanQuery();
     146                titleQueryIsValid =
     147                    buildTryHarderQuery(queryList, TitleTokenizedField,
     148                                        attribList, booleanQueryTitle, analyzer);
     149                contentQueryIsValid =
     150                    buildTryHarderQuery(queryList, ContentField, attribList,
     151                                        booleanQueryContent, analyzer);
     152                if (!titleQueryIsValid && !contentQueryIsValid) {
    123153                    emit searchingFinished(0);
    124154                    return;
    125155                }
    126                 booleanQuery.add(query, true, true, false);
    127             }
    128 
    129             QCLuceneIndexSearcher indexSearcher(indexPath);
    130             QCLuceneHits hits = indexSearcher.search(booleanQuery);
    131 
    132             bool boost = true;
    133             QCLuceneBooleanQuery tryHarderQuery;
    134             if (hits.length() == 0) {
    135                 if (buildTryHarderQuery(tryHarderQuery, queryList, analyzer)) {
    136                     if (!attribList.isEmpty()) {
    137                         QCLuceneQuery* query = QCLuceneQueryParser::parse(QLatin1String("+")
    138                             + attribList.join(QLatin1String(" +")), QLatin1String("attribute"),
    139                             analyzer);
    140                         tryHarderQuery.add(query, true, true, false);
    141                     }
    142                     hits = indexSearcher.search(tryHarderQuery);
    143                     boost = (hits.length() == 0);
     156                if (titleQueryIsValid) {
     157                    titleHits = QSharedPointer<QCLuceneHits>(new QCLuceneHits(
     158                        indexSearcher.search(booleanQueryTitle)));
    144159                }
    145             }
     160                if (contentQueryIsValid) {
     161                    contentHits = QSharedPointer<QCLuceneHits>(new QCLuceneHits(
     162                        indexSearcher.search(booleanQueryContent)));
     163                }
     164                boost = false;
     165            }
     166            QList<QSharedPointer<QCLuceneHits> > cluceneHitsList;
     167            if (!titleHits.isNull())
     168                cluceneHitsList.append(titleHits);
     169            if (!contentHits.isNull())
     170                cluceneHitsList.append(contentHits);
    146171
    147172            QSet<QString> pathSet;
     
    149174            const QStringList namespaceList = engine.registeredDocumentations();
    150175
    151             for (qint32 i = 0; i < hits.length(); i++) {
    152                 document = hits.document(i);
    153                 const QString path = document.get(QLatin1String("path"));
    154                 if (!pathSet.contains(path) && namespaceList.contains(
    155                     document.get(QLatin1String("namespace")), Qt::CaseInsensitive)) {
    156                     pathSet.insert(path);
    157                     hitList.append(qMakePair(path, document.get(QLatin1String("title"))));
     176            foreach (const QSharedPointer<QCLuceneHits> &hits, cluceneHitsList) {
     177                for (qint32 i = 0; i < hits->length(); i++) {
     178                    document = hits->document(i);
     179                    const QString path = document.get(PathField);
     180                    if (!pathSet.contains(path) && namespaceList.contains(
     181                            document.get(NamespaceField), Qt::CaseInsensitive)) {
     182                        pathSet.insert(path);
     183                        hitList.append(qMakePair(path, document.get(TitleField)));
     184                    }
     185                    document.clear();
     186
     187                    mutex.lock();
     188                    if (m_cancel) {
     189                        mutex.unlock();
     190                        emit searchingFinished(0);
     191                        return;
     192                    }
     193                    mutex.unlock();
    158194                }
    159                 document.clear();
    160 
    161                 mutex.lock();
    162                 if (m_cancel) {
    163                     mutex.unlock();
    164                     emit searchingFinished(0);
    165                     return;
    166                 }
    167                 mutex.unlock();
    168195            }
    169196
     
    185212}
    186213
    187 bool QHelpSearchIndexReaderClucene::defaultQuery(const QString &term, QCLuceneBooleanQuery &booleanQuery,
    188     QCLuceneStandardAnalyzer &analyzer)
    189 {
    190     const QLatin1String c("content");
    191     const QLatin1String t("titleTokenized");
    192 
    193     QCLuceneQuery *query = QCLuceneQueryParser::parse(term, c, analyzer);
    194     QCLuceneQuery *query2 = QCLuceneQueryParser::parse(term, t, analyzer);
    195     if (query && query2) {
    196         booleanQuery.add(query, true, false, false);
    197         booleanQuery.add(query2, true, false, false);
     214bool QHelpSearchIndexReaderClucene::buildQuery(
     215    const QList<QHelpSearchQuery> &queries, const QString &fieldName,
     216    const QStringList &filterAttributes, QCLuceneBooleanQuery &booleanQuery,
     217    QCLuceneAnalyzer &analyzer)
     218{
     219    bool queryIsValid = false;
     220    foreach (const QHelpSearchQuery &query, queries) {
     221        if (fieldName != ContentField && isNegativeQuery(query)) {
     222            queryIsValid = false;
     223            break;
     224        }
     225        switch (query.fieldName) {
     226            case QHelpSearchQuery::FUZZY:
     227                if (addFuzzyQuery(query, fieldName, booleanQuery, analyzer))
     228                    queryIsValid = true;
     229                break;
     230            case QHelpSearchQuery::WITHOUT:
     231                if (fieldName != ContentField)
     232                    return false;
     233                if (addWithoutQuery(query, fieldName, booleanQuery))
     234                    queryIsValid = true;
     235                break;
     236            case QHelpSearchQuery::PHRASE:
     237               if (addPhraseQuery(query, fieldName, booleanQuery))
     238                   queryIsValid = true;
     239               break;
     240            case QHelpSearchQuery::ALL:
     241               if (addAllQuery(query, fieldName, booleanQuery))
     242                   queryIsValid = true;
     243               break;
     244            case QHelpSearchQuery::DEFAULT:
     245               if (addDefaultQuery(query, fieldName, true, booleanQuery, analyzer))
     246                   queryIsValid = true;
     247               break;
     248            case QHelpSearchQuery::ATLEAST:
     249               if (addAtLeastQuery(query, fieldName, booleanQuery, analyzer))
     250                   queryIsValid = true;
     251               break;
     252            default:
     253               Q_ASSERT(!"Invalid field name");
     254        }
     255    }
     256
     257    if (queryIsValid && !filterAttributes.isEmpty()) {
     258        queryIsValid =
     259            addAttributesQuery(filterAttributes, booleanQuery, analyzer);
     260    }
     261
     262    return queryIsValid;
     263}
     264
     265bool QHelpSearchIndexReaderClucene::buildTryHarderQuery(
     266    const QList<QHelpSearchQuery> &queries, const QString &fieldName,
     267    const QStringList &filterAttributes, QCLuceneBooleanQuery &booleanQuery,
     268    QCLuceneAnalyzer &analyzer)
     269{
     270    if (queries.isEmpty())
     271        return false;
     272    const QHelpSearchQuery &query = queries.front();
     273    if (query.fieldName != QHelpSearchQuery::DEFAULT)
     274        return false;
     275    if (isNegativeQuery(query))
     276        return false;
     277    if (!addDefaultQuery(query, fieldName, false, booleanQuery, analyzer))
     278        return false;
     279    if (filterAttributes.isEmpty())
    198280        return true;
    199     }
    200 
    201     return false;
    202 }
    203 
    204 bool QHelpSearchIndexReaderClucene::buildQuery(QCLuceneBooleanQuery &booleanQuery,
    205     const QList<QHelpSearchQuery> &queryList, QCLuceneStandardAnalyzer &analyzer)
    206 {
    207     foreach (const QHelpSearchQuery query, queryList) {
    208         switch (query.fieldName) {
    209             case QHelpSearchQuery::FUZZY: {
    210                 const QLatin1String fuzzy("~");
    211                 foreach (const QString &term, query.wordList) {
    212                     if (term.isEmpty()
    213                         || !defaultQuery(term.toLower() + fuzzy, booleanQuery, analyzer)) {
    214                         return false;
    215                     }
    216                 }
    217             }   break;
    218 
    219             case QHelpSearchQuery::WITHOUT: {
    220                 QStringList stopWords = QCLuceneStopAnalyzer().englishStopWords();
    221                 foreach (const QString &term, query.wordList) {
    222                     if (stopWords.contains(term, Qt::CaseInsensitive))
    223                         continue;
    224 
    225                     QCLuceneQuery *query = new QCLuceneTermQuery(QCLuceneTerm(
    226                         QLatin1String("content"), term.toLower()));
    227                     QCLuceneQuery *query2 = new QCLuceneTermQuery(QCLuceneTerm(
    228                         QLatin1String("titleTokenized"), term.toLower()));
    229 
    230                     if (query && query2) {
    231                         booleanQuery.add(query, true, false, true);
    232                         booleanQuery.add(query2, true, false, true);
    233                     } else {
    234                         return false;
    235                     }
    236                 }
    237             }   break;
    238 
    239             case QHelpSearchQuery::PHRASE: {
    240                 const QString &term = query.wordList.at(0).toLower();
    241                 if (term.contains(QLatin1Char(' '))) {
    242                     QStringList termList = term.split(QLatin1String(" "));
    243                     QCLucenePhraseQuery *q = new QCLucenePhraseQuery();
    244                     QStringList stopWords = QCLuceneStopAnalyzer().englishStopWords();
    245                     foreach (const QString &term, termList) {
    246                         if (!stopWords.contains(term, Qt::CaseInsensitive))
    247                             q->addTerm(QCLuceneTerm(QLatin1String("content"), term.toLower()));
    248                     }
    249                     booleanQuery.add(q, true, true, false);
    250                 } else {
    251                     QCLuceneQuery *query = new QCLuceneTermQuery(QCLuceneTerm(
    252                         QLatin1String("content"), term.toLower()));
    253                     QCLuceneQuery *query2 = new QCLuceneTermQuery(QCLuceneTerm(
    254                         QLatin1String("titleTokenized"), term.toLower()));
    255 
    256                     if (query && query2) {
    257                         booleanQuery.add(query, true, true, false);
    258                         booleanQuery.add(query2, true, false, false);
    259                     } else {
    260                         return false;
    261                     }
    262                 }
    263             }   break;
    264 
    265             case QHelpSearchQuery::ALL: {
    266                 QStringList stopWords = QCLuceneStopAnalyzer().englishStopWords();
    267                 foreach (const QString &term, query.wordList) {
    268                     if (stopWords.contains(term, Qt::CaseInsensitive))
    269                         continue;
    270 
    271                     QCLuceneQuery *query = new QCLuceneTermQuery(QCLuceneTerm(
    272                         QLatin1String("content"), term.toLower()));
    273 
    274                     if (query) {
    275                         booleanQuery.add(query, true, true, false);
    276                     } else {
    277                         return false;
    278                     }
    279                 }
    280             }   break;
    281 
    282             case QHelpSearchQuery::DEFAULT: {
    283                 foreach (const QString &term, query.wordList) {
    284                     QCLuceneQuery *query = QCLuceneQueryParser::parse(term.toLower(),
    285                         QLatin1String("content"), analyzer);
    286 
    287                     if (query)
    288                         booleanQuery.add(query, true, true, false);
    289                 }
    290             }   break;
    291 
    292             case QHelpSearchQuery::ATLEAST: {
    293                 foreach (const QString &term, query.wordList) {
    294                     if (term.isEmpty() || !defaultQuery(term.toLower(), booleanQuery, analyzer))
    295                         return false;
    296                 }
    297             }
    298         }
    299     }
    300 
     281    return addAttributesQuery(filterAttributes, booleanQuery, analyzer);
     282}
     283
     284bool QHelpSearchIndexReaderClucene::isNegativeQuery(const QHelpSearchQuery &query) const
     285{
     286    const QString &search = query.wordList.join(" ");
     287    return search.contains('!') || search.contains('-')
     288            || search.contains(QLatin1String(" NOT "));
     289}
     290
     291bool QHelpSearchIndexReaderClucene::addFuzzyQuery(const QHelpSearchQuery &query,
     292    const QString &fieldName, QCLuceneBooleanQuery &booleanQuery,
     293    QCLuceneAnalyzer &analyzer)
     294{
     295    bool queryIsValid = false;
     296    const QLatin1String fuzzy("~");
     297    foreach (const QString &term, query.wordList) {
     298        if (!term.isEmpty()) {
     299            QCLuceneQuery *lQuery =
     300                    QCLuceneQueryParser::parse(term + fuzzy, fieldName, analyzer);
     301            if (lQuery != 0) {
     302                booleanQuery.add(lQuery, true, false, false);
     303                queryIsValid = true;
     304            }
     305        }
     306    }
     307    return queryIsValid;
     308}
     309
     310bool QHelpSearchIndexReaderClucene::addWithoutQuery(const QHelpSearchQuery &query,
     311    const QString &fieldName, QCLuceneBooleanQuery &booleanQuery)
     312{
     313    bool queryIsValid = false;
     314    const QStringList &stopWords = QCLuceneStopAnalyzer().englishStopWords();
     315    foreach (const QString &term, query.wordList) {
     316        if (stopWords.contains(term, Qt::CaseInsensitive))
     317            continue;
     318        QCLuceneQuery *lQuery = new QCLuceneTermQuery(QCLuceneTerm(
     319                fieldName, term.toLower()));
     320        booleanQuery.add(lQuery, true, false, true);
     321        queryIsValid = true;
     322    }
     323    return queryIsValid;
     324}
     325
     326bool QHelpSearchIndexReaderClucene::addPhraseQuery(const QHelpSearchQuery &query,
     327    const QString &fieldName, QCLuceneBooleanQuery &booleanQuery)
     328{
     329    bool queryIsValid = false;
     330    const QString &term = query.wordList.at(0).toLower();
     331    if (term.contains(QLatin1Char(' '))) {
     332        const QStringList termList = term.split(QLatin1String(" "));
     333        QCLucenePhraseQuery *q = new QCLucenePhraseQuery();
     334        const QStringList stopWords = QCLuceneStopAnalyzer().englishStopWords();
     335        foreach (const QString &term, termList) {
     336            if (!stopWords.contains(term, Qt::CaseInsensitive))
     337                q->addTerm(QCLuceneTerm(fieldName, term.toLower()));
     338        }
     339        if (!q->getTerms().isEmpty()) {
     340            booleanQuery.add(q, true, true, false);
     341            queryIsValid = true;
     342        }
     343    } else {
     344        QCLuceneQuery *lQuery = new QCLuceneTermQuery(QCLuceneTerm(
     345                fieldName, term.toLower()));
     346        booleanQuery.add(lQuery, true, true, false);
     347        queryIsValid = true;
     348    }
     349    return queryIsValid;
     350}
     351
     352bool QHelpSearchIndexReaderClucene::addAllQuery(const QHelpSearchQuery &query,
     353    const QString &fieldName, QCLuceneBooleanQuery &booleanQuery)
     354{
     355    bool queryIsValid = false;
     356    const QStringList &stopWords = QCLuceneStopAnalyzer().englishStopWords();
     357    foreach (const QString &term, query.wordList) {
     358        if (stopWords.contains(term, Qt::CaseInsensitive))
     359            continue;
     360        QCLuceneQuery *lQuery = new QCLuceneTermQuery(QCLuceneTerm(
     361                fieldName, term.toLower()));
     362        booleanQuery.add(lQuery, true, true, false);
     363        queryIsValid = true;
     364    }
     365    return queryIsValid;
     366}
     367
     368bool QHelpSearchIndexReaderClucene::addDefaultQuery(const QHelpSearchQuery &query,
     369    const QString &fieldName, bool allTermsRequired,
     370    QCLuceneBooleanQuery &booleanQuery,
     371    QCLuceneAnalyzer &analyzer)
     372{
     373    bool queryIsValid = false;
     374    foreach (const QString &term, query.wordList) {
     375        QCLuceneQuery *lQuery =
     376            QCLuceneQueryParser::parse(term.toLower(), fieldName, analyzer);
     377        if (lQuery) {
     378            booleanQuery.add(lQuery, true, allTermsRequired, false);
     379            queryIsValid = true;
     380        }
     381    }
     382    return queryIsValid;
     383}
     384
     385bool QHelpSearchIndexReaderClucene::addAtLeastQuery(
     386    const QHelpSearchQuery &query, const QString &fieldName,
     387    QCLuceneBooleanQuery &booleanQuery, QCLuceneAnalyzer &analyzer)
     388{
     389    bool queryIsValid = false;
     390    foreach (const QString &term, query.wordList) {
     391        if (!term.isEmpty()) {
     392            QCLuceneQuery *lQuery =
     393                QCLuceneQueryParser::parse(term, fieldName, analyzer);
     394            if (lQuery) {
     395                booleanQuery.add(lQuery, true, false, false);
     396                queryIsValid = true;
     397            }
     398        }
     399    }
     400    return queryIsValid;
     401}
     402
     403bool QHelpSearchIndexReaderClucene::addAttributesQuery(
     404    const QStringList &filterAttributes, QCLuceneBooleanQuery &booleanQuery,
     405    QCLuceneAnalyzer &analyzer)
     406{
     407    QCLuceneQuery* lQuery = QCLuceneQueryParser::parse(QLatin1String("+")
     408        + filterAttributes.join(QLatin1String(" +")), AttributeField, analyzer);
     409    if (!lQuery)
     410        return false;
     411    booleanQuery.add(lQuery, true, true, false);
    301412    return true;
    302 }
    303 
    304 bool QHelpSearchIndexReaderClucene::buildTryHarderQuery(QCLuceneBooleanQuery &booleanQuery,
    305     const QList<QHelpSearchQuery> &queryList, QCLuceneStandardAnalyzer &analyzer)
    306 {
    307     bool retVal = false;
    308     foreach (const QHelpSearchQuery query, queryList) {
    309         switch (query.fieldName) {
    310             default:    break;
    311             case QHelpSearchQuery::DEFAULT: {
    312                 foreach (const QString &term, query.wordList) {
    313                     QCLuceneQuery *query = QCLuceneQueryParser::parse(term.toLower(),
    314                         QLatin1String("content"), analyzer);
    315 
    316                     if (query) {
    317                         retVal = true;
    318                         booleanQuery.add(query, true, false, false);
    319                     }
    320                 }
    321             }   break;
    322         }
    323     }
    324     return retVal;
    325413}
    326414
     
    328416    QList<QHelpSearchEngine::SearchHit> &hitList, const QList<QHelpSearchQuery> &queryList)
    329417{
    330     foreach (const QHelpSearchQuery query, queryList) {
     418    foreach (const QHelpSearchQuery &query, queryList) {
    331419        if (query.fieldName != QHelpSearchQuery::DEFAULT)
    332420            continue;
     
    336424        QCLuceneStandardAnalyzer analyzer;
    337425        QCLuceneQuery *parsedQuery = QCLuceneQueryParser::parse(
    338             joinedQuery, QLatin1String("content"), analyzer);
     426            joinedQuery, ContentField, analyzer);
    339427
    340428        if (parsedQuery) {
     
    343431        }
    344432
    345         int length = QString(QLatin1String("content:")).length();
    346         int index = joinedQuery.indexOf(QLatin1String("content:"));
     433        const QString contentString(ContentField + QLatin1String(":"));
     434        int length = contentString.length();
     435        int index = joinedQuery.indexOf(contentString);
    347436
    348437        QString term;
     
    350439        QStringList searchTerms;
    351440        while (index != -1) {
    352             nextIndex = joinedQuery.indexOf(QLatin1String("content:"), index + 1);
     441            nextIndex = joinedQuery.indexOf(contentString, index + 1);
    353442            term = joinedQuery.mid(index + length, nextIndex - (length + index)).simplified();
    354443            if (term.startsWith(QLatin1String("\""))
  • trunk/tools/assistant/lib/qhelpsearchindexreader_clucene_p.h

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    5454//
    5555
    56 #include "qhelpsearchindexreader_p.h"
     56#include <QtCore/QList>
     57#include <QtCore/QString>
     58#include <QtCore/QStringList>
    5759
    5860#include "fulltextsearch/qanalyzer_p.h"
    5961#include "fulltextsearch/qquery_p.h"
     62#include "qhelpsearchindexreader_p.h"
    6063
    6164QT_BEGIN_NAMESPACE
     
    7477private:
    7578    void run();
    76     bool defaultQuery(const QString &term, QCLuceneBooleanQuery &booleanQuery,
    77         QCLuceneStandardAnalyzer &analyzer);
    78     bool buildQuery(QCLuceneBooleanQuery &booleanQuery, const QList<QHelpSearchQuery> &queryList,
    79         QCLuceneStandardAnalyzer &analyzer);
    80     bool buildTryHarderQuery(QCLuceneBooleanQuery &booleanQuery,
    81         const QList<QHelpSearchQuery> &queryList, QCLuceneStandardAnalyzer &analyzer);
    8279    void boostSearchHits(const QHelpEngineCore &engine, QList<QHelpSearchEngine::SearchHit> &hitList,
    8380        const QList<QHelpSearchQuery> &queryList);
     81    bool buildQuery(const QList<QHelpSearchQuery> &queries,
     82                    const QString &fieldName,
     83                    const QStringList &filterAttributes,
     84                    QCLuceneBooleanQuery &booleanQuery,
     85                    QCLuceneAnalyzer &analyzer);
     86    bool buildTryHarderQuery(const QList<QHelpSearchQuery> &queries,
     87                             const QString &fieldName,
     88                             const QStringList &filterAttributes,
     89                             QCLuceneBooleanQuery &booleanQuery,
     90                             QCLuceneAnalyzer &analyzer);
     91    bool addFuzzyQuery(const QHelpSearchQuery &query, const QString &fieldName,
     92                       QCLuceneBooleanQuery &booleanQuery, QCLuceneAnalyzer &analyzer);
     93    bool addWithoutQuery(const QHelpSearchQuery &query, const QString &fieldName,
     94                         QCLuceneBooleanQuery &booleanQuery);
     95    bool addPhraseQuery(const QHelpSearchQuery &query, const QString &fieldName,
     96                        QCLuceneBooleanQuery &booleanQuery);
     97    bool addAllQuery(const QHelpSearchQuery &query, const QString &fieldName,
     98                     QCLuceneBooleanQuery &booleanQuery);
     99    bool addDefaultQuery(const QHelpSearchQuery &query, const QString &fieldName,
     100                         bool allTermsRequired, QCLuceneBooleanQuery &booleanQuery,
     101                         QCLuceneAnalyzer &analyzer);
     102    bool addAtLeastQuery(const QHelpSearchQuery &query, const QString &fieldName,
     103                         QCLuceneBooleanQuery &booleanQuery, QCLuceneAnalyzer &analyzer);
     104    bool addAttributesQuery(const QStringList &filterAttributes,
     105               QCLuceneBooleanQuery &booleanQuery, QCLuceneAnalyzer &analyzer);
     106    bool isNegativeQuery(const QHelpSearchQuery &query) const;
    84107};
    85108
  • trunk/tools/assistant/lib/qhelpsearchindexreader_default.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/tools/assistant/lib/qhelpsearchindexreader_default_p.h

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    6161
    6262QT_BEGIN_NAMESPACE
    63 
    64 struct Entry;
    65 struct PosEntry;
    6663
    6764namespace fulltextsearch {
  • trunk/tools/assistant/lib/qhelpsearchindexreader_p.h

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/tools/assistant/lib/qhelpsearchindexwriter_clucene.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    4040****************************************************************************/
    4141
     42#include "qclucenefieldnames_p.h"
    4243#include "qhelpenginecore.h"
    4344#include "qhelp_global.h"
     
    407408
    408409            if(!parsedData.isEmpty()) {
    409                 document->add(new QCLuceneField(QLatin1String("content"),
     410                document->add(new QCLuceneField(ContentField,
    410411                    parsedData,QCLuceneField::INDEX_TOKENIZED));
    411                 document->add(new QCLuceneField(QLatin1String("path"), fileName,
     412                document->add(new QCLuceneField(PathField, fileName,
    412413                    QCLuceneField::STORE_YES | QCLuceneField::INDEX_UNTOKENIZED));
    413                 document->add(new QCLuceneField(QLatin1String("title"), parsedTitle,
     414                document->add(new QCLuceneField(TitleField, parsedTitle,
    414415                    QCLuceneField::STORE_YES | QCLuceneField::INDEX_UNTOKENIZED));
    415                 document->add(new QCLuceneField(QLatin1String("titleTokenized"), parsedTitle,
     416                document->add(new QCLuceneField(TitleTokenizedField, parsedTitle,
    416417                    QCLuceneField::STORE_YES | QCLuceneField::INDEX_TOKENIZED));
    417                 document->add(new QCLuceneField(QLatin1String("namespace"), namespaceName,
     418                document->add(new QCLuceneField(NamespaceField, namespaceName,
    418419                    QCLuceneField::STORE_YES | QCLuceneField::INDEX_UNTOKENIZED));
    419                 document->add(new QCLuceneField(QLatin1String("attribute"), attributes,
     420                document->add(new QCLuceneField(AttributeField, attributes,
    420421                    QCLuceneField::STORE_YES | QCLuceneField::INDEX_TOKENIZED));
    421422                return true;
     
    716717                    if (indexMap.contains(namespaceName)) {
    717718                        // make sure we really have content indexed for namespace
    718                         // NOTE: Extra variable just for GCC 3.3.5
    719                         QLatin1String key("namespace");
    720                         QCLuceneTermQuery query(QCLuceneTerm(key, namespaceName));
     719                        QCLuceneTermQuery query(QCLuceneTerm(NamespaceField, namespaceName));
    721720                        QCLuceneIndexSearcher indexSearcher(indexPath);
    722721                        QCLuceneHits hits = indexSearcher.search(query);
     
    852851
    853852    QCLuceneIndexReader reader = QCLuceneIndexReader::open(indexPath);
    854     reader.deleteDocuments(QCLuceneTerm(QLatin1String("namespace"),
    855         namespaceName));
     853    reader.deleteDocuments(QCLuceneTerm(NamespaceField, namespaceName));
    856854
    857855    reader.close();
  • trunk/tools/assistant/lib/qhelpsearchindexwriter_clucene_p.h

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/tools/assistant/lib/qhelpsearchindexwriter_default.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/tools/assistant/lib/qhelpsearchindexwriter_default_p.h

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/tools/assistant/lib/qhelpsearchquerywidget.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    4242#include "qhelpsearchquerywidget.h"
    4343
    44 #include <QtCore/QDebug>
    45 
    4644#include <QtCore/QAbstractListModel>
    4745#include <QtCore/QObject>
     
    102100
    103101    QHelpSearchQueryWidgetPrivate()
    104         : QObject(), simpleSearch(true),
    105           searchCompleter(new CompleterModel(this), this)
     102        : QObject()
     103        , simpleSearch(true)
     104        , searchCompleter(new CompleterModel(this), this)
    106105    {
    107106        searchButton = 0;
     
    135134        atLeastLabel->setText(QHelpSearchQueryWidget::tr("with <B>at least one</B> of the words:"));
    136135#endif
    137     }
    138 
    139     QString escapeString(const QString &text)
    140     {
    141         QString retValue = text;
    142         const QString escape(QLatin1String("\\"));
    143         QStringList escapableCharsList;
    144         escapableCharsList << QLatin1String("\\") << QLatin1String("+")
    145             << QLatin1String("-") << QLatin1String("!") << QLatin1String("(")
    146             << QLatin1String(")") << QLatin1String(":") << QLatin1String("^")
    147             << QLatin1String("[") << QLatin1String("]") << QLatin1String("{")
    148             << QLatin1String("}") << QLatin1String("~");
    149 
    150         // make sure we won't end up with an empty string
    151         foreach (const QString &escapeChar, escapableCharsList) {
    152             if (retValue.contains(escapeChar))
    153                 retValue.replace(escapeChar, QLatin1String(""));
    154         }
    155         if (retValue.trimmed().isEmpty())
    156             return retValue;
    157 
    158         retValue = text; // now really escape the string...
    159         foreach (const QString &escapeChar, escapableCharsList) {
    160             if (retValue.contains(escapeChar))
    161                 retValue.replace(escapeChar, escape + escapeChar);
    162         }
    163         return retValue;
    164136    }
    165137
     
    223195    }
    224196
    225     void nextOrPrevQuery(int maxOrMinIndex, int addend,
    226                          QToolButton *thisButton, QToolButton *otherButton)
     197    void nextOrPrevQuery(int maxOrMinIndex, int addend, QToolButton *thisButton,
     198        QToolButton *otherButton)
    227199    {
    228200        QueryHistory *queryHist;
     
    234206            queryHist = &complexQueries;
    235207            lineEdits << allQuery << atLeastQuery << similarQuery
    236                     << withoutQuery << exactQuery;
     208                << withoutQuery << exactQuery;
    237209        }
    238210        foreach (QLineEdit *lineEdit, lineEdits)
     
    279251    void enableOrDisableToolButtons()
    280252    {
    281         const QueryHistory &queryHist =
    282                 simpleSearch ? simpleQueries : complexQueries;
     253        const QueryHistory &queryHist = simpleSearch ? simpleQueries
     254            : complexQueries;
    283255        prevQueryButton->setEnabled(queryHist.curQuery > 0);
    284         nextQueryButton->setEnabled(queryHist.curQuery <
    285                                     queryHist.queries.size() - 1);
     256        nextQueryButton->setEnabled(queryHist.curQuery
     257            < queryHist.queries.size() - 1);
    286258    }
    287259
     
    307279#if !defined(QT_CLUCENE_SUPPORT)
    308280        queryList.append(QHelpSearchQuery(QHelpSearchQuery::DEFAULT,
    309                                           QStringList(defaultQuery->text())));
     281            QStringList(defaultQuery->text())));
    310282
    311283#else
    312284        if (defaultQuery->isEnabled()) {
    313285            queryList.append(QHelpSearchQuery(QHelpSearchQuery::DEFAULT,
    314                                               buildTermList(escapeString(defaultQuery->text()))));
     286                buildTermList(defaultQuery->text())));
    315287        } else {
    316288            const QRegExp exp(QLatin1String("\\s+"));
    317             QStringList lst = similarQuery->text().split(exp, QString::SkipEmptyParts);
     289            QStringList lst = similarQuery->text().split(exp,
     290                QString::SkipEmptyParts);
    318291            if (!lst.isEmpty()) {
    319292                QStringList fuzzy;
    320293                foreach (const QString &term, lst)
    321                     fuzzy += buildTermList(escapeString(term));
    322                 queryList.append(QHelpSearchQuery(QHelpSearchQuery::FUZZY, fuzzy));
     294                    fuzzy += buildTermList(term);
     295                queryList.append(QHelpSearchQuery(QHelpSearchQuery::FUZZY,
     296                    fuzzy));
    323297            }
    324298
     
    327301                QStringList without;
    328302                foreach (const QString &term, lst)
    329                     without.append(escapeString(term));
    330                 queryList.append(QHelpSearchQuery(QHelpSearchQuery::WITHOUT, without));
     303                    without.append(term);
     304                queryList.append(QHelpSearchQuery(QHelpSearchQuery::WITHOUT,
     305                    without));
    331306            }
    332307
    333308            if (!exactQuery->text().isEmpty()) {
    334309                QString phrase = exactQuery->text().remove(QLatin1Char('\"'));
    335                 phrase = escapeString(phrase.simplified());
    336                 queryList.append(QHelpSearchQuery(QHelpSearchQuery::PHRASE, QStringList(phrase)));
     310                phrase = phrase.simplified();
     311                queryList.append(QHelpSearchQuery(QHelpSearchQuery::PHRASE,
     312                    QStringList(phrase)));
    337313            }
    338314
     
    341317                QStringList all;
    342318                foreach (const QString &term, lst)
    343                     all.append(escapeString(term));
     319                    all.append(term);
    344320                queryList.append(QHelpSearchQuery(QHelpSearchQuery::ALL, all));
    345321            }
     
    349325                QStringList atLeast;
    350326                foreach (const QString &term, lst)
    351                     atLeast += buildTermList(escapeString(term));
    352                 queryList.append(QHelpSearchQuery(QHelpSearchQuery::ATLEAST, atLeast));
     327                    atLeast += buildTermList(term);
     328                queryList.append(QHelpSearchQuery(QHelpSearchQuery::ATLEAST,
     329                    atLeast));
    353330            }
    354331        }
     
    364341    void nextQuery()
    365342    {
    366         nextOrPrevQuery((simpleSearch ? simpleQueries : complexQueries).queries.size() - 1,
    367                         1, nextQueryButton, prevQueryButton);
     343        nextOrPrevQuery((simpleSearch ? simpleQueries
     344            : complexQueries).queries.size() - 1, 1, nextQueryButton,
     345                prevQueryButton);
    368346    }
    369347
     
    416394
    417395    This signal is emitted when a the user has the search button invoked.
    418     After reciving the signal you can ask the QHelpSearchQueryWidget for the build list
    419     of QHelpSearchQuery's that you may pass to the QHelpSearchEngine's search() function.
     396    After reciving the signal you can ask the QHelpSearchQueryWidget for the
     397    build list of QHelpSearchQuery's that you may pass to the QHelpSearchEngine's
     398    search() function.
    420399*/
    421400
     
    545524}
    546525
    547 /*! \reimp
     526/*!
     527    \reimp
    548528*/
    549529void QHelpSearchQueryWidget::focusInEvent(QFocusEvent *focusEvent)
  • trunk/tools/assistant/lib/qhelpsearchquerywidget.h

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/tools/assistant/lib/qhelpsearchresultwidget.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    305305            }
    306306        }
    307         hitsLabel->setText(tr("%1 - %2 of %3 Hits").arg(first).arg(last).arg(count));
     307        hitsLabel->setText(QHelpSearchResultWidget::tr("%1 - %2 of %n Hits", 0, count).arg(first).arg(last));
    308308    }
    309309
  • trunk/tools/assistant/lib/qhelpsearchresultwidget.h

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
Note: See TracChangeset for help on using the changeset viewer.