1
Код извлекается из this project:
Method RefineSearch(pNewCriteria As %String) As %Status [ ZenMethod ]
{
set tSC = $$$OK
try {
set ..criteria = ..criteria _$s(..criteria="":"",1:",")_pNewCriteria
set tType = $piece(pNewCriteria,":",1)
if tType="prop" {
set tSQL = "SELECT ID FROM "_..tableName_" WHERE "_$piece(pNewCriteria,":",2)_" = '"_$piece(pNewCriteria,":",3)_"' AND %ID %FIND Demo_SearchPortal.Find("_..qid_")"
set tResult = ##class(%SQL.Statement).%ExecDirect(,tSQL)
while tResult.%Next() {
set tID = tResult.%GetData(1)
$$$IFBITOFFPOS(tID,tChunk,tPos)
set $bit(tBits(tChunk),tPos)=1 // <-- HERE
}
// compress bitmaps
set tMaxChunk=$order(tBits(""),-1)
for tChunk = 1:1:tMaxChunk {
set tBits(tChunk) = $bitlogic(tBits(tChunk))
}
} else {
set tFinder = $classmethod(..className, ..indexName_"Embedded")
if (tType = "entity") {
do tFinder.PrepareFind("{"_$piece(pNewCriteria,":",2)_"}", ..searchMode)
} elseif (tType = "word") {
do tFinder.PrepareFind($piece(pNewCriteria,":",2), ..searchMode)
}
merge tOldBits = ^CacheTemp.IF.SearchPortal.Query(..qid,"b")
set tChunk=""
for {
set tBits = tFinder.NextChunk(.tChunk)
quit:tChunk=""
set tBits(tChunk)=$bitlogic(tBits & tOldBits(tChunk))
}
}
set tNewQID = $i(^CacheTemp.IF.SearchPortal.Query)
merge ^CacheTemp.IF.SearchPortal.Query(tNewQID,"b") = tBits
set ^CacheTemp.IF.SearchPortal.Query(tNewQID, "parent") = ..qid
set ..qid = tNewQID
} catch (ex) {
set tSC = ex.AsStatus()
}
quit tSC
}
На месте отмечен <-- HERE
, это первое появление tBits
- с индексным доступом к загрузке.
Действительно ли это законно?
И $ listbuild() тоже, правильно? Но вот что вернет $ data (tBits)? Ложь? – fge
yes $ listbuild и $ listitem тоже. $ data возвращает только одно из этих значений: 0,1,10,11. Итак, после этой команды 'set $ bit (tBits (tChunk), tPos) = 1',' $ data (tBits) 'должно быть или 10 или 11. – DAiMor