2016-04-16 3 views
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 - с индексным доступом к загрузке.

Действительно ли это законно?

ответ

2

Да $bit может использоваться как функция слева в команде SET, и в этом случае любая юридическая переменная также является законной. И если эта переменная не определена, она получит новое значение. Также как $bit также доступны $piece и $extract, вы можете увидеть его в documentation

+0

И $ listbuild() тоже, правильно? Но вот что вернет $ data (tBits)? Ложь? – fge

+0

yes $ listbuild и $ listitem тоже. $ data возвращает только одно из этих значений: 0,1,10,11. Итак, после этой команды 'set $ bit (tBits (tChunk), tPos) = 1',' $ data (tBits) 'должно быть или 10 или 11. – DAiMor

Смежные вопросы