/*!
 * Updates match flags for columns.
 */
void CntFilterDetail::updateForMatchFlag(const QContactDetailFilter& filter,
                                         QString& fieldToUpdate ,
                                         QContactManager::Error* error) const
{
    // Modify the filed depending on the query
    switch (filter.matchFlags()) {
        case QContactFilter::MatchExactly: {
            // Pattern for MatchExactly:
            // " ='xyz'"
            fieldToUpdate = " ='"
                           + filter.value().toString() + '\'';
            *error = QContactManager::NoError;
            break;
        }
        case QContactFilter::MatchContains: {
            // Pattern for MatchContains:
            // " LIKE '%xyz%'"
            fieldToUpdate = " LIKE '%" + filter.value().toString() + "%'" ;
            *error = QContactManager::NoError;
            break;
        }
        case QContactFilter::MatchStartsWith: {
            // Pattern for MatchStartsWith:
            // " LIKE 'xyz%'"
            fieldToUpdate = " LIKE '" +  filter.value().toString() + "%'"  ;
            *error = QContactManager::NoError;
            break;
        }
        case QContactFilter::MatchEndsWith: {
            // Pattern for MatchEndsWith:
            // " LIKE '%xyz'"
            fieldToUpdate = " LIKE '%" + filter.value().toString() + '\'' ;
            *error = QContactManager::NoError;
            break;
        }
        case QContactFilter::MatchFixedString: {
            // Pattern for MatchFixedString:
            // " ='xyz' COLLATE NOCASE"
            fieldToUpdate = " ='"
                       + filter.value().toString() + '\'' + " COLLATE NOCASE";
            *error = QContactManager::NoError;
            break;
        }
        case QContactFilter::MatchCaseSensitive: {
            *error = QContactManager::NotSupportedError;
            break;
        }
        default: {
            *error = QContactManager::NotSupportedError;
            break;
        }
    }
}
void CntFilterDetail::getTableNameWhereClause(const QContactDetailFilter& detailfilter,
                                              QString& tableName,
                                              QString& sqlWhereClause ,
                                              QContactManager::Error* error) const
{
    //Get the table name and the column name
    QString columnName;
    bool isSubType;

    m_dbInfo.getDbTableAndColumnName(detailfilter.detailDefinitionName(), detailfilter.detailFieldName(), tableName, columnName, isSubType);

    // return if tableName is empty
    if (tableName.isEmpty()) {
        *error = QContactManager::NotSupportedError;
        return;
    }

    //check columnName
    if (columnName.isEmpty()) {
        *error = QContactManager::NotSupportedError;
        return;
    }
    else if (isSubType) {
        sqlWhereClause += columnName;
        sqlWhereClause += " NOT NULL ";
    }
    else if (detailfilter.detailDefinitionName() == QContactFavorite::DefinitionName) {
        bool favoritesSearch = true;
        if (detailfilter.value().canConvert(QVariant::Bool)) {
            if (!detailfilter.value().toBool()) {
                //filter to fetch non-favorite contacts
                favoritesSearch = false;    
            }
        }
        sqlWhereClause += columnName;
        if (favoritesSearch) {
            sqlWhereClause += " NOT NULL ";   
        }
        else {
            sqlWhereClause += " IS NULL ";
        }
    }
    else {
        sqlWhereClause += ' ' + columnName + ' ';
        QString fieldToUpdate;
        //Update the value depending on the match flag
        updateForMatchFlag(detailfilter,fieldToUpdate,error);
        sqlWhereClause +=  fieldToUpdate;
    }
}
void CntDisplayLabelSqlFilter::createSqlQuery(const QContactDetailFilter& filter,
                        QString& sqlQuery,
                        QContactManager::Error* error)
{
    *error = QContactManager::NoError;
    
    //get the contact fields that should be checked
    CntDisplayLabel displayLabel;
    QList<QPair<QLatin1String, QLatin1String> > contactFields = displayLabel.contactFilterDetails();
    
    //search values
    QStringList searchStrings = filter.value().toStringList();

    //default sql query
    sqlQuery = "SELECT contact_id FROM contact WHERE (type_flags>>24)=0";
    
    //everything ok
    if(!searchStrings.isEmpty() && searchStrings.count() <= contactFields.count() )
    {
        QString subQuery;
        QStringList columns;
        
        //get the column names
        for(int i = 0; i < contactFields.count(); i++)
        {
            columns << columnName(contactFields.at(i));
        }
        
        //single search value
        if(searchStrings.count() == 1)
        {
            createQuerySingleSearchValue(subQuery, searchStrings.at(0), columns);
        }
        
        //multiple search values
        else
        {
            createQueryMultipleSearchValues(subQuery, searchStrings, columns);    
        }
        
        if(!subQuery.isEmpty()){
            sqlQuery += " AND (" + subQuery + ')';
        }
   
        *error = QContactManager::NoError;
    }
    
    //if specified more filter criterias than contact fields return error
    else if(searchStrings.count() > contactFields.count()){
        *error = QContactManager::BadArgumentError;
    }
}