パート1
パート2
記事のタイトルにある「Living」という言葉は、これらの記事のメカニズム、コード、およびデータがワーキングドラフトで使用されていることを意味します。
データベースを開発するためのソリューション(構造、メカニズム)のいくつかに興味があるかもしれません。
この図は、ディレクトリのグローバルルールを説明するコードを示しています。
C R UDメソッドは、作業中に常にこれらのルールを参照して、実行する必要があるアクションを正確に見つけます。
以前、私たちは次のグローバルを持っているという事実に落ち着きました。
- ^辞書 - ディレクトリの要素とそのプロパティ。
- ^ NameDictionaryElement-さまざまな言語のディレクトリの要素の名前。
- ^ IndexDictionary-ディレクトリのメインインデックス 。
- ^ RefsDictionary-グローバルインデックスバックリンク(その目的は後で説明します)。
グローバルを表示
^Dictionary("Vehicle","TransmissionType",1,0,"UpdateTime")="62086,66625" ^Dictionary("Vehicle","TransmissionType",1,0,"uid")=888 ^Dictionary("Vehicle","TransmissionType",2,0,"UpdateTime")="62086,66625" ^Dictionary("Vehicle","TransmissionType",2,0,"uid")=888 ^NameDictionaryElement(1,"partUri",0)="akp" ^NameDictionaryElement(1,"partUri",0,"UpdateTime")="62086,66625" ^NameDictionaryElement(1,"ru",0)="" ^NameDictionaryElement(1,"ru",0,"UpdateTime")="62086,66625" ^NameDictionaryElement(2,"partUri",0)="meh" ^NameDictionaryElement(2,"partUri",0,"UpdateTime")="62086,66625" ^NameDictionaryElement(2,"ru",0)="" ^NameDictionaryElement(2,"ru",0,"UpdateTime")="62086,66625" ^IndexDictionary("Vehicle","TransmissionType","name","partUri","akp",1)=1 ^IndexDictionary("Vehicle","TransmissionType","name","partUri","meh",2)=1 ^IndexDictionary("Vehicle","TransmissionType","name","ru","",1)=1 ^IndexDictionary("Vehicle","TransmissionType","name","ru","",2)=1 ^IndexDictionary("Vehicle","TransmissionType","uid",888,1)=1 ^IndexDictionary("Vehicle","TransmissionType","uid",888,2)=1 ^RefsDictionary(1,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""partUri"",""akp"",1)")=1 ^RefsDictionary(1,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""ru"","""",1)")=1 ^RefsDictionary(1,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""uid"",888,1)")=1 ^RefsDictionary(2,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""partUri"",""meh"",2)")=1 ^RefsDictionary(2,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""ru"","""",2)")=1 ^RefsDictionary(2,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""uid"",888,2)")=1
グローバルの作成Ctrl + C / V
set ^Dictionary("Vehicle","TransmissionType",1,0,"UpdateTime")="62086,66625" set ^Dictionary("Vehicle","TransmissionType",1,0,"uid")=888 set ^Dictionary("Vehicle","TransmissionType",2,0,"UpdateTime")="62086,66625" set ^Dictionary("Vehicle","TransmissionType",2,0,"uid")=888 set ^NameDictionaryElement(1,"partUri",0)="akp" set ^NameDictionaryElement(1,"partUri",0,"UpdateTime")="62086,66625" set ^NameDictionaryElement(1,"ru",0)="" set ^NameDictionaryElement(1,"ru",0,"UpdateTime")="62086,66625" set ^NameDictionaryElement(2,"partUri",0)="meh" set ^NameDictionaryElement(2,"partUri",0,"UpdateTime")="62086,66625" set ^NameDictionaryElement(2,"ru",0)="" set ^NameDictionaryElement(2,"ru",0,"UpdateTime")="62086,66625" set ^IndexDictionary("Vehicle","TransmissionType","name","partUri","akp",1)=1 set ^IndexDictionary("Vehicle","TransmissionType","name","partUri","meh",2)=1 set ^IndexDictionary("Vehicle","TransmissionType","name","ru","",1)=1 set ^IndexDictionary("Vehicle","TransmissionType","name","ru","",2)=1 set ^IndexDictionary("Vehicle","TransmissionType","uid",888,1)=1 set ^IndexDictionary("Vehicle","TransmissionType","uid",888,2)=1 set ^RefsDictionary(1,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""partUri"",""akp"",1)")=1 set ^RefsDictionary(1,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""ru"","""",1)")=1 set ^RefsDictionary(1,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""uid"",888,1)")=1 set ^RefsDictionary(2,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""partUri"",""meh"",2)")=1 set ^RefsDictionary(2,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""ru"","""",2)")=1 set ^RefsDictionary(2,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""uid"",888,2)")=1
グローバルディレクトリルール
すべてのオントロジーとディレクトリのタイプの説明は、このグローバルに保存されます。 特定のプロパティ、特性、さまざまなタイプのインデックスが示されています。 データ検証関数の呼び出しが登録されます。 入れ子構造の階層が構築されます。 徐々に話をし、例を挙げて説明します。 時間が経つにつれて、グローバルルールが大きくなります。 プロジェクトの存続中にも同じことが起こります。新しいタイプのディレクトリが表示されます。 新しいプロパティが追加されました。 サービスデータ処理機能は変化しています。 新しい機能がプログラムされています。 このグローバルの主な目的は、 参照データの処理のすべての詳細を保存することです。
^ RuleDictionaryルールグローバルの構造を考えてみましょう-インデックスの意味は次のとおりです。
- オントロジー
- ディレクトリのタイプ
- CRUDメソッドの1つの名前
- 実行されているアクションのタイプの表示
- アクションのシーケンス
3番目から始まるルールのグローバルインデックスは、他の場合には何か他のものを意味する可能性があるという事実に注意を促します(例としてこれに出くわした場合、詳細に説明します)。
オントロジーのすべてのルールを出力しますSimpleOntology、コマンドを実行します:
zwrite ^ RuleDictionary( "SimpleOntology")
「MONTOLOGY」は名前空間の名前であることを思い出してください。
MONTOLOGY>zwrite ^RuleDictionary("SimpleOntology") ^RuleDictionary("SimpleOntology","SimpleType","create","check",10)="do clearPunctuationAndControlCharAllLang()" ^RuleDictionary("SimpleOntology","SimpleType","create","check",20)="do checkUniqueNameElementAllLang()" ^RuleDictionary("SimpleOntology","SimpleType","update","check",10)="do clearPunctuationAndControlCharAllLang()" ^RuleDictionary("SimpleOntology","SimpleType","update","check",20)="do checkUniqueNameElementAllLang()" MONTOLOGY>
グローバルの作成Ctrl + C / V
set ^RuleDictionary("SimpleOntology","SimpleType","create","check",10)="do clearPunctuationAndControlCharAllLang()" set ^RuleDictionary("SimpleOntology","SimpleType","create","check",20)="do checkUniqueNameElementAllLang()" set ^RuleDictionary("SimpleOntology","SimpleType","update","check",10)="do clearPunctuationAndControlCharAllLang()" set ^RuleDictionary("SimpleOntology","SimpleType","update","check",20)="do checkUniqueNameElementAllLang()"
私たちが推論したことを詳しく見てみましょう。 ご覧のとおり、 SimpleOntologyオントロジーには、1つのタイプのSimpleType参照があります。 このディレクトリには追加のパラメーターはありません(デフォルトのプロパティを除く)。 createメソッドには、2つの前処理機能とデータ検証機能が定義されています 。 更新メソッドにも同じ機能が定義されています。 それらはグローバル値に保存されます。 アクションのシーケンス(10、20)は、必ずしも整数である必要はありません。 実行の順序は小さいものから大きいものへと進みます。 SimpleOntologyおよびSimpleTypeのルールは、デフォルトですべての単純なディレクトリに使用され、標準のプロパティのみが存在します:名前、更新日、およびユーザーuid 。
作成する
これがどのように機能するかを理解するには、 createメソッドを検討してください 。 簡単にするために、ロック、トランザクション処理、およびさまざまなタイプのエラーを減らします。 その後、これに戻ります。
#; -------------------------------------------------------------------------------------------------- #; . #; . #; -------------------------------------------------------------------------------------------------- create() #; kill map("out") #; t #; create new t #; set t("err")=$$check("create") #; , if t("err")<0 { quit t("err") } #; "UpdateTime" do setProperty(t("ontology"),t("type"),"UpdateTime",$horolog,t("id"),"false") #; "uid" do setProperty(t("ontology"),t("type"),"uid",t("uid"),t("id"),"true") set t("lang")="" for { #; ( ) set t("lang")=$order(t("nameList",t("lang"))) #; , quit:t("lang")="" #; set t("name")=$get(t("nameList",t("lang"))) #; do setName(t("ontology"),t("type"),t("lang"),t("name"),t("id")) } #; do saveOntoAndTypeID #; do saveElementPath #; set map("out","id")=t("id") #; kill map("in") #; quit t("id") #; --------------------------------------------------------------------------------------------------
create()メソッドにパラメーターが明示的に渡されないことがわかります。 メソッドが呼び出される前に定義する必要があるローカル変数mapに書き込まれることを前提としています。 map変数では、 map( "in")とmap( "out")の 2つのメインブランチを使用します。 ローカル変数は、ディスクに保存されず、最大サイズに制限があるという点でのみグローバル変数と異なります。 それ以外の場合、グローバルと同じインデックスが付けられます。 関数にパラメーターとして渡すことができます: $ order() 、 $ qsubscript() 、 $ qlength() 、 $ name()など。 多くの変数を生成せず、スコープを監視しないためには、単一の変数new tを宣言するだけで十分です。 変数tは、 createメソッド内のどこからでも、また、そこから呼び出される他のすべてのプログラムとルーチン内でも使用できます。 マップ変数についても同じことが言えます。 create中に呼び出された関数内でnew tが検出された場合、この関数はcreateメソッド内で宣言された変数tにアクセスできません。 スコープ内(変数スタックのどこか)にある変数tで動作します。 おそらく、私が説明したCachéの変数の範囲の原理は十分に明確ではありません。コメントで質問してください。
確認する
次に、 t(「err」)に、関数$$ check(「create」)の結果を書き込みます 。 すべてのチェックが成功した場合、関数は0を返します 。それ以外の場合、結果は負になります。 $$ check()関数がどのように機能し、そこから呼び出されるメソッドを見てみましょう。 これらの記事では、 メソッド、関数、サブルーチン-単語は同義語であることに注意してください。 サービスワードprivate-メソッドは、 Dictionaryプログラム内でのみ呼び出すことができることを意味します。
#; -------------------------------------------------------------------------------------------------- #; . #; ^RuleDictionary . #; -------------------------------------------------------------------------------------------------- check(action)private #; check new check #; action set check=$case(action,"create":$$checkCreate(),"update":$$checkUpdate(),"delete":$$checkDelete(),:-1) #; quit:check<0 check #; "uid" set t("uid")=$get(map("in","uid"),888) #; , "check", if $data(^RuleDictionary(t("ontology"),t("type"),action,"check")) { #; t("map") set t("map")=$name(^RuleDictionary(t("ontology"),t("type"),action,"check")) } else { #; t("map") set t("map")=$name(^RuleDictionary("SimpleOntology","SimpleType",action,"check")) } set check("i")="" for { #; set check("i")=$order(@t("map")@(check("i"))) #; , quit:check("i")="" #; xecute $get(@t("map")@(check("i"))) #; , quit:check<0 } #; quit check #; -------------------------------------------------------------------------------------------------- #; . #; id, ontology, type, . #; -------------------------------------------------------------------------------------------------- checkCreate()private #; st("ontology")=$get(map("in","ontology"),"") #; quit:t("ontology")="" -1 #; set t("type")=$get(map("in","type"),"") #; , quit:t("type")="" -1 #; set t("check")=$$checkNames() #; , quit:t("check")<0 t("check") #; set t("id")=$increment(^Dictionary("MaxID")) #; ^Dictionary set t("path")=$name(^Dictionary(t("ontology"),t("type"),t("id"))) #; quit 0 #; -------------------------------------------------------------------------------------------------- checkUpdate() quit 0 #; -------------------------------------------------------------------------------------------------- checkDelete() quit 0 #; -------------------------------------------------------------------------------------------------- #; . #; -------------------------------------------------------------------------------------------------- checkNames()private #; merge t("nameList")=map("in","nameList") #; t("check") #; set t("check")=-1 set t("lang")="" for { #; set t("lang")=$order(t("nameList",t("lang"))) #; , quit:t("lang")="" #; set t("name")=$get(t("nameList",t("lang")),"") #; if t("name")="" { #; t("check") set t("check")=-1 #; quit } else { #; t("check") , set t("check")=0 } } #; quit t("check") #; --------------------------------------------------------------------------------------------------
check()メソッドの最初に、現在のアクションに必要なチェック機能を実行します。 私たちの場合、これはcheckCreate()関数です。 checkUpdate()およびcheckDelete()関数のスタブはコード内にも存在することに注意してください-これは、 Dictionaryプログラムを自分でコピーしてコンパイルする場合に必要です。
checkCreate()ルーチンは、オントロジーパラメーターの存在と入力マップ内のディレクトリタイプをチェックします。 内部checkNames() -各言語の名前の存在がチェックされ、少なくとも1つの言語が存在するための前提条件があります(システムでは、名前なしでディレクトリ要素を作成することはできません)。 同じ方法で、作成されたディレクトリ要素の識別子は、安全な関数$ increment()によって生成されます 。 ディレクトリ要素の現在の最大識別子(オントロジーとタイプの場合)は^ Dictionary( "MaxID")に保存されます。
すべての識別子は、異なるディレクトリやオントロジー内でも一意ですcheckCreate()メソッドの最後で、 t( "パス")変数に、作成されたディレクトリ要素が格納されるグローバルブランチ^ Dictionaryの正規名を書き込みます。
checkNames()メソッドの用語merge t( "nameList")= map( "in"、 "nameList")に注意してください。
mergeコマンドは、ローカルまたはグローバルとして定義されているかどうかにかかわらず、インデックス付き変数のサブツリー全体を相互にコピーします。本から取られた定義: Wolfgang Kirsten。 マイケル・アイリンジャー。 マティアス・クネ。 ベルンハルト・ルーリグ。 ポストリレーショナルDBMSCaché5.オブジェクト指向のアプリケーション開発。 第二版。 モスクワ 出版社BINOM 。 2005. A.マスロフ、K。アリストフによる翻訳。 116ページ
したがって、 checkCreate()メソッドを実行すると、次の重要なデータがローカル変数tに含まれます。
- t(「オントロジー」) -ディレクトリ要素のオントロジー
- t( "type") -参照タイプ
- t( "nameList") -指定されたすべての言語の名前
- t( "id") -識別子
- t( "パス") -グローバルブランチの標準名^辞書 、要素に関する情報が保存される場所
check()関数を実行し続けます。 checkCreate()が実行された後、ユーザーuid ( 888-デフォルト)を取得します。 次に、変数t( "map")に、ディレクトリやアクションなどのオントロジーに必要な検証関数を含むグローバルルールのブランチの正規名を書き込みます。 現在、オントロジーとデフォルトタイプのルールのみが^ RuleDictionary globalで定義されているため、 ^ RuleDictionaryブランチの標準ビュー( "SimpleOntology"、 "SimpleType"、 "create"、 "check"はt( "map")に記述されます。 )
行を詳細に分析してみましょう。
set check("i")=$order(@t("map")@(check("i")))
@は間接演算子であることを思い出させてください。 初期値はcheck( "i") = ""です。 したがって、ループの開始時には、この行は次の行と同等です。
set check("i")=$order(^RuleDictionary("SimpleOntology","SimpleType","create","check",""))
つまり、 チェック(「i」)は10になります。 間接演算子の構文で疑問が生じる場合は、コメントで質問します。
次に見てみましょう:
xecute $get(@t("map")@(check("i")))
xecuteコマンドは 、文字列を単一行のサブルーチンとして実行します。ページ115、 同じ本。
つまり、ループの最初に^ RuleDictionary( "SimpleOntology"、 "SimpleType"、 "create"、 "check"、10)で記述されていることを行います 。 そしてこれ:
do clearPunctuationAndControlCharAllLang()
このサブルーチンを実行すると、指定されたすべての言語の名前から句読点と補助文字がスローされます。
ループの次の反復では、値^ RuleDictionary( "SimpleOntology"、 "SimpleType"、 "create"、 "check"、20)を実行します。 そしてこれ:
do checkUniqueNameElementAllLang()
このルーチンは、指定されたすべての言語の名前の一意性を検証します。 少なくとも1つの名前が一意でない場合、 check()メソッドで定義されたチェック変数にエラーが書き込まれます。
サブルーチンコード:
#; -------------------------------------------------------------------------------------------------- clearPunctuationAndControlCharAllLang() set t("lang")="" for { #; set t("lang")=$order(t("nameList",t("lang"))) quit:t("lang")="" #; set t("nameList",t("lang"))=$$clearPunctuationAndControlChar($get(t("nameList",t("lang")),"")) } quit #; -------------------------------------------------------------------------------------------------- checkUniqueNameElementAllLang() set t("lang")="" for { #; set t("lang")=$order(t("nameList",t("lang"))) quit:t("lang")="" #; set t("name")=$get(t("nameList",t("lang")),"") #; check (0 - ) set check=$$checkUniqueNameElement() #; - quit:check<0 } quit #; -------------------------------------------------------------------------------------------------- #; . #; -------------------------------------------------------------------------------------------------- clearPunctuationAndControlChar(str) new t #; t("str") set t("str")="" #; for t("i")=1:1:$length(str) { #; set t("ch")=$extract(str,t("i")) if '((t("ch")?1P)||(t("ch")?1C)) { #; set t("str")=t("str")_t("ch") } } #; quit t("str") #; -------------------------------------------------------------------------------------------------- #; -------------------------------------------------------------------------------------------------- #; , , . #; , . #; -------------------------------------------------------------------------------------------------- checkUniqueNameElement() #; set t("q")=0 set t("uniqueId")="" for { #; , #; , , ( ) set t("uniqueId")=$order(^IndexDictionary(t("ontology"),t("type"),"name",t("lang"),$zconvert(t("name"),"l"),t("uniqueId"))) #; quit:t("uniqueId")="" #; , #; update if (t("uniqueId")'=t("id")) { #; , set t("q")=-1 quit } } #; quit t("q") #; --------------------------------------------------------------------------------------------------
ルーチンは新しい関数を使用します: $ zconvert() 、 $ length() 、 $ extract() ; テンプレートチェック演算子と同様に、記号「?」 。 文字列内の句読点とサービス文字の存在の確認は、組み込みのKashev関数を使用して別の方法で実行できますが、私のプロジェクトでは文字ごとの分析の方法を使用しています。
したがって、 create()メソッドは次の行を正常に完了しました: set t( "err")= $$ check( "create") 、およびt変数には重要なサービス情報が含まれています。
setProperty
次に、 setProperty()関数を使用して、 「UpdateTime」および「uid」プロパティを設定します。
#; -------------------------------------------------------------------------------------------------- #; , . #; . #; -------------------------------------------------------------------------------------------------- setProperty(ontology,type,property,value,id,index="true")private #; () set ^Dictionary(ontology,type,id,0,property)=value #; if index="true" { #; set ^IndexDictionary(ontology,type,property,value,id)=1 #; set ^RefsDictionary(id,$name(^|"MONTOLOGY"|IndexDictionary(ontology,type,property,value,id)))=1 } quit 0 #; --------------------------------------------------------------------------------------------------
$ horologは、Caché形式の現在の日付と時刻です。 「UpdateTime」プロパティにはインデックスが付けられていないことに注意してください(極端なパラメーターはindex =“ false”です )。 同じ方法で、グローバル^ RefsDictionaryが最初に表示されます。 インデックスの構造は単純です:
- アイテムID
- 正規インデックスのグローバルブランチ名
つまり、必要な場合(たとえば、要素を削除するとき)-この要素の言及を含むすべての異なるインデックスセットをすばやく取得します。
setName
次に、 setName()関数を使用して名前の値を設定します。
#; -------------------------------------------------------------------------------------------------- #; , . #; ( ) . #; -------------------------------------------------------------------------------------------------- setName(ontology,type,lang,value,id)private #; set ^NameDictionaryElement(id,lang,0)=value #; / set ^NameDictionaryElement(id,lang,0,"UpdateTime")=$horolog #; set ^IndexDictionary(ontology,type,"name",lang,$zconvert(value,"l"),id)=1 #; set ^RefsDictionary(id,$name(^|"MONTOLOGY"|IndexDictionary(ontology,type,"name",lang,$zconvert(value,"l"),id)))=1 quit 0 #; --------------------------------------------------------------------------------------------------
その後、 saveOntoAndTypeID関数を呼び出します。 この関数は、オントロジーと要素タイプをグローバルブランチ^ IndexDictionary( "ID"、t( "id"))に書き込みます。 これは将来の場合に必要であり、ディレクトリの要素によって、どのタイプとオントロジーが属しているかを知る必要があります。 次に、同じブランチのsaveElementPath関数は、ディレクトリアイテムへのパスを記録します。
#; -------------------------------------------------------------------------------------------------- saveOntoAndTypeID set ^IndexDictionary("ID",t("id"),"ontology")=t("ontology") set ^RefsDictionary(t("id"),$name(^|"MONTOLOGY"|IndexDictionary("ID",t("id"),"ontology")))=1 set ^IndexDictionary("ID",t("id"),"type")=t("type") set ^RefsDictionary(t("id"),$name(^|"MONTOLOGY"|IndexDictionary("ID",t("id"),"type")))=1 quit #; -------------------------------------------------------------------------------------------------- saveElementPath set ^IndexDictionary("ID",t("id"),"path")=t("path") set ^RefsDictionary(t("id"),$name(^|"MONTOLOGY"|IndexDictionary("ID",t("id"),"path")))=1 quit #; --------------------------------------------------------------------------------------------------
グローバル^ RefsDictionaryのすべてのエントリには、明示的なネームスペース名が含まれていることに注意してください| "MONTOLOGY" | 。将来、別のネームスペースからこのグローバルを使用する場合、常に正しいフルパスを使用できます。もちろん、Dictionaryプログラム自体の中でも、フルパスを記述する必要があります(他の名前空間からメソッドを呼び出す場合)。私のプロジェクトでは、これはマクロを介して実装されていますが、簡単にするために、ここでは簡単なコードを提供しました。
すべての辞書コード:
#; -------------------------------------------------------------------------------------------------- #; #; -------------------------------------------------------------------------------------------------- Dictionary #; -------------------------------------------------------------------------------------------------- #; . #; -------------------------------------------------------------------------------------------------- retrieve(id,lang="ru",version=0) quit $get(^NameDictionaryElement(id,lang,version),"") #; -------------------------------------------------------------------------------------------------- #; . #; -------------------------------------------------------------------------------------------------- retrieveListByIndex(ontology,type,index,value,str="",lang="ru") #; , set str=$zconvert(str,"L") set id="" for { #; () set id=$order(^IndexDictionary(ontology,type,index,value,id)) #; , quit:id="" #; set name=$$retrieve(id,lang) #; str if $extract($zconvert(name,"L"),1,$length(str))=str { #; ( ) write id_" "_name,! } } quit #; -------------------------------------------------------------------------------------------------- #; . #; . #; -------------------------------------------------------------------------------------------------- create() #; kill map("out") #; t #; create new t #; set t("err")=$$check("create") #; , if t("err")<0 { quit t("err") } #; "UpdateTime" do setProperty(t("ontology"),t("type"),"UpdateTime",$horolog,t("id"),"false") #; "uid" do setProperty(t("ontology"),t("type"),"uid",t("uid"),t("id"),"true") set t("lang")="" for { #; ( ) set t("lang")=$order(t("nameList",t("lang"))) #; , quit:t("lang")="" #; set t("name")=$get(t("nameList",t("lang"))) #; do setName(t("ontology"),t("type"),t("lang"),t("name"),t("id")) } #; do saveOntoAndTypeID #; do saveElementPath #; set map("out","id")=t("id") #; kill map("in") #; quit t("id") #; -------------------------------------------------------------------------------------------------- #; . #; ^RuleDictionary . #; -------------------------------------------------------------------------------------------------- check(action)private #; check new check #; action set check=$case(action,"create":$$checkCreate(),"update":$$checkUpdate(),"delete":$$checkDelete(),:-1) #; quit:check<0 check #; "uid" set t("uid")=$get(map("in","uid"),888) #; , "check", if $data(^RuleDictionary(t("ontology"),t("type"),action,"check")) { #; t("map") set t("map")=$name(^RuleDictionary(t("ontology"),t("type"),action,"check")) } else { #; t("map") set t("map")=$name(^RuleDictionary("SimpleOntology","SimpleType",action,"check")) } set check("i")="" for { #; set check("i")=$order(@t("map")@(check("i"))) #; , quit:check("i")="" #; xecute $get(@t("map")@(check("i"))) #; , quit:check<0 } #; quit check #; -------------------------------------------------------------------------------------------------- #; . #; id, ontology, type, . #; -------------------------------------------------------------------------------------------------- checkCreate()private #; st("ontology")=$get(map("in","ontology"),"") #; quit:t("ontology")="" -1 #; set t("type")=$get(map("in","type"),"") #; , quit:t("type")="" -1 #; set t("check")=$$checkNames() #; , quit:t("check")<0 t("check") #; set t("id")=$increment(^Dictionary("MaxID")) #; ^Dictionary set t("path")=$name(^Dictionary(t("ontology"),t("type"),t("id"))) #; quit 0 #; -------------------------------------------------------------------------------------------------- checkUpdate() quit 0 #; -------------------------------------------------------------------------------------------------- checkDelete() quit 0 #; -------------------------------------------------------------------------------------------------- #; . #; -------------------------------------------------------------------------------------------------- checkNames()private #; merge t("nameList")=map("in","nameList") #; t("check") #; set t("check")=-1 set t("lang")="" for { #; set t("lang")=$order(t("nameList",t("lang"))) #; , quit:t("lang")="" #; set t("name")=$get(t("nameList",t("lang")),"") #; if t("name")="" { #; t("check") set t("check")=-1 #; quit } else { #; t("check") , set t("check")=0 } } #; quit t("check") #; -------------------------------------------------------------------------------------------------- clearPunctuationAndControlCharAllLang() set t("lang")="" for { #; set t("lang")=$order(t("nameList",t("lang"))) quit:t("lang")="" #; set t("nameList",t("lang"))=$$clearPunctuationAndControlChar($get(t("nameList",t("lang")),"")) } quit #; -------------------------------------------------------------------------------------------------- checkUniqueNameElementAllLang() set t("lang")="" for { #; set t("lang")=$order(t("nameList",t("lang"))) quit:t("lang")="" #; set t("name")=$get(t("nameList",t("lang")),"") #; check (0 - ) set check=$$checkUniqueNameElement() #; - quit:check<0 } quit #; -------------------------------------------------------------------------------------------------- #; . #; -------------------------------------------------------------------------------------------------- clearPunctuationAndControlChar(str) new t #; t("str") set t("str")="" #; for t("i")=1:1:$length(str) { #; set t("ch")=$extract(str,t("i")) if '((t("ch")?1P)||(t("ch")?1C)) { #; set t("str")=t("str")_t("ch") } } #; quit t("str") #; -------------------------------------------------------------------------------------------------- #; -------------------------------------------------------------------------------------------------- #; , , . #; , . #; -------------------------------------------------------------------------------------------------- checkUniqueNameElement() #; set t("q")=0 set t("uniqueId")="" for { #; , #; , , ( ) set t("uniqueId")=$order(^IndexDictionary(t("ontology"),t("type"),"name",t("lang"),$zconvert(t("name"),"l"),t("uniqueId"))) #; quit:t("uniqueId")="" #; , #; update if (t("uniqueId")'=t("id")) { #; , set t("q")=-1 quit } } #; quit t("q") #; -------------------------------------------------------------------------------------------------- #; , . #; . #; -------------------------------------------------------------------------------------------------- setProperty(ontology,type,property,value,id,index="true")private #; () set ^Dictionary(ontology,type,id,0,property)=value #; if index="true" { #; set ^IndexDictionary(ontology,type,property,value,id)=1 #; set ^RefsDictionary(id,$name(^|"MONTOLOGY"|IndexDictionary(ontology,type,property,value,id)))=1 } quit 0 #; -------------------------------------------------------------------------------------------------- #; , . #; ( ) . #; -------------------------------------------------------------------------------------------------- setName(ontology,type,lang,value,id)private #; set ^NameDictionaryElement(id,lang,0)=value #; / set ^NameDictionaryElement(id,lang,0,"UpdateTime")=$horolog #; set ^IndexDictionary(ontology,type,"name",lang,$zconvert(value,"l"),id)=1 #; set ^RefsDictionary(id,$name(^|"MONTOLOGY"|IndexDictionary(ontology,type,"name",lang,$zconvert(value,"l"),id)))=1 quit 0 #; -------------------------------------------------------------------------------------------------- saveOntoAndTypeID set ^IndexDictionary("ID",t("id"),"ontology")=t("ontology") set ^RefsDictionary(t("id"),$name(^|"MONTOLOGY"|IndexDictionary("ID",t("id"),"ontology")))=1 set ^IndexDictionary("ID",t("id"),"type")=t("type") set ^RefsDictionary(t("id"),$name(^|"MONTOLOGY"|IndexDictionary("ID",t("id"),"type")))=1 quit #; -------------------------------------------------------------------------------------------------- saveElementPath set ^IndexDictionary("ID",t("id"),"path")=t("path") set ^RefsDictionary(t("id"),$name(^|"MONTOLOGY"|IndexDictionary("ID",t("id"),"path")))=1 quit #; --------------------------------------------------------------------------------------------------
^ RuleDictionaryルールglobalを除くすべてのグローバルを削除します。
MONTOLOGY>kill ^Dictionary,^IndexDictionary,^NameDictionaryElement,^RefsDictionary MONTOLOGY>
そして、ディレクトリの最初の2つの要素を作成します。
MONTOLOGY>kill map MONTOLOGY>set map("in","ontology")="Vehicle",map("in","type")="TransmissionType" MONTOLOGY>set map("in","nameList","ru")=" ,",map("in","nameList","partUri")="akp" MONTOLOGY>write $$create^Dictionary() 1 MONTOLOGY>kill map MONTOLOGY>set map("in","ontology")="Vehicle",map("in","type")="TransmissionType" MONTOLOGY>set map("in","nameList","ru")="",map("in","nameList","partUri")="meh" MONTOLOGY>write $$create^Dictionary() 2 MONTOLOGY>
すべてのグローバルを印刷します。
MONTOLOGY>zwrite ^Dictionary,^IndexDictionary,^NameDictionaryElement,^RefsDictionary ^Dictionary("MaxID")=2 ^Dictionary("Vehicle","TransmissionType",1,0,"UpdateTime")="62948,47015" ^Dictionary("Vehicle","TransmissionType",1,0,"uid")=888 ^Dictionary("Vehicle","TransmissionType",2,0,"UpdateTime")="62948,47022" ^Dictionary("Vehicle","TransmissionType",2,0,"uid")=888 ^IndexDictionary("ID",1,"ontology")="Vehicle" ^IndexDictionary("ID",1,"path")="^Dictionary(""Vehicle"",""TransmissionType"",1)" ^IndexDictionary("ID",1,"type")="TransmissionType" ^IndexDictionary("ID",2,"ontology")="Vehicle" ^IndexDictionary("ID",2,"path")="^Dictionary(""Vehicle"",""TransmissionType"",2)" ^IndexDictionary("ID",2,"type")="TransmissionType" ^IndexDictionary("Vehicle","TransmissionType","name","partUri","akp",1)=1 ^IndexDictionary("Vehicle","TransmissionType","name","partUri","meh",2)=1 ^IndexDictionary("Vehicle","TransmissionType","name","ru","",1)=1 ^IndexDictionary("Vehicle","TransmissionType","name","ru","",2)=1 ^IndexDictionary("Vehicle","TransmissionType","uid",888,1)=1 ^IndexDictionary("Vehicle","TransmissionType","uid",888,2)=1 ^NameDictionaryElement(1,"partUri",0)="akp" ^NameDictionaryElement(1,"partUri",0,"UpdateTime")="62948,47015" ^NameDictionaryElement(1,"ru",0)="" ^NameDictionaryElement(1,"ru",0,"UpdateTime")="62948,47015" ^NameDictionaryElement(2,"partUri",0)="meh" ^NameDictionaryElement(2,"partUri",0,"UpdateTime")="62948,47022" ^NameDictionaryElement(2,"ru",0)="" ^NameDictionaryElement(2,"ru",0,"UpdateTime")="62948,47022" ^RefsDictionary(1,"^|""MONTOLOGY""|IndexDictionary(""ID"",1,""ontology"")")=1 ^RefsDictionary(1,"^|""MONTOLOGY""|IndexDictionary(""ID"",1,""path"")")=1 ^RefsDictionary(1,"^|""MONTOLOGY""|IndexDictionary(""ID"",1,""type"")")=1 ^RefsDictionary(1,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""partUri"",""akp"",1)")=1 ^RefsDictionary(1,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""ru"","""",1)")=1 ^RefsDictionary(1,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""uid"",888,1)")=1 ^RefsDictionary(2,"^|""MONTOLOGY""|IndexDictionary(""ID"",2,""ontology"")")=1 ^RefsDictionary(2,"^|""MONTOLOGY""|IndexDictionary(""ID"",2,""path"")")=1 ^RefsDictionary(2,"^|""MONTOLOGY""|IndexDictionary(""ID"",2,""type"")")=1 ^RefsDictionary(2,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""partUri"",""meh"",2)")=1 ^RefsDictionary(2,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""name"",""ru"","""",2)")=1 ^RefsDictionary(2,"^|""MONTOLOGY""|IndexDictionary(""Vehicle"",""TransmissionType"",""uid"",888,2)")=1
ご覧のとおり、これらのグローバルは記事の冒頭に示したものとは異なります。値は「UpdateTime」のみです-今日これらのアクションを実行しました-したがって、日付は最新です。新しいブランチ^ IndexDictionary( "ID")も登場し、グローバル^ RefsDictionaryでそれへのバックリンクがあります。では^辞典(«MAXID»)参照サブシステムで私たちのアイデンティティーの最大の要素を保ちました。辞書
プログラムのコードは作業中のプロジェクトで使用されていますが、明確化と単純化のために、いくつかの構成を見逃し、コマンドの完全な名前を使用しました。おそらくどこかでエラーが忍び寄った-もし誰かがそれを見つけたら-コメントに書いてください。
次の記事では、ネスト構造について説明します。もっとコンパクトにしようと思います。
ご清聴ありがとうございました。
私は質問、コメント、提案を喜んでいます。