Запрос Object Script без использования %OpenId

Как мне написать этот запрос в объектном скрипте, а не в SQL?

Query GetSessionIdByUserName(UserName As %String) As %SQLQuery [ Private ]
{
    SELECT %ID from Sample.Session
    WHERE UserName = :UserName
}

Все, что я пока нашел в документации, это %OpenId.

##class(Sample.Session).%OpenId(id)  

Что происходит, когда идентификатор неизвестен и его нужно сначала найти?


person O.O    schedule 15.10.2012    source источник


Ответы (2)


Нет встроенных методов для получения идентификатора сеанса по имени пользователя. Вам нужно написать их самостоятельно, и SQL, вероятно, обычно лучший способ сделать это. Однако вы можете обернуть SQL в метод, а не в запрос.

Method GetSessionIdByUserName(UserName As %String) As Sample.Session [ Private ]

{
    &SQL(SELECT %ID INTO :ID from Sample.Session
    WHERE UserName = :UserName)

    Q ##class(Sample.Session).%OpenId(ID)
}
person psr    schedule 15.10.2012

Если вы настаиваете на том, чтобы не использовать SQL, вам нужно будет сделать что-то вроде:

Method GetSEssionIdByUserName(UserName as %String) As Sample.Session [ Private ]
{
   s c=$O(^Sample.SessionD("")),f=""
   while ((f="") && (c'="")){
       s p=##class(Sample.Session).%OpenId(c)
       if $isobject(p){
            s:p.UserName=UserName f=c
       }
       //alternatively if you're sure about the global structure, something like this:
       //assume the Username is stored at position 3 for a sec:
       //s:$LG(^Sample.SessionD(c),3)=UserName f=c

       s c=$O(^Sample.SessionD(c))
   }
   q ##class(Sample.Session).%OpenId(f)
}

Вы можете сделать его еще умнее и открыть объект сеанса только один раз, но в будущем я бы не советовал идти по этому пути. Это может выглядеть причудливо, но через два года вы не будете знать, что делали. Поэтому я бы предложил использовать встроенный sql psr, он гораздо более читабелен (и удобен в сопровождении).

person kazamatzuri    schedule 16.10.2012
comment
+1 - хороший пример. Я согласен, это просто не собирается резать горчицу. - person O.O; 16.10.2012
comment
В качестве альтернативы, если вы знаете, что имя пользователя должно быть уникальным для всех записей сеанса, вы всегда можете добавить уникальный индекс в свой класс: Index UserNameIndex on UserName [ Unique ]; И тогда приведенному выше методу требуется всего одна или две строки кода, чтобы проверить, существует ли имя в индексе. . Если это так, вы возвращаете его значение идентификатора. Если это не так, вы возвращаете null, что означает, что имя пользователя не существует. - person Derek; 16.10.2012