Может ли $bit() создавать переменные здесь?
Код извлечен из этого проекта:
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
- с подписным доступом к загрузке.
Это действительно законно?
1 ответ
Решение
Да $bit
может использоваться как функция левой стороны в SET
команда, и в этом случае любая легальная переменная, а также юридическая. И если эта переменная была неопределенной, получит новое значение. Так же как $bit
так же доступно $piece
а также $extract
, вы можете увидеть это в документации