//------------------------------------------------------------------------------
// Desc: Indexing unit test 3
//
// Tabs: 3
//
// Copyright (c) 2004-2006 Novell, Inc. All Rights Reserved.
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 2 of the GNU General Public
// License as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, contact Novell, Inc.
//
// To contact Novell about this file by physical or electronic mail,
// you may find current contact information at www.novell.com
//
// $Id: indextest3.cpp 3119 2006-01-19 13:39:12 -0700 (Thu, 19 Jan 2006) dsanders $
//------------------------------------------------------------------------------
#include "flmunittest.h"
#if defined( FLM_NLM)
#define DB_NAME_STR "SYS:\\IX3.DB"
#else
#define DB_NAME_STR "ix3.db"
#endif
/****************************************************************************
Desc:
****************************************************************************/
class IndexTest3Impl : public TestBase
{
public:
IndexTest3Impl()
{
m_uiTextId = 0;
m_uiNumId = 0;
m_uiBinId = 0;
}
const char * getName( void);
RCODE execute( void);
RCODE runSuite1( void);
RCODE runSuite2( void);
RCODE runSuite3( void);
RCODE runSuite4( void);
RCODE runSuite5( void);
private:
FLMUINT m_uiTextId;
FLMUINT m_uiNumId;
FLMUINT m_uiBinId;
RCODE validateKeys(
FLMUINT uiIndex,
KEY_COMP_INFO * pSearchComps,
FLMUINT uiNumSearchComps,
FLMUINT uiSearchType,
FLMUINT64 ui64ExpectedDocId);
RCODE createOrModifyIndex(
FLMUINT uiIndex,
FLMBOOL bComp1SortDescending,
FLMBOOL bComp1CaseSensitive,
FLMBOOL bComp1SortMissingHigh,
FLMBOOL bComp2SortDescending,
FLMBOOL bComp2SortMissingHigh);
RCODE verifyKeyOrder(
FLMUINT uiIndex,
KEY_COMP_INFO ppCompInfo[][2],
FLMUINT uiNumCompInfo);
RCODE runQueries(
FLMUINT uiIndexToUse);
};
/****************************************************************************
Desc:
****************************************************************************/
RCODE getTest( IFlmTest ** ppTest)
{
RCODE rc = NE_XFLM_OK;
if ( ( *ppTest = new IndexTest3Impl) == NULL)
{
rc = NE_XFLM_MEM;
goto Exit;
}
Exit:
return( rc);
}
/****************************************************************************
Desc:
****************************************************************************/
const char * IndexTest3Impl::getName()
{
return "Index Test 3";
}
/****************************************************************************
Desc:
****************************************************************************/
RCODE IndexTest3Impl::execute()
{
RCODE rc = NE_XFLM_OK;
if( RC_BAD( rc = runSuite1()))
{
goto Exit;
}
if( RC_BAD( rc = runSuite2()))
{
goto Exit;
}
if( RC_BAD( rc = runSuite3()))
{
goto Exit;
}
if( RC_BAD( rc = runSuite4()))
{
goto Exit;
}
if( RC_BAD( rc = runSuite5()))
{
goto Exit;
}
Exit:
return( rc);
}
/****************************************************************************
Desc:
****************************************************************************/
RCODE IndexTest3Impl::runSuite1( void)
{
RCODE rc = NE_XFLM_OK;
FLMBOOL bDibCreated = FALSE;
IF_DOMNode * pDoc = NULL;
IF_DOMNode * pEntryNode = NULL;
IF_DOMNode * pParentAttr = NULL;
IF_DOMNode * pFlagsAttr = NULL;
IF_DataVector * pDataVector = NULL;
FLMUINT uiEntryId = 0;
FLMUINT uiParentId = 0;
FLMUINT uiFlagsId = 0;
FLMBOOL bTransActive = FALSE;
FLMUINT64 ui64EntryId = 0;
FLMUINT uiParent = 0;
FLMUINT uiFlags = 0;
const char * pszIndexDef =
" " // HARD-CODED Dict Num for easy retrieval
" "
" "
" "
" "
" ";
beginTest(
"Data Component Modify Test",
"Create an index with a data component then modify the"
" value that the data component references.",
"Self-Explanatory",
"");
if( RC_BAD( rc = initCleanTestState( DB_NAME_STR)))
{
MAKE_FLM_ERROR_STRING( "Failed to init test state.", m_szDetails, rc);
goto Exit;
}
bDibCreated = TRUE;
if( RC_BAD( rc = m_pDb->transBegin(XFLM_UPDATE_TRANS, XFLM_NO_TIMEOUT)))
{
MAKE_FLM_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
goto Exit;
}
bTransActive = TRUE;
if( RC_BAD( rc = m_pDb->createElementDef( NULL, "entry", XFLM_NODATA_TYPE,
&uiEntryId)))
{
MAKE_FLM_ERROR_STRING( "createElementDef failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = m_pDb->createAttributeDef( NULL, "parentID",
XFLM_NUMBER_TYPE, &uiParentId)))
{
MAKE_FLM_ERROR_STRING( "createAttributeDef failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = m_pDb->createAttributeDef( NULL, "flags",
XFLM_NUMBER_TYPE, &uiFlagsId)))
{
MAKE_FLM_ERROR_STRING( "createAttributeDef failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = m_pDb->createDocument( XFLM_DATA_COLLECTION, &pDoc)))
{
MAKE_FLM_ERROR_STRING( "createDocument failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pDoc->createNode( m_pDb, ELEMENT_NODE, uiEntryId,
XFLM_LAST_CHILD, &pEntryNode, &ui64EntryId)))
{
MAKE_FLM_ERROR_STRING( "createNode failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pEntryNode->createAttribute(
m_pDb, uiParentId, &pParentAttr)))
{
MAKE_FLM_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pParentAttr->setUINT( m_pDb, 1)))
{
MAKE_FLM_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pEntryNode->createAttribute(
m_pDb, uiFlagsId, &pFlagsAttr)))
{
MAKE_FLM_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pFlagsAttr->setUINT( m_pDb, 1)))
{
MAKE_FLM_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = m_pDb->documentDone( pDoc)))
{
MAKE_FLM_ERROR_STRING( "documentDone failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = importBuffer( pszIndexDef, XFLM_DICT_COLLECTION)))
{
MAKE_FLM_ERROR_STRING( "importBuffer failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = m_pDb->transCommit()))
{
MAKE_FLM_ERROR_STRING( "transCommit failed.", m_szDetails, rc);
goto Exit;
}
bTransActive = FALSE;
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS, XFLM_NO_TIMEOUT)))
{
MAKE_FLM_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = m_pDbSystem->createIFDataVector( &pDataVector)))
{
MAKE_FLM_ERROR_STRING( "createIFDataVector failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = m_pDb->keyRetrieve( 1, NULL, XFLM_FIRST, pDataVector)))
{
MAKE_FLM_ERROR_STRING( "keyRetrieve failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pDataVector->getUINT( 0, &uiParent)))
{
MAKE_FLM_ERROR_STRING( "getUINT failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pDataVector->getUINT( 1, &uiFlags)))
{
MAKE_FLM_ERROR_STRING( "getUINT failed.", m_szDetails, rc);
goto Exit;
}
if( uiParent != 1 && uiFlags != 1)
{
rc = NE_XFLM_DATA_ERROR;
MAKE_FLM_ERROR_STRING( "Incorrect key values detected.",
m_szDetails, rc);
goto Exit;
}
// change the data component value
if( RC_BAD( rc = pFlagsAttr->setUINT( m_pDb, 0)))
{
MAKE_FLM_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = m_pDb->documentDone( pDoc)))
{
MAKE_FLM_ERROR_STRING( "documentDone failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = m_pDb->transCommit()))
{
MAKE_FLM_ERROR_STRING( "transCommit failed.", m_szDetails, rc);
goto Exit;
}
bTransActive = FALSE;
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS, XFLM_NO_TIMEOUT)))
{
MAKE_FLM_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
goto Exit;
}
bTransActive = TRUE;
if( RC_BAD( rc = m_pDb->keyRetrieve( 1, NULL, XFLM_FIRST, pDataVector)))
{
MAKE_FLM_ERROR_STRING( "keyRetrieve failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pDataVector->getUINT( 1, &uiFlags)))
{
MAKE_FLM_ERROR_STRING( "getUINT failed.", m_szDetails, rc);
goto Exit;
}
if( uiFlags != 0)
{
rc = NE_XFLM_DATA_ERROR;
MAKE_FLM_ERROR_STRING( "Incorrect key values detected.",
m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pFlagsAttr->setUINT( m_pDb, 7)))
{
MAKE_FLM_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = m_pDb->documentDone( pDoc)))
{
MAKE_FLM_ERROR_STRING( "documentDone failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = m_pDb->transCommit()))
{
MAKE_FLM_ERROR_STRING( "transCommit failed.", m_szDetails, rc);
goto Exit;
}
bTransActive = FALSE;
if( RC_BAD( rc = m_pDb->keyRetrieve( 1, NULL, XFLM_LAST, pDataVector)))
{
MAKE_FLM_ERROR_STRING( "keyRetrieve failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pDataVector->getUINT( 1, &uiFlags)))
{
MAKE_FLM_ERROR_STRING( "getUINT failed.", m_szDetails, rc);
goto Exit;
}
if( uiFlags != 7)
{
rc = NE_XFLM_DATA_ERROR;
MAKE_FLM_ERROR_STRING( "Incorrect key values detected.",
m_szDetails, rc);
goto Exit;
}
endTest("PASS");
Exit:
if( RC_BAD( rc ))
{
endTest("FAIL");
}
if( bTransActive)
{
if( RC_OK( rc))
{
m_pDb->transCommit();
}
else
{
m_pDb->transAbort();
}
}
if( pParentAttr)
{
pParentAttr->Release();
}
if( pFlagsAttr)
{
pFlagsAttr->Release();
}
if( pDataVector)
{
pDataVector->Release();
}
if( pDoc)
{
pDoc->Release();
}
if( pEntryNode)
{
pEntryNode->Release();
}
shutdownTestState( DB_NAME_STR, bDibCreated);
return( rc);
}
/****************************************************************************
Desc:
****************************************************************************/
RCODE IndexTest3Impl::runSuite2( void)
{
RCODE rc = NE_XFLM_OK;
FLMBOOL bDibCreated = FALSE;
IF_DOMNode * pIndexRoot = NULL;
IF_DOMNode * pComponentNode = NULL;
IF_DOMNode * pAttr = NULL;
FLMBOOL bTransBegun = FALSE;
beginTest(
"No Required Data Component Test",
"Make sure it is illegal to make a data component required",
"Self-explanatory",
"");
if( RC_BAD( rc = initCleanTestState( DB_NAME_STR)))
{
MAKE_FLM_ERROR_STRING( "Failed to init test state.", m_szDetails, rc);
goto Exit;
}
bDibCreated = TRUE;
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
{
MAKE_FLM_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
goto Exit;
}
bTransBegun = TRUE;
if( RC_BAD( rc = m_pDb->createRootElement(
XFLM_DICT_COLLECTION, ELM_INDEX_TAG, &pIndexRoot)))
{
MAKE_FLM_ERROR_STRING( "createRootElement failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pIndexRoot->createAttribute( m_pDb, ATTR_NAME_TAG, &pAttr)))
{
MAKE_FLM_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pAttr->setUTF8( m_pDb, (FLMBYTE *)"ix")))
{
MAKE_FLM_ERROR_STRING( "setUTF8 failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pIndexRoot->createNode( m_pDb, ELEMENT_NODE,
ELM_ELEMENT_COMPONENT_TAG, XFLM_LAST_CHILD, &pComponentNode, NULL)))
{
MAKE_FLM_ERROR_STRING( "createNode failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pComponentNode->createAttribute(
m_pDb, ATTR_DICT_NUMBER_TAG, &pAttr)))
{
MAKE_FLM_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pAttr->setUINT( m_pDb, ELM_ELEMENT_COMPONENT_TAG)))
{
goto Exit;
}
if( RC_BAD( rc = pComponentNode->createAttribute(
m_pDb, ATTR_REQUIRED_TAG, &pAttr)))
{
MAKE_FLM_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pAttr->setUINT( m_pDb, 1)))
{
goto Exit;
}
if( RC_BAD( rc = pComponentNode->createAttribute(
m_pDb, ATTR_KEY_COMPONENT_TAG, &pAttr)))
{
MAKE_FLM_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pAttr->setUINT( m_pDb, 1)))
{
goto Exit;
}
if( RC_BAD( rc = pComponentNode->createNode( m_pDb, ELEMENT_NODE,
ELM_ATTRIBUTE_COMPONENT_TAG, XFLM_LAST_CHILD, &pComponentNode,
NULL)))
{
MAKE_FLM_ERROR_STRING( "createNode failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pComponentNode->createAttribute(
m_pDb, ATTR_DICT_NUMBER_TAG, &pAttr)))
{
MAKE_FLM_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pAttr->setUINT( m_pDb, ATTR_FIXED_TAG)))
{
MAKE_FLM_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pComponentNode->createAttribute(
m_pDb, ATTR_DATA_COMPONENT_TAG, &pAttr)))
{
MAKE_FLM_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pAttr->setUINT( m_pDb, 1)))
{
MAKE_FLM_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pComponentNode->createAttribute(
m_pDb, ATTR_REQUIRED_TAG, &pAttr)))
{
MAKE_FLM_ERROR_STRING( "createAttribute failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pAttr->setUINT( m_pDb, 1)))
{
MAKE_FLM_ERROR_STRING( "setUINT failed.", m_szDetails, rc);
goto Exit;
}
rc = m_pDb->documentDone( pIndexRoot);
if( rc != NE_XFLM_CANNOT_SET_REQUIRED)
{
MAKE_FLM_ERROR_STRING( "Unexpected rc returned from documentDone",
m_szDetails, rc);
if ( RC_OK(rc))
{
rc = RC_SET( NE_XFLM_FAILURE);
}
goto Exit;
}
if( RC_BAD( rc = m_pDb->transAbort()))
{
MAKE_FLM_ERROR_STRING( "transAbort failed.", m_szDetails, rc);
goto Exit;
}
bTransBegun = FALSE;
endTest("PASS");
Exit:
if( RC_BAD( rc))
{
endTest( "FAIL");
}
if( bTransBegun)
{
if( RC_OK( rc))
{
rc = m_pDb->transCommit();
}
else
{
m_pDb->transAbort();
}
}
if( pIndexRoot)
{
pIndexRoot->Release();
}
if( pComponentNode)
{
pComponentNode->Release();
}
if( pAttr)
{
pAttr->Release();
}
shutdownTestState( DB_NAME_STR, bDibCreated);
return( rc);
}
#define TEXT_INDEX_ID 123
#define BIN_INDEX_ID 456
/****************************************************************************
Desc:
****************************************************************************/
RCODE IndexTest3Impl::validateKeys(
FLMUINT uiIndex,
KEY_COMP_INFO * pSearchComps,
FLMUINT uiNumSearchComps,
FLMUINT uiSearchType,
FLMUINT64 ui64ExpectedDocId)
{
RCODE rc = NE_XFLM_OK;
IF_DataVector * pSearchKey = NULL;
IF_DataVector * pFoundKey = NULL;
FLMUINT uiLoop;
if( RC_BAD( rc = m_pDbSystem->createIFDataVector( &pSearchKey)))
{
MAKE_FLM_ERROR_STRING( "createIFDataVector failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = m_pDbSystem->createIFDataVector( &pFoundKey)))
{
MAKE_FLM_ERROR_STRING( "createIFDataVector failed.", m_szDetails, rc);
goto Exit;
}
for( uiLoop = 0; uiLoop < uiNumSearchComps; uiLoop++)
{
switch( pSearchComps[uiLoop].uiDataType)
{
case XFLM_TEXT_TYPE:
if ( RC_BAD( rc = pSearchKey->setUTF8(
uiLoop, (FLMBYTE *)pSearchComps[uiLoop].pvComp)))
{
goto Exit;
}
break;
case XFLM_BINARY_TYPE:
if ( RC_BAD( rc = pSearchKey->setBinary(
uiLoop, (FLMBYTE*)pSearchComps[uiLoop].pvComp,
pSearchComps[uiLoop].uiDataSize)))
{
goto Exit;
}
break;
case XFLM_NUMBER_TYPE:
if ( RC_BAD( rc = pSearchKey->setUINT(
uiLoop, (FLMUINT)pSearchComps[uiLoop].pvComp)))
{
goto Exit;
}
break;
default:
flmAssert(0);
}
}
if( RC_BAD( rc = m_pDb->keyRetrieve(
uiIndex, pSearchKey, uiSearchType, pFoundKey)))
{
if( (rc == NE_XFLM_NOT_FOUND || rc == NE_XFLM_EOF_HIT) &&
ui64ExpectedDocId == 0)
{
rc = NE_XFLM_OK;
}
else
{
MAKE_FLM_ERROR_STRING( "keyRetrieve failed.", m_szDetails, rc);
}
goto Exit;
}
else if( ui64ExpectedDocId == 0)
{
rc = RC_SET( NE_XFLM_FAILURE);
MAKE_FLM_ERROR_STRING( "Unexpected index key found.", m_szDetails, rc);
goto Exit;
}
if( pFoundKey->getDocumentID() != ui64ExpectedDocId)
{
rc = RC_SET( NE_XFLM_NOT_FOUND);
MAKE_FLM_ERROR_STRING( "Unexpected key found.", m_szDetails, rc);
goto Exit;
}
Exit:
if( pSearchKey)
{
pSearchKey->Release();
}
if( pFoundKey)
{
pFoundKey->Release();
}
return( rc);
}
/****************************************************************************
Desc:
****************************************************************************/
RCODE IndexTest3Impl::runSuite3( void)
{
RCODE rc = NE_XFLM_OK;
FLMBOOL bDibCreated = FALSE;
FLMBOOL bTransBegun = FALSE;
IF_DOMNode * pNode = NULL;
FLMUINT64 ui64ABCxyz2DocId = 0;
FLMUINT64 ui64ABCxyz3DocId = 0;
FLMUINT64 ui64ABCefg5DocId = 0;
FLMUINT64 ui64ABCdef5DocId = 0;
FLMUINT64 ui64CB10124DocId = 0;
FLMUINT64 ui64CB11233DocId = 0;
FLMUINT64 ui64CB12343DocId = 0;
FLMUINT64 ui64CB13451DocId = 0;
const char * pszIndexFormat =
""
""
""
"";
char * pszIndex = NULL;
beginTest(
"Truncated Key Test Setup",
"Setup DIB for the truncated key tests",
"Self-explanatory",
"");
if( RC_BAD( rc = initCleanTestState( DB_NAME_STR)))
{
MAKE_FLM_ERROR_STRING( "Failed to init test state.", m_szDetails, rc);
goto Fatal_Error;
}
bDibCreated = TRUE;
if( RC_BAD( rc = m_pDb->createElementDef(
NULL, "text_val", XFLM_TEXT_TYPE, &m_uiTextId, NULL)))
{
MAKE_FLM_ERROR_STRING( "createElementDef failed.", m_szDetails, rc);
goto Fatal_Error;
}
if( RC_BAD( rc = m_pDb->createElementDef(
NULL, "num_val", XFLM_NUMBER_TYPE, &m_uiNumId, NULL)))
{
MAKE_FLM_ERROR_STRING( "createElementDef failed.", m_szDetails, rc);
goto Fatal_Error;
}
if( RC_BAD( rc = m_pDb->createElementDef(
NULL, "bin_val", XFLM_BINARY_TYPE, &m_uiBinId, NULL)))
{
MAKE_FLM_ERROR_STRING( "createElementDef failed.", m_szDetails, rc);
goto Fatal_Error;
}
if( RC_BAD( rc = f_alloc( f_strlen( pszIndexFormat) + 16, &pszIndex)))
{
MAKE_FLM_ERROR_STRING( "f_alloc failed.", m_szDetails, rc);
goto Fatal_Error;
}
f_sprintf( pszIndex, pszIndexFormat, "text+num",
TEXT_INDEX_ID, m_uiTextId, m_uiNumId);
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
{
MAKE_FLM_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
goto Fatal_Error;
}
bTransBegun = TRUE;
// Create the index
if( RC_BAD( rc = importBuffer( pszIndex, XFLM_DICT_COLLECTION)))
{
MAKE_FLM_ERROR_STRING( "importBuffer failed.", m_szDetails, rc);
goto Fatal_Error;
}
f_sprintf( pszIndex, pszIndexFormat, "bin+num",
BIN_INDEX_ID, m_uiBinId, m_uiNumId);
if( RC_BAD( rc = importBuffer( pszIndex, XFLM_DICT_COLLECTION)))
{
MAKE_FLM_ERROR_STRING( "importBuffer failed.", m_szDetails, rc);
goto Fatal_Error;
}
// Create documents. I'm doing this in an order reverse to that in which
// their keys should be sorted.
{
ELEMENT_NODE_INFO pElementNodes[] =
{
{(void*)"ABCxyz", XFLM_TEXT_TYPE, 6, m_uiTextId},
{(void*)3, XFLM_NUMBER_TYPE, sizeof(FLMUINT), m_uiNumId}
};
if( RC_BAD( rc = createCompoundDoc(
pElementNodes, 2, &ui64ABCxyz3DocId)))
{
goto Fatal_Error;
}
}
{
ELEMENT_NODE_INFO pElementNodes[] =
{
{(void*)"ABCxyz", XFLM_TEXT_TYPE, 6, m_uiTextId},
{(void*)2, XFLM_NUMBER_TYPE, sizeof(FLMUINT), m_uiNumId}
};
if( RC_BAD( rc = createCompoundDoc(
pElementNodes, 2,&ui64ABCxyz2DocId)))
{
goto Fatal_Error;
}
}
{
ELEMENT_NODE_INFO pElementNodes[] =
{
{(void*)"ABCefg", XFLM_TEXT_TYPE, 6, m_uiTextId},
{(void*)5, XFLM_NUMBER_TYPE, sizeof(FLMUINT), m_uiNumId}
};
if( RC_BAD( rc = createCompoundDoc(
pElementNodes, 2, &ui64ABCefg5DocId)))
{
goto Fatal_Error;
}
}
{
ELEMENT_NODE_INFO pElementNodes[] =
{
{(void*)"ABCdef", XFLM_TEXT_TYPE, 6, m_uiTextId},
{(void*)5, XFLM_NUMBER_TYPE, sizeof(FLMUINT), m_uiNumId}
};
if( RC_BAD( rc = createCompoundDoc(
pElementNodes, 2, &ui64ABCdef5DocId)))
{
goto Fatal_Error;
}
}
// Documents with binary fields
{
ELEMENT_NODE_INFO pElementNodes[] =
{
{(void*)"\xC\xB\x1\x3\x4\x5", XFLM_BINARY_TYPE, 6, m_uiBinId},
{(void*)1, XFLM_NUMBER_TYPE, sizeof(FLMUINT), m_uiNumId}
};
if( RC_BAD( rc = createCompoundDoc(
pElementNodes, 2, &ui64CB13451DocId)))
{
goto Fatal_Error;
}
}
{
ELEMENT_NODE_INFO pElementNodes[] =
{
{(void*)"\xC\xB\x1\x2\x3\x4", XFLM_BINARY_TYPE, 6, m_uiBinId},
{(void*)3, XFLM_NUMBER_TYPE, sizeof(FLMUINT), m_uiNumId}
};
if( RC_BAD( rc = createCompoundDoc(
pElementNodes, 2, &ui64CB12343DocId)))
{
goto Fatal_Error;
}
}
{
ELEMENT_NODE_INFO pElementNodes[] =
{
{(void*)"\xC\xB\x1\x1\x2\x3", XFLM_BINARY_TYPE, 6, m_uiBinId},
{(void*)3, XFLM_NUMBER_TYPE, sizeof(FLMUINT), m_uiNumId}
};
if( RC_BAD( rc = createCompoundDoc(
pElementNodes, 2, &ui64CB11233DocId)))
{
goto Fatal_Error;
}
}
{
ELEMENT_NODE_INFO pElementNodes[] =
{
{(void*)"\xC\xB\x1\x0\x1\x2", XFLM_BINARY_TYPE, 6, m_uiBinId},
{(void*)4, XFLM_NUMBER_TYPE, sizeof(FLMUINT), m_uiNumId}
};
if( RC_BAD( rc = createCompoundDoc(
pElementNodes, 2, &ui64CB10124DocId)))
{
goto Fatal_Error;
}
}
endTest( "PASS");
// Keys for the first index should be as follows:
// ABC|def + 5
// ABC|efg + 5
// ABC|xyz + 2
// ABC|xyz + 3
beginTest(
"Truncated Key Test #1",
"Verify key retrieve results for truncated keys",
"Self-explanatory",
"");
// inclusive key retrieve for ABCefg+5. Expected returns:
// ABCefg+5
{
KEY_COMP_INFO searchKey[] = {
{(void*)"ABCefg", XFLM_TEXT_TYPE, 6},
{(void*)5, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}
};
if( RC_BAD( rc = validateKeys(
TEXT_INDEX_ID, searchKey, 2, XFLM_INCL, ui64ABCefg5DocId)))
{
endTest("FAIL");
}
else
{
endTest("PASS");
}
}
beginTest(
"Truncated Key Test #2",
"Verify key retrieve results for truncated keys",
"Self-explanatory",
"");
// exclusive key retrieve for ABCdef+5. Expected returns:
// ABCefg+5
{
KEY_COMP_INFO searchKey[] =
{
{(void*)"ABCdef", XFLM_TEXT_TYPE, 6},
{(void*)5, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}
};
if( RC_BAD( rc = validateKeys(
TEXT_INDEX_ID, searchKey, 2, XFLM_EXCL, ui64ABCefg5DocId)))
{
endTest("FAIL");
}
else
{
endTest("PASS");
}
}
beginTest(
"Truncated Key Test #3",
"Verify key retrieve results for truncated keys",
"Self-explanatory",
"");
// inclusive key retrieve for ABCxyz+2. Expected returns:
// ABCxyz+2
{
KEY_COMP_INFO searchKey[] =
{
{(void*)"ABCxyz", XFLM_TEXT_TYPE, 6},
{(void*)2, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}
};
if( RC_BAD( rc = validateKeys(
TEXT_INDEX_ID, searchKey, 2, XFLM_INCL,
ui64ABCxyz2DocId)))
{
endTest("FAIL");
}
else
{
endTest("PASS");
}
}
beginTest(
"Truncated Key Test #4",
"Verify key retrieve results for truncated keys",
"Self-explanatory",
"");
// exclusive key retrieve for ABCxyz+2. Expected returns:
// ABCxyz+3
{
KEY_COMP_INFO searchKey[] =
{
{(void*)"ABCxyz", XFLM_TEXT_TYPE, 6},
{(void*)2, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}
};
if( RC_BAD( rc = validateKeys(
TEXT_INDEX_ID, searchKey, 2, XFLM_EXCL,
ui64ABCxyz3DocId)))
{
endTest("FAIL");
}
else
{
endTest("PASS");
}
}
beginTest(
"Truncated Key Test #5",
"Verify key retrieve results for truncated keys",
"Self-explanatory",
"");
// inclusive key retrieve for ABCyyz+2. Expected returns:
// none
{
KEY_COMP_INFO searchKey[] =
{
{(void*)"ABCyyz", XFLM_TEXT_TYPE, 6},
{(void*)2, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}
};
if( RC_BAD( rc = validateKeys(
TEXT_INDEX_ID, searchKey, 2, XFLM_INCL, 0)))
{
endTest("FAIL");
}
else
{
endTest("PASS");
}
}
beginTest(
"Truncated Key Test #6",
"Verify key retrieve results for truncated keys",
"Self-explanatory",
"");
// exclusive key retrieve for ABCghi+2. Expected returns:
// ABCxyz+2
{
KEY_COMP_INFO searchKey[] =
{
{(void*)"ABCghi", XFLM_TEXT_TYPE, 6},
{(void*)2, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}
};
if( RC_BAD( rc = validateKeys(
TEXT_INDEX_ID, searchKey, 2, XFLM_EXCL, ui64ABCxyz2DocId)))
{
endTest("FAIL");
}
else
{
endTest("PASS");
}
}
beginTest(
"Truncated Key Test #7",
"Verify key retrieve results for truncated keys",
"Self-explanatory",
"");
// inclusive key retrieve for ABCdef+6. Expected returns:
// ABCefg+5
{
KEY_COMP_INFO searchKey[] =
{
{(void*)"ABCdef", XFLM_TEXT_TYPE, 6},
{(void*)6, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}
};
if( RC_BAD( rc = validateKeys(
TEXT_INDEX_ID, searchKey, 2, XFLM_INCL, ui64ABCefg5DocId)))
{
endTest("FAIL");
}
else
{
endTest("PASS");
}
}
beginTest(
"Truncated Key Test #8",
"Verify key retrieve results for truncated keys",
"Self-explanatory",
"");
// exclusive key retrieve for ABCdef+5. Expected returns:
// ABCefg+5
{
KEY_COMP_INFO searchKey[] =
{
{(void*)"ABCdef", XFLM_TEXT_TYPE, 6},
{(void*)5, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}
};
if( RC_BAD( rc = validateKeys(
TEXT_INDEX_ID, searchKey, 2, XFLM_EXCL, ui64ABCefg5DocId)))
{
endTest("FAIL");
}
else
{
endTest("PASS");
}
}
beginTest(
"Truncated Key Test #9",
"Verify key retrieve results for truncated keys",
"Self-explanatory",
"");
// exclusive key retrieve for ABCxyz+3. Expected returns:
// none
{
KEY_COMP_INFO searchKey[] =
{
{(void*)"ABCxyz", XFLM_TEXT_TYPE, 6},
{(void*)3, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}
};
if( RC_BAD( rc = validateKeys(
TEXT_INDEX_ID, searchKey, 2, XFLM_EXCL, 0)))
{
endTest("FAIL");
}
else
{
endTest("PASS");
}
}
// Keys for the second index should be as follows:
// 0xC,0xB,0x1|0x0,0x1,0x2 + 4
// 0xC,0xB,0x1|0x1,0x2,0x3 + 3
// 0xC,0xB,0x1|0x2,0x3,0x4 + 3
// 0xC,0xB,0x1|0x3,0x4,0x5 + 1
// inclusive key retrieve for xCxBx1x2x3x4+3. Expected return
// xCxBx1x2x3x4+3
beginTest(
"Truncated Key Test #10",
"Verify key retrieve results for truncated keys",
"Self-explanatory",
"");
{
KEY_COMP_INFO searchKey[] =
{
{(void*)"\xC\xB\x1\x2\x3\x4", XFLM_BINARY_TYPE, 6},
{(void*)3, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}
};
if( RC_BAD( rc = validateKeys(
BIN_INDEX_ID, searchKey, 2, XFLM_INCL, ui64CB12343DocId)))
{
endTest("FAIL");
}
else
{
endTest("PASS");
}
}
// exclusive key retrieve for xCxBx1x0x1x2+4. Expected return
// xCxBx1x1x2x3+3
beginTest(
"Truncated Key Test #11",
"Verify key retrieve results for truncated keys",
"Self-explanatory",
"");
{
KEY_COMP_INFO searchKey[] =
{
{(void*)"\xC\xB\x1\x0\x1\x2", XFLM_BINARY_TYPE, 6},
{(void*)4, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}
};
if( RC_BAD( rc = validateKeys(
BIN_INDEX_ID, searchKey, 2, XFLM_EXCL, ui64CB11233DocId)))
{
endTest("FAIL");
}
else
{
endTest("PASS");
}
}
// inclusive key retrieve for xCxBx1x3x4x5+1. Expected return
// xCxBx1x3x4x5+1
beginTest(
"Truncated Key Test #12",
"Verify key retrieve results for truncated keys",
"Self-explanatory",
"");
{
KEY_COMP_INFO searchKey[] =
{
{(void*)"\xC\xB\x1\x3\x4\x5", XFLM_BINARY_TYPE, 6},
{(void*)1, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}
};
if( RC_BAD( rc = validateKeys(
BIN_INDEX_ID, searchKey, 2, XFLM_INCL, ui64CB13451DocId)))
{
endTest("FAIL");
}
else
{
endTest("PASS");
}
}
// inclusive key retrieve for xCxBx1x0x1x2+1. Expected return
// xCxBx1x0x1x2+4
beginTest(
"Truncated Key Test #13",
"Verify key retrieve results for truncated keys",
"Self-explanatory",
"");
{
KEY_COMP_INFO searchKey[] =
{
{(void*)"\xC\xB\x1\x0\x1\x2", XFLM_BINARY_TYPE, 6},
{(void*)1, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}
};
if( RC_BAD( rc = validateKeys(
BIN_INDEX_ID, searchKey, 2, XFLM_INCL, ui64CB10124DocId)))
{
endTest("FAIL");
}
else
{
endTest("PASS");
}
}
beginTest(
"Truncated Key Modify Test",
"Modify a value that is indexed by a truncated key and make sure "
"we do not assert when trying to delete the old key value",
"Self-explanatory",
"");
if( RC_BAD( rc = m_pDb->transCommit()))
{
MAKE_FLM_ERROR_STRING( "transCommit failed", m_szDetails, rc);
goto Fatal_Error;
}
bTransBegun = FALSE;
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
{
MAKE_FLM_ERROR_STRING( "transBegin failed", m_szDetails, rc);
goto Fatal_Error;
}
bTransBegun = TRUE;
if( RC_BAD( rc = m_pDb->getNode(
XFLM_DATA_COLLECTION, ui64ABCefg5DocId, &pNode)))
{
MAKE_FLM_ERROR_STRING( "getNode failed", m_szDetails, rc);
goto Fatal_Error;
}
if( RC_BAD( rc = pNode->getFirstChild( m_pDb, &pNode)))
{
MAKE_FLM_ERROR_STRING( "getFirstChild failed", m_szDetails, rc);
goto Fatal_Error;
}
if( RC_BAD( rc = pNode->setUTF8( m_pDb, (FLMBYTE *)"New Value")))
{
MAKE_FLM_ERROR_STRING( "setUTF8 failed", m_szDetails, rc);
goto Fatal_Error;
}
if( RC_BAD( rc = m_pDb->transCommit()))
{
MAKE_FLM_ERROR_STRING( "transCommit failed", m_szDetails, rc);
goto Fatal_Error;
}
bTransBegun = FALSE;
endTest("PASS");
goto Exit;
Fatal_Error:
endTest("FAIL");
Exit:
if( pNode)
{
pNode->Release();
}
if( pszIndex)
{
f_free( &pszIndex);
}
if( bTransBegun)
{
if( RC_OK( rc))
{
rc = m_pDb->transCommit();
}
else
{
m_pDb->transAbort();
}
}
shutdownTestState( DB_NAME_STR, bDibCreated);
return( rc);
}
/****************************************************************************
Desc:
****************************************************************************/
RCODE IndexTest3Impl::createOrModifyIndex(
FLMUINT uiIndex,
FLMBOOL bComp1SortDescending,
FLMBOOL bComp1CaseSensitive,
FLMBOOL bComp1SortMissingHigh,
FLMBOOL bComp2SortDescending,
FLMBOOL bComp2SortMissingHigh)
{
RCODE rc = NE_XFLM_OK;
char szCompareRules1[100];
char szCompareRules2[100];
char szName[100];
char * pszIndex = NULL;
IF_DOMNode * pNode = NULL;
const char * pszIndexFormat =
""
""
""
"";
szCompareRules1[0] = '\0';
szCompareRules2[0] = '\0';
if( bComp1SortDescending)
{
f_strcpy( szCompareRules1, XFLM_DESCENDING_OPTION_STR);
}
if( !bComp1CaseSensitive)
{
f_strcat( szCompareRules1, " "XFLM_CASE_INSENSITIVE_OPTION_STR);
}
if( bComp1SortMissingHigh)
{
f_strcat( szCompareRules1, " "XFLM_MISSING_HIGH_OPTION_STR);
}
if( bComp2SortDescending)
{
f_strcpy( szCompareRules2, XFLM_DESCENDING_OPTION_STR);
}
if( bComp2SortMissingHigh)
{
f_strcat( szCompareRules2, " "XFLM_MISSING_HIGH_OPTION_STR);
}
f_sprintf( szName, "(%s/%s)", szCompareRules1, szCompareRules2);
if( RC_BAD( rc = f_alloc( f_strlen( pszIndexFormat) +
(f_strlen( szCompareRules1) + f_strlen(szCompareRules2)) * 2 +
16, &pszIndex)))
{
MAKE_FLM_ERROR_STRING( "f_alloc failed", m_szDetails, rc);
goto Exit;
}
f_sprintf( pszIndex, pszIndexFormat, szName, uiIndex,
szCompareRules1, m_uiTextId, szCompareRules2, m_uiNumId);
// remove the index if it already exists
if( RC_OK( rc = m_pDb->getDictionaryDef( ELM_INDEX_TAG, uiIndex, &pNode)))
{
if( RC_BAD( rc = pNode->deleteNode( m_pDb)))
{
MAKE_FLM_ERROR_STRING( "deleteNode failed.", m_szDetails, rc);
goto Exit;
}
}
if( RC_BAD( rc = importBuffer( pszIndex, XFLM_DICT_COLLECTION)))
{
goto Exit;
}
Exit:
if( pNode)
{
pNode->Release();
}
if( pszIndex)
{
f_free( &pszIndex);
}
return( rc);
}
/****************************************************************************
Desc:
****************************************************************************/
RCODE IndexTest3Impl::verifyKeyOrder(
FLMUINT uiIndex,
KEY_COMP_INFO ppCompInfo[][2],
FLMUINT uiNumCompInfo)
{
RCODE rc = NE_XFLM_OK;
FLMUINT uiLoop1;
FLMUINT uiLoop2;
IF_DataVector * pKey = NULL;
char szTmpBuf[100];
FLMUINT uiTmp;
if( RC_BAD( rc = m_pDbSystem->createIFDataVector( &pKey)))
{
MAKE_FLM_ERROR_STRING( "createIFDataVector failed.", m_szDetails, rc);
goto Exit;
}
for( uiLoop1 = 0; uiLoop1 < uiNumCompInfo; uiLoop1++)
{
if( uiLoop1 == 0)
{
if( RC_BAD( rc = m_pDb->keyRetrieve(
uiIndex, NULL, XFLM_FIRST, pKey)))
{
MAKE_FLM_ERROR_STRING( "keyRetrieve failed.", m_szDetails, rc);
goto Exit;
}
}
else
{
if( RC_BAD( rc = m_pDb->keyRetrieve(
uiIndex, pKey, XFLM_EXCL, pKey)))
{
MAKE_FLM_ERROR_STRING( "keyRetrieve failed.", m_szDetails, rc);
goto Exit;
}
}
// VISIT - if we want to reuse this code, we'll want to
// null-terminate the array. Right now we are simply assuming
// two components per key
for( uiLoop2 = 0; uiLoop2 < 2; uiLoop2++)
{
switch( ppCompInfo[uiLoop1][uiLoop2].uiDataType)
{
case XFLM_TEXT_TYPE:
uiTmp = sizeof( szTmpBuf);
if ( RC_BAD( rc = pKey->getUTF8( uiLoop2,
(FLMBYTE *)szTmpBuf, &uiTmp)))
{
if ( ppCompInfo[uiLoop1][uiLoop2].uiDataSize == 0 &&
rc == NE_XFLM_NOT_FOUND)
{
rc = NE_XFLM_OK;
break;
}
else
{
MAKE_FLM_ERROR_STRING( "getNative failed.", m_szDetails, rc);
goto Exit;
}
}
if ( uiTmp != ppCompInfo[uiLoop1][uiLoop2].uiDataSize ||
f_strcmp( szTmpBuf,(char*)ppCompInfo[uiLoop1][uiLoop2].pvComp)
!= 0)
{
rc = RC_SET( NE_XFLM_DATA_ERROR);
MAKE_FLM_ERROR_STRING( "Unexpected key found.", m_szDetails, rc);
goto Exit;
}
// else missing key component verified
break;
case XFLM_NUMBER_TYPE:
if ( RC_BAD( rc = pKey->getUINT( uiLoop2, &uiTmp)))
{
if ( ppCompInfo[uiLoop1][uiLoop2].uiDataSize == 0 &&
rc == NE_XFLM_NOT_FOUND)
{
rc = NE_XFLM_OK;
break;
}
else
{
MAKE_FLM_ERROR_STRING( "getUINT failed.", m_szDetails, rc);
goto Exit;
}
}
if ( uiTmp != (FLMUINT)ppCompInfo[uiLoop1][uiLoop2].pvComp)
{
rc = RC_SET( NE_XFLM_DATA_ERROR);
MAKE_FLM_ERROR_STRING( "Unexpected key found", m_szDetails, rc);
goto Exit;
}
break;
case XFLM_BINARY_TYPE:
uiTmp = sizeof( szTmpBuf);
if ( RC_BAD( rc = pKey->getBinary( uiLoop2, szTmpBuf, &uiTmp)))
{
if ( ppCompInfo[uiLoop1][uiLoop2].uiDataSize == 0 &&
rc == NE_XFLM_NOT_FOUND)
{
rc = NE_XFLM_OK;
break;
}
else
{
MAKE_FLM_ERROR_STRING( "getBinary failed.", m_szDetails, rc);
goto Exit;
}
}
if ( ( ppCompInfo[uiLoop1][uiLoop2].uiDataSize != uiTmp) ||
f_memcmp( szTmpBuf,(char*)ppCompInfo[uiLoop1][uiLoop2].pvComp,
ppCompInfo[uiLoop1][uiLoop2].uiDataSize)
!= 0)
{
rc = RC_SET( NE_XFLM_DATA_ERROR);
MAKE_FLM_ERROR_STRING( "Unexpected key found", m_szDetails, rc);
goto Exit;
}
break;
default:
flmAssert(0);
}
}
}
Exit:
if( pKey)
{
pKey->Release();
}
return rc;
}
/****************************************************************************
Desc:
****************************************************************************/
RCODE IndexTest3Impl::runQueries(
FLMUINT uiIndexToUse)
{
RCODE rc = NE_XFLM_OK;
IF_Query * pQuery = NULL;
char szQuery[ 100];
const char * pszQueryFormat;
FLMUINT uiIndexUsed;
FLMBOOL bCaseInsensitive = FALSE;
if( RC_BAD( rc = m_pDbSystem->createIFQuery( &pQuery)))
{
goto Exit;
}
Go_Again:
{
pszQueryFormat = "//text_val[. > %s\"ABCD\"]";
const char * ppszResults[] = {"EFGH", "EFGH", "ijkl", "ijkl", "IJKL", "IJKL"};
if ( bCaseInsensitive)
{
f_sprintf( szQuery, pszQueryFormat, "{ci}");
}
else
{
f_sprintf( szQuery, pszQueryFormat, "");
}
if ( RC_BAD( rc = doQueryTest( szQuery, ppszResults,
sizeof( ppszResults) / sizeof( ppszResults[0]), pQuery,
m_szDetails, uiIndexToUse, &uiIndexUsed)))
{
goto Exit;
}
if ( uiIndexToUse != uiIndexUsed)
{
rc = RC_SET( NE_XFLM_FAILURE);
goto Exit;
}
}
{
pszQueryFormat = "//text_val[. >= %s\"ABCD\"]";
const char * ppszResults[] = {"ABCD", "EFGH", "EFGH", "ijkl", "ijkl", "IJKL", "IJKL"};
if ( bCaseInsensitive)
{
f_sprintf( szQuery, pszQueryFormat, "{ci}");
}
else
{
f_sprintf( szQuery, pszQueryFormat, "");
}
if ( RC_BAD( rc = doQueryTest( szQuery, ppszResults,
sizeof(ppszResults)/sizeof(ppszResults[0]), pQuery,
m_szDetails, uiIndexToUse, &uiIndexUsed)))
{
goto Exit;
}
if ( uiIndexToUse != uiIndexUsed)
{
rc = RC_SET( NE_XFLM_FAILURE);
goto Exit;
}
}
{
pszQueryFormat = "//text_val[. < %s\"ijkl\"]";
const char * ppszResults[] = { "ABCD", "EFGH", "EFGH"};
if ( bCaseInsensitive)
{
f_sprintf( szQuery, pszQueryFormat, "{ci}");
}
else
{
f_sprintf( szQuery, pszQueryFormat, "");
}
if ( RC_BAD( rc = doQueryTest( szQuery, ppszResults,
sizeof(ppszResults)/sizeof(ppszResults[0]), pQuery,
m_szDetails, uiIndexToUse, &uiIndexUsed)))
{
goto Exit;
}
if ( uiIndexToUse != uiIndexUsed)
{
rc = RC_SET( NE_XFLM_FAILURE);
goto Exit;
}
}
{
pszQueryFormat = "//text_val[. <= %s\"ijkl\"]";
if ( bCaseInsensitive)
{
const char * ppszResults[] = {"ABCD", "EFGH", "EFGH", "IJKL", "IJKL", "ijkl", "ijkl"};
f_sprintf( szQuery, pszQueryFormat, "{ci}");
if ( RC_BAD( rc = doQueryTest( szQuery, ppszResults,
sizeof(ppszResults)/sizeof(ppszResults[0]), pQuery,
m_szDetails, uiIndexToUse, &uiIndexUsed)))
{
goto Exit;
}
}
else
{
const char * ppszResults[] = {"ABCD", "EFGH", "EFGH", "ijkl", "ijkl"};
f_sprintf( szQuery, pszQueryFormat, "");
if ( RC_BAD( rc = doQueryTest( szQuery, ppszResults,
sizeof(ppszResults)/sizeof(ppszResults[0]), pQuery,
m_szDetails, uiIndexToUse, &uiIndexUsed)))
{
goto Exit;
}
}
if ( uiIndexToUse != uiIndexUsed)
{
rc = RC_SET( NE_XFLM_FAILURE);
goto Exit;
}
}
{
pszQueryFormat = "//text_val[. >= %s\"ijkl\"]";
const char * ppszResults[] = {"IJKL", "IJKL", "ijkl", "ijkl"};
if ( bCaseInsensitive)
{
f_sprintf( szQuery, pszQueryFormat, "{ci}");
}
else
{
f_sprintf( szQuery, pszQueryFormat, "");
}
if ( RC_BAD( rc = doQueryTest( szQuery, ppszResults,
sizeof(ppszResults)/sizeof(ppszResults[0]), pQuery,
m_szDetails, uiIndexToUse, &uiIndexUsed)))
{
goto Exit;
}
if ( uiIndexToUse != uiIndexUsed)
{
rc = RC_SET( NE_XFLM_FAILURE);
goto Exit;
}
}
{
pszQueryFormat = "//text_val[. == %s\"IJKL\" && following-sibling::num_val[. == 123]]";
if ( bCaseInsensitive)
{
const char * ppszResults[] = {"IJKL", "ijkl"};
f_sprintf( szQuery, pszQueryFormat, "{ci}");
if ( RC_BAD( rc = doQueryTest( szQuery, ppszResults,
sizeof(ppszResults)/sizeof(ppszResults[0]), pQuery,
m_szDetails, uiIndexToUse, &uiIndexUsed)))
{
goto Exit;
}
}
else
{
const char * ppszResults[] = {"IJKL"};
f_sprintf( szQuery, pszQueryFormat, "");
if ( RC_BAD( rc = doQueryTest( szQuery, ppszResults,
sizeof(ppszResults)/sizeof(ppszResults[0]), pQuery,
m_szDetails, uiIndexToUse, &uiIndexUsed)))
{
goto Exit;
}
}
if ( uiIndexToUse != uiIndexUsed)
{
rc = RC_SET( NE_XFLM_FAILURE);
goto Exit;
}
}
{
pszQueryFormat = "//text_val[. == %s\"ij*\"]";
if ( bCaseInsensitive)
{
const char * ppszResults[] = {"ijkl", "ijkl", "IJKL", "IJKL"};
f_sprintf( szQuery, pszQueryFormat, "{ci}");
if ( RC_BAD( rc = doQueryTest( szQuery, ppszResults,
sizeof(ppszResults)/sizeof(ppszResults[0]), pQuery,
m_szDetails, uiIndexToUse, &uiIndexUsed)))
{
goto Exit;
}
}
else
{
const char * ppszResults[] = {"ijkl", "ijkl"};
f_sprintf( szQuery, pszQueryFormat, "");
if ( RC_BAD( rc = doQueryTest( szQuery, ppszResults,
sizeof(ppszResults)/sizeof(ppszResults[0]), pQuery,
m_szDetails, uiIndexToUse, &uiIndexUsed)))
{
goto Exit;
}
}
if ( uiIndexToUse != uiIndexUsed)
{
rc = RC_SET( NE_XFLM_FAILURE);
goto Exit;
}
}
{
pszQueryFormat = "//text_val[. == %s\"*GH\"]";
const char * ppszResults[] = {"EFGH", "EFGH"};
if ( bCaseInsensitive)
{
f_sprintf( szQuery, pszQueryFormat, "{ci}");
}
else
{
f_sprintf( szQuery, pszQueryFormat, "");
}
if ( RC_BAD( rc = doQueryTest( szQuery, ppszResults,
sizeof(ppszResults)/sizeof(ppszResults[0]), pQuery,
m_szDetails, uiIndexToUse, &uiIndexUsed)))
{
goto Exit;
}
if ( uiIndexToUse != uiIndexUsed)
{
rc = RC_SET( NE_XFLM_FAILURE);
goto Exit;
}
}
{
pszQueryFormat = "//text_val[. == %s\"*G*\"]";
const char * ppszResults[] = {"EFGH", "EFGH"};
if ( bCaseInsensitive)
{
f_sprintf( szQuery, pszQueryFormat, "{ci}");
}
else
{
f_sprintf( szQuery, pszQueryFormat, "");
}
if ( RC_BAD( rc = doQueryTest( szQuery, ppszResults,
sizeof(ppszResults)/sizeof(ppszResults[0]), pQuery,
m_szDetails, uiIndexToUse, &uiIndexUsed)))
{
goto Exit;
}
if ( uiIndexToUse != uiIndexUsed)
{
rc = RC_SET( NE_XFLM_FAILURE);
goto Exit;
}
}
if ( !bCaseInsensitive)
{
bCaseInsensitive = TRUE;
goto Go_Again;
}
Exit:
if ( pQuery)
{
pQuery->Release();
}
return rc;
}
#define SUITE4_IX_NUM 42
/****************************************************************************
Desc:
****************************************************************************/
RCODE IndexTest3Impl::runSuite4( void)
{
RCODE rc = NE_XFLM_OK;
FLMBOOL bDibCreated = FALSE;
FLMBOOL bTransBegun = FALSE;
FLMUINT uiLoop;
beginTest(
"Truncated Key Test Setup",
"Setup DIB for the truncated key tests",
"Self-explanatory",
"");
if ( RC_BAD( rc = initCleanTestState( DB_NAME_STR)))
{
MAKE_FLM_ERROR_STRING( "Failed to init test state.", m_szDetails, rc);
goto Fatal_Error;
}
bDibCreated = TRUE;
if ( RC_BAD( rc = m_pDb->createElementDef(
NULL, "text_val", XFLM_TEXT_TYPE, &m_uiTextId, NULL)))
{
MAKE_FLM_ERROR_STRING( "createElementDef failed.", m_szDetails, rc);
goto Fatal_Error;
}
if ( RC_BAD( rc = m_pDb->createElementDef(
NULL, "num_val", XFLM_NUMBER_TYPE, &m_uiNumId, NULL)))
{
MAKE_FLM_ERROR_STRING( "createElementDef failed.", m_szDetails, rc);
goto Fatal_Error;
}
if ( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
{
MAKE_FLM_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
goto Fatal_Error;
}
bTransBegun = TRUE;
// Create documents.
{
ELEMENT_NODE_INFO pElementNodes[][2] =
{
{
{(void*)"ABCD", XFLM_TEXT_TYPE, 4, m_uiTextId},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT), m_uiNumId}
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4, m_uiTextId},
{NULL, XFLM_NODATA_TYPE, 0, 0} // Placeholder so the array won't be jagged
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4, m_uiTextId},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT), m_uiNumId}
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4, m_uiTextId},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT), m_uiNumId}
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4, m_uiTextId},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT), m_uiNumId}
},
{
{(void*)"ijkl", XFLM_TEXT_TYPE, 4, m_uiTextId},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT), m_uiNumId}
},
{
{(void*)"ijkl", XFLM_TEXT_TYPE, 4, m_uiTextId},
{NULL, XFLM_NODATA_TYPE, 0, 0} // Placeholder so the array won't be jagged
},
{
{NULL, XFLM_NODATA_TYPE, 0, 0}, // Placeholder so the array won't be jagged
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT), m_uiNumId}
},
};
for( uiLoop = 0; uiLoop < 8; uiLoop++)
{
if ( RC_BAD( rc = createCompoundDoc(
pElementNodes[uiLoop], 2, NULL)))
{
goto Fatal_Error;
}
}
// Commit the transaction so we can have something to examine in the
// database should any test fail.
if ( RC_BAD( rc = m_pDb->transCommit()))
{
MAKE_FLM_ERROR_STRING( "transCommit failed.", m_szDetails, rc);
goto Fatal_Error;
}
bTransBegun = FALSE;
}
if ( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
{
MAKE_FLM_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
goto Fatal_Error;
}
bTransBegun = TRUE;
endTest("PASS");
beginTest(
"Key Sort Test (primary key: descending/case-sensitive/missing high; "
"secondary key: descending/missing high)",
"Setup DIB for the truncated key tests",
"Self-explanatory",
"");
{
// Array of key components in sorted order
KEY_COMP_INFO ppComponents[][2] =
{
{
{(void*)NULL, XFLM_TEXT_TYPE, 0}, // missing component
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"ijkl", XFLM_TEXT_TYPE, 4},
{(void*)NULL, XFLM_NUMBER_TYPE, 0}, // missing component
},
{
{(void*)"ijkl", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)0, XFLM_NUMBER_TYPE, 0}, // missing component
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"ABCD", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
};
if ( RC_BAD( rc = createOrModifyIndex(
SUITE4_IX_NUM,
TRUE, // Comp #1 sort descending
TRUE, // Comp #1 case-sensitive
TRUE, // Comp #1 sort missing high
TRUE, // Comp #2 sort descending
TRUE))) // Comp #2 sort missing high
{
endTest("FAIL");
goto Exit1;
}
if ( RC_BAD( rc = verifyKeyOrder( SUITE4_IX_NUM, ppComponents, 8)))
{
endTest("FAIL");
goto Exit1;
}
// Make sure the new index doesn't break the queries
if ( RC_BAD( rc = runQueries( SUITE4_IX_NUM)))
{
endTest("FAIL");
goto Exit1;
}
}
endTest("PASS");
Exit1:
beginTest(
"Key Sort Test (primary key: descending/case-sensitive; "
"secondary key: descending)",
"Setup DIB for the truncated key tests",
"Self-explanatory",
"");
{
// Array of key components in sorted order
KEY_COMP_INFO ppComponents[][2] =
{
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"ijkl", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"ijkl", XFLM_TEXT_TYPE, 4},
{(void*)0, XFLM_NUMBER_TYPE, 0}, // missing component
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)0, XFLM_NUMBER_TYPE, 0}, // missing component
},
{
{(void*)"ABCD", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)NULL, XFLM_TEXT_TYPE, 0}, // missing component
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
};
if ( RC_BAD( rc = createOrModifyIndex(
SUITE4_IX_NUM,
TRUE, // Comp #1 sort descending
TRUE, // Comp #1 case-sensitive
FALSE, // Comp #1 sort missing high
TRUE, // Comp #2 sort descending
FALSE))) // Comp #2 sort missing high
{
endTest("FAIL");
goto Exit2;
}
if ( RC_BAD( rc = verifyKeyOrder( SUITE4_IX_NUM, ppComponents, 8)))
{
endTest("FAIL");
goto Exit2;
}
// Make sure the new index doesn't break the queries
if ( RC_BAD( rc = runQueries( SUITE4_IX_NUM)))
{
endTest("FAIL");
goto Exit2;
}
}
endTest("PASS");
Exit2:
beginTest(
"Key Sort Test (primary key: ascending/case-sensitive; "
"secondary key: descending)",
"Setup DIB for the truncated key tests",
"Self-explanatory",
"");
{
// Array of key components in sorted order
KEY_COMP_INFO ppComponents[][2] =
{
{
{(void*)NULL, XFLM_TEXT_TYPE, 0}, // missing component
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"ABCD", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)NULL, XFLM_NUMBER_TYPE, 0}, // missing component
},
{
{(void*)"ijkl", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"ijkl", XFLM_TEXT_TYPE, 4},
{(void*)NULL, XFLM_NUMBER_TYPE, 0}, // missing component
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
};
if ( RC_BAD( rc = createOrModifyIndex(
SUITE4_IX_NUM,
FALSE, // Comp #1 sort descending
TRUE, // Comp #1 case-sensitive
FALSE, // Comp #1 sort missing high
TRUE, // Comp #2 sort descending
FALSE))) // Comp #2 sort missing high
{
endTest("FAIL");
goto Exit3;
}
if ( RC_BAD( rc = verifyKeyOrder( SUITE4_IX_NUM, ppComponents, 8)))
{
endTest("FAIL");
goto Exit3;
}
// Make sure the new index doesn't break the queries
if ( RC_BAD( rc = runQueries( SUITE4_IX_NUM)))
{
endTest("FAIL");
goto Exit3;
}
}
endTest("PASS");
Exit3:
beginTest(
"Key Sort Test (primary key: ascending/case-sensitive; "
"secondary key: descending/missing high)",
"Setup DIB for the truncated key tests",
"Self-explanatory",
"");
{
// Array of key components in sorted order
KEY_COMP_INFO ppComponents[][2] =
{
{
{(void*)NULL, XFLM_TEXT_TYPE, 0}, // missing component
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"ABCD", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)NULL, XFLM_NUMBER_TYPE, 0}, // missing component
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"ijkl", XFLM_TEXT_TYPE, 4},
{(void*)NULL, XFLM_NUMBER_TYPE, 0}, // missing component
},
{
{(void*)"ijkl", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
};
if ( RC_BAD( rc = createOrModifyIndex(
SUITE4_IX_NUM,
FALSE, // Comp #1 sort descending
TRUE, // Comp #1 case-sensitive
FALSE, // Comp #1 sort missing high
TRUE, // Comp #2 sort descending
TRUE))) // Comp #2 sort missing high
{
endTest("FAIL");
goto Exit4;
}
if ( RC_BAD( rc = verifyKeyOrder( SUITE4_IX_NUM, ppComponents, 8)))
{
endTest("FAIL");
goto Exit4;
}
// Make sure the new index doesn't break the queries
if ( RC_BAD( rc = runQueries( SUITE4_IX_NUM)))
{
endTest("FAIL");
goto Exit4;
}
}
endTest("PASS");
Exit4:
beginTest(
"Key Sort Test (primary key: descending/case-sensitive; "
"secondary key: ascending)",
"Setup DIB for the truncated key tests",
"Self-explanatory",
"");
{
// Array of key components in sorted order
KEY_COMP_INFO ppComponents[][2] =
{
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}, // missing component
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"ijkl", XFLM_TEXT_TYPE, 4},
{(void*)NULL, XFLM_NUMBER_TYPE, 0},
},
{
{(void*)"ijkl", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)NULL, XFLM_NUMBER_TYPE, 0},
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"ABCD", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}, // missing component
},
{
{(void*)NULL, XFLM_TEXT_TYPE, 0}, // missing component
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
};
if ( RC_BAD( rc = createOrModifyIndex(
SUITE4_IX_NUM,
TRUE, // Comp #1 sort descending
TRUE, // Comp #1 case-sensitive
FALSE, // Comp #1 sort missing high
FALSE, // Comp #2 sort descending
FALSE))) // Comp #2 sort missing high
{
endTest("FAIL");
goto Exit5;
}
if ( RC_BAD( rc = verifyKeyOrder( SUITE4_IX_NUM, ppComponents, 8)))
{
endTest("FAIL");
goto Exit5;
}
// Make sure the new index doesn't break the queries
if ( RC_BAD( rc = runQueries( SUITE4_IX_NUM)))
{
endTest("FAIL");
goto Exit5;
}
}
endTest("PASS");
Exit5:
beginTest(
"Key Sort Test (primary key: descending/case-sensitive; "
"secondary key: ascending/missing high)",
"Setup DIB for the truncated key tests",
"Self-explanatory",
"");
{
// Array of key components in sorted order
KEY_COMP_INFO ppComponents[][2] =
{
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}, // missing component
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"ijkl", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"ijkl", XFLM_TEXT_TYPE, 4},
{(void*)0, XFLM_NUMBER_TYPE, 0},
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)0, XFLM_NUMBER_TYPE, 0},
},
{
{(void*)"ABCD", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}, // missing component
},
{
{(void*)NULL, XFLM_TEXT_TYPE, 0}, // missing component
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
};
if ( RC_BAD( rc = createOrModifyIndex(
SUITE4_IX_NUM,
TRUE, // Comp #1 sort descending
TRUE, // Comp #1 case-sensitive
FALSE, // Comp #1 sort missing high
FALSE, // Comp #2 sort descending
TRUE))) // Comp #2 sort missing high
{
endTest("FAIL");
goto Exit6;
}
if ( RC_BAD( rc = verifyKeyOrder( SUITE4_IX_NUM, ppComponents, 8)))
{
endTest("FAIL");
goto Exit6;
}
// Make sure the new index doesn't break the queries
if ( RC_BAD( rc = runQueries( SUITE4_IX_NUM)))
{
endTest("FAIL");
goto Exit6;
}
}
endTest("PASS");
Exit6:
// Case-insensitive index tests
beginTest(
"Key Sort Test (primary key: descending/case-insensitive/missing high; "
"secondary key: descending/missing high)",
"Setup DIB for the truncated key tests",
"Self-explanatory",
"");
{
// Array of key components in sorted order
KEY_COMP_INFO ppComponents[][2] =
{
{
{(void*)NULL, XFLM_TEXT_TYPE, 0}, // missing component
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)NULL, XFLM_NUMBER_TYPE, 0}, // missing component
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)0, XFLM_NUMBER_TYPE, 0}, // missing component
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"ABCD", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
};
if ( RC_BAD( rc = createOrModifyIndex(
SUITE4_IX_NUM,
TRUE, // Comp #1 sort descending
FALSE, // Comp #1 case-sensitive
TRUE, // Comp #1 sort missing high
TRUE, // Comp #2 sort descending
TRUE))) // Comp #2 sort missing high
{
endTest("FAIL");
goto Exit7;
}
if ( RC_BAD( rc = verifyKeyOrder( SUITE4_IX_NUM, ppComponents, 7)))
{
endTest("FAIL");
goto Exit7;
}
// Make sure the new index doesn't break the queries
if ( RC_BAD( rc = runQueries( SUITE4_IX_NUM)))
{
endTest("FAIL");
goto Exit7;
}
}
endTest("PASS");
Exit7:
beginTest(
"Key Sort Test (primary key: descending/case-insensitive; "
"secondary key: descending)",
"Setup DIB for the truncated key tests",
"Self-explanatory",
"");
{
// Array of key components in sorted order
KEY_COMP_INFO ppComponents[][2] =
{
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)0, XFLM_NUMBER_TYPE, 0}, // missing component
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)0, XFLM_NUMBER_TYPE, 0}, // missing component
},
{
{(void*)"ABCD", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)NULL, XFLM_TEXT_TYPE, 0}, // missing component
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
};
if ( RC_BAD( rc = createOrModifyIndex(
SUITE4_IX_NUM,
TRUE, // Comp #1 sort descending
FALSE, // Comp #1 case-sensitive
FALSE, // Comp #1 sort missing high
TRUE, // Comp #2 sort descending
FALSE))) // Comp #2 sort missing high
{
endTest("FAIL");
goto Exit8;
}
if ( RC_BAD( rc = verifyKeyOrder( SUITE4_IX_NUM, ppComponents, 7)))
{
endTest("FAIL");
goto Exit8;
}
// Make sure the new index doesn't break the queries
if ( RC_BAD( rc = runQueries( SUITE4_IX_NUM)))
{
endTest("FAIL");
goto Exit8;
}
}
endTest("PASS");
Exit8:
beginTest(
"Key Sort Test (primary key: ascending/case-insensitive; "
"secondary key: descending)",
"Setup DIB for the truncated key tests",
"Self-explanatory",
"");
{
// Array of key components in sorted order
KEY_COMP_INFO ppComponents[][2] =
{
{
{(void*)NULL, XFLM_TEXT_TYPE, 0}, // missing component
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"ABCD", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)NULL, XFLM_NUMBER_TYPE, 0}, // missing component
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)NULL, XFLM_NUMBER_TYPE, 0}, // missing component
},
};
if ( RC_BAD( rc = createOrModifyIndex(
SUITE4_IX_NUM,
FALSE, // Comp #1 sort descending
FALSE, // Comp #1 case-sensitive
FALSE, // Comp #1 sort missing high
TRUE, // Comp #2 sort descending
FALSE))) // Comp #2 sort missing high
{
endTest("FAIL");
goto Exit9;
}
if ( RC_BAD( rc = verifyKeyOrder( SUITE4_IX_NUM, ppComponents, 7)))
{
endTest("FAIL");
goto Exit9;
}
// Make sure the new index doesn't break the queries
if ( RC_BAD( rc = runQueries( SUITE4_IX_NUM)))
{
endTest("FAIL");
goto Exit9;
}
}
endTest("PASS");
Exit9:
beginTest(
"Key Sort Test (primary key: ascending/case-insensitive; "
"secondary key: descending/missing high)",
"Setup DIB for the truncated key tests",
"Self-explanatory",
"");
{
// Array of key components in sorted order
KEY_COMP_INFO ppComponents[][2] =
{
{
{(void*)NULL, XFLM_TEXT_TYPE, 0}, // missing component
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"ABCD", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)NULL, XFLM_NUMBER_TYPE, 0}, // missing component
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)NULL, XFLM_NUMBER_TYPE, 0}, // missing component
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
};
if ( RC_BAD( rc = createOrModifyIndex(
SUITE4_IX_NUM,
FALSE, // Comp #1 sort descending
FALSE, // Comp #1 case-sensitive
FALSE, // Comp #1 sort missing high
TRUE, // Comp #2 sort descending
TRUE))) // Comp #2 sort missing high
{
endTest("FAIL");
goto Exit10;
}
if ( RC_BAD( rc = verifyKeyOrder( SUITE4_IX_NUM, ppComponents, 7)))
{
endTest("FAIL");
goto Exit10;
}
// Make sure the new index doesn't break the queries
if ( RC_BAD( rc = runQueries( SUITE4_IX_NUM)))
{
endTest("FAIL");
goto Exit10;
}
}
endTest("PASS");
Exit10:
beginTest(
"Key Sort Test (primary key: descending/case-insensitive; "
"secondary key: ascending)",
"Setup DIB for the truncated key tests",
"Self-explanatory",
"");
{
// Array of key components in sorted order
KEY_COMP_INFO ppComponents[][2] =
{
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)NULL, XFLM_NUMBER_TYPE, 0},
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}, // missing component
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)NULL, XFLM_NUMBER_TYPE, 0},
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"ABCD", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}, // missing component
},
{
{(void*)NULL, XFLM_TEXT_TYPE, 0}, // missing component
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
};
if ( RC_BAD( rc = createOrModifyIndex(
SUITE4_IX_NUM,
TRUE, // Comp #1 sort descending
FALSE, // Comp #1 case-sensitive
FALSE, // Comp #1 sort missing high
FALSE, // Comp #2 sort descending
FALSE))) // Comp #2 sort missing high
{
endTest("FAIL");
goto Exit11;
}
if ( RC_BAD( rc = verifyKeyOrder( SUITE4_IX_NUM, ppComponents, 7)))
{
endTest("FAIL");
goto Exit11;
}
// Make sure the new index doesn't break the queries
if ( RC_BAD( rc = runQueries( SUITE4_IX_NUM)))
{
endTest("FAIL");
goto Exit11;
}
}
endTest("PASS");
Exit11:
beginTest(
"Key Sort Test (primary key: descending/case-insensitive; "
"secondary key: ascending/missing high)",
"Setup DIB for the truncated key tests",
"Self-explanatory",
"");
{
// Array of key components in sorted order
KEY_COMP_INFO ppComponents[][2] =
{
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}, // missing component
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"IJKL", XFLM_TEXT_TYPE, 4},
{(void*)0, XFLM_NUMBER_TYPE, 0},
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)456, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
{
{(void*)"EFGH", XFLM_TEXT_TYPE, 4},
{(void*)0, XFLM_NUMBER_TYPE, 0},
},
{
{(void*)"ABCD", XFLM_TEXT_TYPE, 4},
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)}, // missing component
},
{
{(void*)NULL, XFLM_TEXT_TYPE, 0}, // missing component
{(void*)123, XFLM_NUMBER_TYPE, sizeof(FLMUINT)},
},
};
if ( RC_BAD( rc = createOrModifyIndex(
SUITE4_IX_NUM,
TRUE, // Comp #1 sort descending
FALSE, // Comp #1 case-sensitive
FALSE, // Comp #1 sort missing high
FALSE, // Comp #2 sort descending
TRUE))) // Comp #2 sort missing high
{
endTest("FAIL");
goto Exit12;
}
if ( RC_BAD( rc = verifyKeyOrder( SUITE4_IX_NUM, ppComponents, 7)))
{
endTest("FAIL");
goto Exit12;
}
// Make sure the new index doesn't break the queries
if ( RC_BAD( rc = runQueries( SUITE4_IX_NUM)))
{
endTest("FAIL");
goto Exit12;
}
}
endTest("PASS");
Exit12:
goto Exit;
Fatal_Error:
// We had an error setting up the database so we had to bail out early
endTest("FAIL");
Exit:
if ( bTransBegun)
{
if ( RC_OK( rc))
{
rc = m_pDb->transCommit();
}
else
{
m_pDb->transAbort();
}
}
shutdownTestState( DB_NAME_STR, bDibCreated);
return rc;
}
/****************************************************************************
Desc:
****************************************************************************/
RCODE IndexTest3Impl::runSuite5( void)
{
RCODE rc = NE_XFLM_OK;
FLMBOOL bDibCreated = FALSE;
FLMBOOL bTransActive = FALSE;
IF_DataVector * pSearchKey = NULL;
const char * pszIndexDef =
" "
" "
" "
" "
" ";
const char * pszObject =
""
" "
" "
"";
beginTest(
"Test indexDocument context changes",
"Create a document and then an index that should include that document.",
"Self-Explanatory",
"");
if ( RC_BAD( rc = initCleanTestState( DB_NAME_STR)))
{
MAKE_FLM_ERROR_STRING( "Failed to init test state.", m_szDetails, rc);
goto Exit;
}
bDibCreated = TRUE;
if ( RC_BAD( rc = m_pDb->transBegin(XFLM_UPDATE_TRANS, XFLM_NO_TIMEOUT)))
{
MAKE_FLM_ERROR_STRING( "transBegin failed.", m_szDetails, rc);
goto Exit;
}
bTransActive = TRUE;
if ( RC_BAD( rc = importDocument( pszObject, XFLM_DATA_COLLECTION)))
{
MAKE_FLM_ERROR_STRING( "importDocument failed.", m_szDetails, rc);
goto Exit;
}
if ( RC_BAD( rc = importDocument( pszIndexDef, XFLM_DICT_COLLECTION)))
{
MAKE_FLM_ERROR_STRING( "importDocument failed.", m_szDetails, rc);
goto Exit;
}
if ( RC_BAD( rc = m_pDb->transCommit()))
{
MAKE_FLM_ERROR_STRING( "transCommit failed.", m_szDetails, rc);
goto Exit;
}
bTransActive = FALSE;
if( RC_BAD( rc = m_pDb->keyRetrieve(
1, NULL, XFLM_FIRST | XFLM_MATCH_DOC_ID, pSearchKey)))
{
MAKE_FLM_ERROR_STRING( "keyRetrieve failed", m_szDetails, rc);
goto Exit;
}
endTest("PASS");
Exit:
if ( RC_BAD( rc ))
{
endTest("FAIL");
}
if ( bTransActive)
{
if ( RC_OK(rc))
{
m_pDb->transCommit();
}
else
{
m_pDb->transAbort();
}
}
if (pSearchKey)
{
pSearchKey->Release();
}
shutdownTestState( DB_NAME_STR, bDibCreated);
return rc;
}