Il fallait mettre l'identifiant du mot dans la requète
Voici le code optimisé qui marche
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
iSize = ListChunk.size();
pTemp = (wchar_t*)&wTemp;
bEndReached = false;
itListChunk = ListChunk.begin();
while( (itListChunk != ListChunk.end()) && ErrorCode == INIT_NO_ERROR && iSize > 0)
{ //1
// [Verifiy that the chunk already exist] =
// DO
// IF (Number of words of current chunk > MAX_JOIN) THEN
// [Return the error code "ERR_MAX_JOIN_REACHED"]
// FI
wssFromTableRequest.str(L"");
wssWhereTableRequest.str(L"");
wssWhereWordRequest.str(L"");
// shWordChunkRank:=0
shWordChunkRank = 0;
iSizeWord = (*itListChunk)->ListWord.size();
if (iSizeWord > MAX_JOIN)
{ //2
return( ERR_MAX_JOIN_REACHED);
}
// [Shape the WHERE request]=
// DO
shWordChunkRank = 0;
wssFromTableRequest.str(L"");
wssWhereTableRequest.str(L"");
wssWhereWordRequest.str(L"");
// WHILE (there is element in the list "ListWord" of current item "ListChunk") AND (there is no error)
itListWord = (*itListChunk)->ListWord.begin();
while( (itListWord != (*itListChunk)->ListWord.end()) && NO_ERROR_CODE )
{
// [Increment the rank of the word of the chunk "shWordChunkRank"]
shWordChunkRank++;
// wssWhereItemRequest :=(("nuIdWord" = "ullWordID" of current item of "ListWord" of current item "ListChunk") AND ("siWordRank"="shWordChunkRank"))
// exemple : (T1.nuIdWord = 1 AND T1.siWordRank = 1)
wssWhereWordItemRequest.str(L"");
wssWhereWordItemRequest << PB << L"T" << shWordChunkRank << DOT << CW_ID_WORD << EQ << (*itListWord)->ullWordID << AND <<
L"T" << shWordChunkRank << DOT << CW_WORD_RANK << EQ << shWordChunkRank << PE;
// IF (this the first word of "ListWord" of current item "ListChunk") THEN
if (shWordChunkRank == 1)
{
// exemple : T_CHUNK T0, T_CHUNK_WORD T1 (premier mot)
wssFromTableRequest << CHK_TABLE << BLANK << L"T" << (shWordChunkRank-1) << CO << BLANK << CW_TABLE << BLANK << L"T" << shWordChunkRank;
// exemple : (T0.nuIdChunkType = ChunkType) AND (T0.siNbWord = size of ListWord) AND (T0.siIdLang = language) AND (T0.nuIdChunk= T1.nuIdChunk) (premier mot)
wssWhereTableRequest << PB << L"T" << (shWordChunkRank-1) << DOT << CHK_ID_CHK_TYPE << EQ << (*itListChunk)->ChunkType << PE
<< AND
<< PB << L"T" << (shWordChunkRank-1) << DOT << CHK_NB_WORD << EQ << (*itListChunk)->ListWord.size() << PE
<< AND
<< PB << L"T" << (shWordChunkRank-1) << DOT << CHK_ID_LANG << EQ << Language << PE
<< AND
<< PB << L"T" << (shWordChunkRank-1) << DOT << CHK_ID_CHK << EQ << L"T" << shWordChunkRank << DOT<< CW_ID_CHUNK << PE;
}
// ELSE
else
{
// exemple : , T_CHUNK_WORD T2 (N mot suivant)
wssFromTableRequest << CO << BLANK << CW_TABLE << BLANK << L"T" << shWordChunkRank;
// exemple : AND (T1.nuIdChunk = T2.nuIdChunk) (N mot suivant)
wssWhereTableRequest <<AND << PB << L"T" << (shWordChunkRank-1) << DOT << CW_ID_CHUNK << EQ
<< L"T" << shWordChunkRank << DOT << CW_ID_CHUNK << PE;
// FI
}
// exemple : AND (T1.nuIdWord = 1 AND T1.siWordRank = 1) (N mot)
wssWhereWordRequest << AND << wssWhereWordItemRequest.str();
// [Go to the next item of the list "ListWord" of current item "ListChunk"]
itListWord++;
}
//
//************** exemple complet ******************************************************
// [SELECT
// T0.nuIdChunk
// FROM
// T_CHUNK T0, T_CHUNK_WORD T1 (premier mot)
// ,T_CHUNK_WORD T2 (N mot suivant), T_CHUNK_WORD T3 (N mot suivant)
// WHERE
// (T0.nuIdChunkType = ChunkType) AND (T0.siNbWord = size of ListWord) AND (T0.siIdLang = language) AND (T0.nuIdChunk= T1.nuIdChunk) (premier mot)
// AND (T1.nuIdChunk= T2.nuIdChunk) (N mot suivant)
// AND (T2.nuIdChunk= T3.nuIdChunk) (N mot suivant)
// AND(T1.nuIdWord = 1 AND T1.siWordRank = 1) (N mot)
// AND(T2.nuIdWord = 2 AND T2.siWordRank = 2) (N mot)
// AND(T3.nuIdWord = 3 AND T3.siWordRank = 3) (N mot)
// ;
//************************************************************************************
wssRequest.str(L"");
wssRequest << SELECT <<
L"T0" << DOT << CHK_ID_CHK <<
FROM <<
wssFromTableRequest.str() <<
WHERE <<
wssWhereTableRequest.str() <<
wssWhereWordRequest.str();
dwNbResultFound = 0;
bEndReached = false;
ErrorCode |= m_pDBMSManager->ExecuteSelectRequest(wssRequest.str(), &dwNbResultFound); |
Merci à tous :lol: