2016-04-16 8 views
1

-Code aus this project extrahierte:

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 
} 

An der Stelle <-- HERE markiert, ist dies das erste Auftreten von tBits - mit einem indizierte Zugang zu Boot.

Ist das wirklich legal?

Antwort

2

Ja $bit kann als linke Funktion in SET Befehl verwendet werden, und in diesem Fall jede rechtliche Variable, legal. Und wenn diese Variable nicht definiert ist, wird sie einen neuen Wert erhalten. Sowie $bit auch verfügbar $piece und $extract, können Sie es in documentation

+0

Und $ listbuild() zu sehen, oder? Aber was werden $ Daten (tBits) zurückgeben? Falsch? – fge

+0

ja $ listbuild und $ listitem auch. $ data gibt nur einen dieser Werte zurück: 0,1,10,11. Nach diesem Befehl 'set $ bit (tBits (tChunk), tPos) = 1' sollte '$ data (tBits)' 10 oder 11 sein. – DAiMor

Verwandte Themen