Cypress Database System DocumentationR. G. G. CattellLast updated June 13, 1983This document describes the Cypress system, and is aimed at potential writers of databaseapplications in the Cedar programming environment. It should be accurate as of the dateabove, and is recommended as better documentation than CSL Report 83-4, from which itwas derived. Suggestions are welcomed on both the design of Cypress and its exposition inthis document. We will assume little knowledge of database systems, and little knowledge ofCedar. We will not explain the motivation for this particular design of Cypress; see the CSLReport for that. You should also consult the documentation for database tools not describedhere; see a database wizard for details.TABLE OF CONTENTS1.Introduction12.Cypress data model concepts32.1Data independence2.2Basic primitives2.3Names and keys2.4Basic operations2.5Aggregate operations2.6Convenience operations2.7Normalization2.8Segments3.Model level interface193.1Types3.2Transactions and segments3.3Data schema definition3.4Basic operations3.5Query operations3.6System domains and relations3.7Errors4. Application example394.1A database application4.2Schema design4.3Example programî ·ï^pôžð%î ·ïY)qôXî ·ïW¥ rôF î ·ïR¯sô©ð;ôªî ·ïQô³ðLô´ î ·ïO`ô³ð6ô´î ·ïM¹ô�ð)ô‘ð1î ·ïLô�ðYô�î ·ïJjô˜ðYô™î ·ïHÃô‰ð!ôŠð;î ·ïGôð(î!BïBtôiî ï>³uî€ î8@î ï<éî€ôXî8@î–ï;î! î–ï9šî! î–ï8î! î–ï6’î! î–ï5î! î–ï3Šî! î–ï2î! î–ï0‚î! î ï.·î€î8@î–ï,íî! î–ï+iî! î–ï)äî! î–ï(`î! î–ï&Üî! î–ï%Xî! î–ï#Ôî! î ï" î8@î–ï ?î `î–ï»î ` î–ï7î `ÿº ·ð>QC@à11. IntroductionCypress was motivated by the need for database management facilities in Cedar. Its goals are (1)convenience, making it easy to build new database applications in Cedar, and (2) reasonableperformance for a wide class of applications. If you are unsure whether an application you have inmind is appropriate, talk to someone who has built one. You should also consult others to see whatauxiliary documentation and folklore is available.The conceptual data structure provided by a database system, analogous to the Mesa type system, iscalled a data model. The data model specifies how data may be structured and accessed; thus thedata model is what you need to know in order to use the system. The Cypress data modeldescribed herein includes features that are accepted in some form in a number of models in theliterature, particularly those that seemed most useful for database applications we envision in CSL.The data model is described conceptually in Section 2. In Section 3 we describe the Cedar interfaceto Cypress: DB.mesa. Finally, Section 4 provides a simple example of Cypress use. We cover onlythe abstract model and the DB interface, not its implementation or rationale. The reader interestedin these should consult CSL Report 83-4. A set of formal axioms for the model can also be foundthere.Clients interested in tools for examining or modifying databases, either as an end-user or fordebugging an application program, should consult the database tools documentation:[Indigo]Documentation> SquirrelDoc.tioga, .press.îHYïfñpî ·ï\Tqô€î ·ïXxpôŸðSô  î ·ïVDôåôæð=î ·ïTôŠô‹ðMî ·ïQÛô�ô‚ðOî ·ïO§ôð2î ·ïKËôˆð&ô‰ð<î ·ïI–ôšr pô›ðKî ·ïGbôÓðDôÔî ·ïE-ô®ðMô¯î ·ïBùô˜ð#ô™ðAî ·ï?ô�ðTô‚î ·ï<éôˆðFô‰î ·ï:´ôŠ ô‹ðXî ·ï8€ôŽðRô� î ·ï6Kî ·ï2pôÚð^î ·ï0;ô“ ô”ðFî ·ï.ôð; ·-À=ç:K–32. Cypress data model conceptsIn this section, we give an informal description of the Cypress data model. We describe theparticulars of the Cedar interface in Section 3. 2.1 Data independenceWe deal here with the conceptual data model: the logical primitives for data access and data typedefinition. This should be carefully distinguished from the physical data storage and accessmechansisms. The physical representation of data is hidden as much as possible from the databaseclient to facilitate data independence, the guarantee that a user's program will continue to work(perhaps with a change in efficiency) even though the physical data representation is redesigned. For any particular database using our conceptual data model, the actual specification of the types ofdata in the database, using the primitives the model provides, is termed the data schema. Note thata mapping must be provided between the conceptual data model and the physical representation,either automatically or with further instruction from the client; we will do some of both. Thelogical to physical mapping is intimately associated with the performance of the database system asviewed by the user performing operations at the conceptual level.2.2 Basic primitivesThree basic primitives are defined in the model: an entity, datum, and relationship.An entity represents an abstract or concrete object in the world: a person, an organization, adocument, a product, an event. In programming languages and knowledge representation entitieshave variously been referred to as atoms, symbols, and nodes. A datum, unlike an entity, representsliteral information such as times, weights, part names, or phone numbers. Character strings andintegers are possible datum types.It is a policy decision whether something is represented as an entity or merely a datum: e.g., anemployee's spouse may be represented in a database system as a datum (the spouse's name), or thespouse may be an entity in itself. The database system provides a higher level of logical integritychecking for entities than for datum values, as we will see later: unique entity identifiers, checks onentity types, and removal of dependent data upon entity deletion. We shall discuss theentity/datum choice further in Section 4.2.We will use the term value to refer to something that can be either a datum or an entity. In manyprogramming languages, there is no reason to distinguish entity values from datum values. Indeed,î<¢ï\OpîïT-qô€îïPQpôÑð?ôÒîïNôð1îïGÆrîïCêpô¥spô¦îïA¶ôíð<ôîð!îï?� tô�pô‘ðPîï=MôÄspð;îï;ô³ðaôîï7=ô†ð5ô‡ð0îï5ôˆðMs p îï2Ôô©ð"ôªð;îï0ŸôÀðTôÁ îï.kô”ð`ô•îï,7ôðAîï%àrîï"pð5s ps pîï(ôÈðAôÉîïôô¨ð<ô©ð"îï¿ô�ð)ô‚ð;îï‹ô²ô³ðEîïVôð"îï{ô¦spðSîïFô�ðDô�îï ôœ ô�ðZîï Ýôƒðhîï©ôðEôîïtôð+îï™ôŒsp ô�ð<îïdô�ð?ô�ð#ÿ ¬ · ¢=ç]iéCYPRESS DOCUMENTATION4most of the Cypress operations deal with any kind of value, and some make it transparent to thecaller whether an entity or datum value is involved. The transparent case makes relationaloperations possible in our model, as we will see in Section 2.5.A relationship is a tuple whose elements are [entity or datum] values. We refer to the elements(fields) of relationships by name instead of position. These names for positions are called attributes.Note that we have separated the representatives of unique objects (entities) from the representationof information about objects (relationships), unlike some object-oriented programming languagesand data models. Therefore an entity is not an "object" (or "record") in the programming languagesense, although entities are representatives of real-world objects. We also define entity types, datum types, and relationship types. These are called domains,datatypes, and relations, respectively. We make use of these three types through one fundamentaltype constraint: every relationship in a relation has the same attributes, and the values associatedwith each attribute must be from a pre-specified domain or datatype. One might think of a relationas a "record type" in a programming language, although relations permit more powerful operationsthan record types.As an example, consider a member relation that specifies that a given person is a member of a givenorganization with a given job title, as in the following figure. The person and organization might beentities, while the title might be a string datum. We relax the fundamental type constraintsomewhat in allowing a lattice of types of domains: a particular value may then belong to the pre-specified domain or one of its sub-domains. For example, one could be a member of a University,a Company, or any other type of Organization one chooses to define. Other relations, e.g. an"offers-course" relation, might apply only to a University.<==BBpBöÑÀ¼-. Cñÿ@Ctl½J»�e¼‹“Còº)+zº§RD@ªˆ»�:p¼ × CÇ¿`¼À¼3车dDs?CÌ€¼€c`ôEufdD÷æpCÇÀ¼0t½ŠˆÀCûˆ€CC¼6À»’˜¼¼ô@Cûˆ€º? »9’üCÀ|”¼+5Þ½¯ï ½´y�¼€¼‹”Bê¸Dr›CtlÀ¼GbpEdî\Dm�"CPŽÐ¼•Ìa½´±à@BÅ@Cþá€BÃ�¼u€»˜e½½’CóþClD¼ºh»�𼓼€Cóþ€¼¦½,Bù"BPà½;>½¢¼%}€¼%~¼¥Dq#CÚ‚¼%|€-d CZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ @½¾¾/ð¼ ¼“¼CE˜DrClC€¼ €-RdC`CQ2½+ø½¾AðúCóþ¼“À»�h¼"ClC€Cóþ€¼¦BÔCK2½7÷þ½¾AлÀD@D`»À-�d CZ½,Bá"½�½3>BmðCÚ‚€¼%~»ŽÝ@¼¥|CÚ‚CÚƒ€¼¸CHBÕ"½�½;>B]ð¼ Cl@Db˜C÷Þ¼“¼€¼ €-ÁcæCH¼¸Bhè¼½p½’BÌÀClB¼ »�ñCE”CóþClG½,CZBPè½རBÄÀ¼%}€CÚ‚Dq"ÀCZ„¼%~¼%|€-äc´BÔ¼¦¼¨Ì¾ðBðD»À» D@D@C`¾ 0¼®Ì¾/ðBèCÿ¼“¾CóþDr¼ºl¼ ¼“¹-òcw¼ ½+ú¼®ÌAðBðD¼“¾¼ ¼$Db™Cóþ¼“¹BÔCZ½7ú¼´ÌAÐBèDD@D`»À»À-äc:½,¼¦½Œ½àBmðBÌÀ¼%}€¼%~¼¥Dq#CÚ‚¼%|€CHCH½Œ½*àB]ðBÄÀClBCóþC÷Ü»�g¼ ClG-Ác¼¸¼¸¼½o½— BÌÂBmð¼ ¼“¼CE˜DrClC€¼ €CZBÔ½Þ½¯ BÄÂB]ðCÚ‚€CÚ‚CZ�»ŽÝ¼%~CÚƒ€-�b弦½,¼¨ÎBðBAð»ÀD@D`»ÀC`¼®ÎA_ÀBèBAÐCóþClD¼ºh»�𼓼€Cóþ€-Rb×¼ ¼®ÎBÔBðB¾ð¼ Cl@Db˜C÷Þ¼“¼€¼ €CZ½,¼´ÎBÈBèB¾/ðD@»À» D@-b弦BÔ½ÞBðpB̽’¼%}€CÚ‚Dq"ÀCZ„¼%~¼%|€CH¼¸½*ÞBäpBĽ¢Cóþ¼“À»�h¼"ClC€Cóþ€,ãc¼¸CH½—CB�Bmð½3?ÿ¼“¾CóþDr¼ºl¼ ¼“¹BÔ¼¦½¯BùþB]ð½;@CÚ‚€¼%~»ŽÝ@¼¥|CÚ‚CÚƒ€,Àc:½,CZCW4Að½»þD@D`»À»À¼ A_ÐCQ3þAн¼ClB¼ »�ñCE”CóþClGJohn Smithÿ]ÑEÏ•½Eu© Bk@BBpBöÑÀ¼-. CñÿCtl½L»�e¼‹’€Còº)+zº§RD@ªˆ»�:p¼ × CÇ¿`¼À¼3车dDs?CÌ`¼€#a4EufdD÷æpCÇÀ¼0t½ŠˆÀCûˆ€CC¼6À»’˜¼¼ô@Cûˆ€º? »9’üCÀ|”¼+5Þ½¯ï ½´y�¼€¼‹”Bê¸Dr›CtlÀ¼"b°Edî\Dm�"CPŽÐ¼•Ìa½´±à@BÅ@Cþá€BÃ�¼u€»˜e½½’CóþClD¼ºh»�𼓼€Cóþ€¼¦½,Bù"BPà½;>½¢¼%}€¼%~¼¥Dq#CÚ‚¼%|€&ud)CZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ @½¾¾/ð¼ ¼“¼CE˜DrClC€¼ €&²d7C`CQ2½+ø½¾AðúCóþ¼“À»�h¼"ClC€Cóþ€¼¦BÔCK2½7÷þ½¾AлÀD@D`»À&ïd)CZ½,Bá"½�½3>BmðCÚ‚€¼%~»ŽÝ@¼¥|CÚ‚CÚƒ€¼¸CHBÕ"½�½;>B]ð¼ Cl@Db˜C÷Þ¼“¼€¼ €'!dCH¼¸Bhè¼½p½’BÌÀClB¼ »�ñCE”CóþClG½,CZBPè½རBÄÀ¼%}€CÚ‚Dq"ÀCZ„¼%~¼%|€'DcÔBÔ¼¦¼¨Ì¾ðBðD»À» D@D@C`¾ 0¼®Ì¾/ðBèCÿ¼“¾CóþDr¼ºl¼ ¼“¹'Rc—¼ ½+ú¼®ÌAðBðD¼“¾¼ ¼$Db™Cóþ¼“¹BÔCZ½7ú¼´ÌAÐBèDD@D`»À»À'DcZ½,¼¦½Œ½àBmðBÌÀ¼%}€¼%~¼¥Dq#CÚ‚¼%|€CHCH½Œ½*àB]ðBÄÀClBCóþC÷Ü»�g¼ ClG'!c(¼¸¼¸¼½o½— BÌÂBmð¼ ¼“¼CE˜DrClC€¼ €CZBÔ½Þ½¯ BÄÂB]ðCÚ‚€CÚ‚CZ�»ŽÝ¼%~CÚƒ€&ïc¼¦½,¼¨ÎBðBAð»ÀD@D`»ÀC`¼®ÎA_ÀBèBAÐCóþClD¼ºh»�𼓼€Cóþ€&²b÷¼ ¼®ÎBÔBðB¾ð¼ Cl@Db˜C÷Þ¼“¼€¼ €CZ½,¼´ÎBÈBèB¾/ðD@»À» D@&uc¼¦BÔ½ÞBðpB̽’¼%}€CÚ‚Dq"ÀCZ„¼%~¼%|€CH¼¸½*ÞBäpBĽ¢Cóþ¼“À»�h¼"ClC€Cóþ€&Cc(¼¸CH½—CB�Bmð½3?ÿ¼“¾CóþDr¼ºl¼ ¼“¹BÔ¼¦½¯BùþB]ð½;@CÚ‚€¼%~»ŽÝ@¼¥|CÚ‚CÚƒ€& cZ½,CZCW4Að½»þD@D`»À»À¼ A_ÐCQ3þAн¼ClB¼ »�ñCE”CóþClG0²a×D`D`¼@¼@D`» ¼@CÀ» » CÀCÀ» D`CÀ¼@0’a×C`BÔCQ4¾ð½¼Cl@CóþC÷Þ»�g¼ ClG½,¼¦BÈCK4¾/ð½¼»À» D@D@0 bBÔCZBðpBá ½’½3@CÚƒCÚ‚CZ€»ŽÝ¼%~CÚƒ€¼¸¼¸BäpBÕ ½¢½;@¼“À¼ ¼"Db™Cóÿ¼“¹0ÃbFCHCHCB’Bhà½3>½’CóþClD¼ºh»�𼓼€Cóþ€¼¦½,Bù$BPà½;>½¢¼%}¼%~¼¥€Dq#CÚ‚¼%|€0õbiCZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ @½¾¾/ð¼ ¼“¼CE˜DrClC€¼ €12bwC`CQ2½+ø½¾AðúCóþ¼“À»�h¼"ClC€Cóþ€¼¦BÔCK2½7÷þ½¾AлÀD@D`»À1obiCZ½,Bá$½�½3>BmðCÚ‚¼%~»ŽÝ€¼¥|CÚ‚CÚƒ€¼¸CHBÕ$½�½;>B]ð¼ Cl@Db˜C÷Þ¼“¼€¼ €1¡bFCH¼¸Bh༽p½’BÌÀClD¼ »�ðCE”CóÿClG½,CZBPà½རBÄÀ¼%~CÚ‚Dq"€CZ„¼%~¼%|€1ÄbBÔ¼¦¼¨Ì¾ðBðD»À» D@D@C`¾ @¼®Ì¾/ðBèCÿ¼“¼CóþDr¼ºl¼ ¼“¹1Òa×¼ ½+ø¼®ÌAðBðD¼“À¼ ¼"Db™Cóÿ¼“¹BÔCZ½7ø¼´ÌAÐBèDD@D`»À»À1Äaš½,¼¦½�½àBmðBÌÀ¼%}¼%~¼¥€Dq#CÚ‚¼%|€CHCH½�½*àB]ðBÄÀCl@CóþC÷Þ»�g¼ ClG1¡ah¼¸¼¸¼½n½— BÌÂBmð¼ ¼“¼CE˜DrClC€¼ €CZBÔ½ܽ¯ BÄÂB]ðCÚƒCÚ‚CZ€»ŽÝ¼%~CÚƒ€1oaE¼¦½,¼¨ÎBðBAð»ÀD@D`»ÀC`¼®ÎA_ÀBèBAÐCóþClD¼ºh»�𼓼€Cóþ€12a7¼ ¼®ÎBÔBðB¾ð¼ Cl@Db˜C÷Þ¼“¼€¼ €CZ½,¼´ÎBÈBèB¾/ðD@»À» D@0õaE¼¦BÔ½ÜBðpB̽’¼%~CÚ‚Dq"€CZ„¼%~¼%|€CH¼¸½*ÜBäpBĽ¢Cóþ¼“À»�h¼"ClC€Cóþ€0Ãah¼¸CH½— CB�Bmð½3?ÿ¼“¼CóþDr¼ºl¼ ¼“¹BÔ¼¦½¯ BùþB]ð½;@CÚ‚¼%~»ŽÝ€¼¥|CÚ‚CÚƒ€0 aš½,CZCW4Að½»þD@D`»À»À¼ A_ÀCQ3þAн¼ClD¼ »�ðCE”CóÿClGJohnMaryJohnTom#Ò[÷D`D`¼@¼@D`» ¼@CÀ» » CÀCÀ» D`CÀ¼@#²[÷C`BÔCQ4¾ð½¼ClBCóþC÷Ü»�g¼ ClG½,¼¦BÈCK4¾/ð½¼»À» D@D@#À\4BÔCZBðrBá ½’½3@CÚ‚€CÚ‚CZƒ»ŽÝ¼%} CÚƒ€¼¸¼¸BärBÕ ½¢½;@¼“¾¼ ¼$Db™Cóþ¼“¹#ã\fCHCHCB’Bhà½3=½’CóþClD¼ºg»�𼓾Cóþ€¼¦½,Bù$BPà½;=½¢¼%}€¼%~¼¥}Dq#CÚ‚à¼%|€$\‰CZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ @½¾¾/ð¼ ¼“¼CE™DrClB¼ €$R\—C`CQ2½+ø½¾AðúCóý€¼“À»�h€¼"ClBCóþ€¼¦BÔCK2½7÷þ½¾AлÀD@D`»À$�\‰CZ½,Bá$½�½3=BmðCÚ‚€¼%~»ŽÜÀ¼¥|CÚ‚àCÚƒ€¼¸CHBÕ$½�½;=B]ð¼ €Cl@Db—€C÷Þ¼“¾¼ €$Á\fCH¼¸Bhä¼½p½’BÌÀClB¼ »�ñCE”CóþClG½,CZBPä½རBÄÀ¼%}€CÚ‚Dq#@CZ„¼%} ¼%|€$ä\4BÔ¼¦¼¨Ì¾ðBðD»À» D@D@C`¾ 0¼®Ì¾/ðBèCÿ¼“¾CóþDr¼ºl¼ ¼“¹$ò[÷¼ ½+ú¼®ÌAðBðD¼“¾¼ ¼$Db™Cóþ¼“¹BÔCZ½7ú¼´ÌAÐBèDD@D`»À»À$ä[º½,¼¦½޽àBmîBÌÀ¼%}€¼%~¼¥}Dq#CÚ‚à¼%|€CHCH½޽*àB]îBÄÀClBCóþC÷Ü»�g¼ ClG$Á[ˆ¼¸¼¸¼½n½— BÌÃBmð¼ ¼“¼CE™DrClB¼ €CZBÔ½ܽ¯ BÄÃB]ðCÚ‚€CÚ‚CZƒ»ŽÝ¼%} CÚƒ€$�[e¼¦½,¼¨ÎBðBAð»ÀD@D`»ÀC`¼®ÎA_ÀBèBAÐCóþClD¼ºg»�𼓾Cóþ€$R[W¼ ¼®ÎBÔBðB¾ð¼ €Cl@Db—€C÷Þ¼“¾¼ €CZ½,¼´ÎBÈBèB¾/ðD@»À» D@$[e¼¦BÔ½ÜBðpBÌý’¼%}€CÚ‚Dq#@CZ„¼%} ¼%|€CH¼¸½*ÜBäpBÄý¢Cóý€¼“À»�h€¼"ClBCóþ€#ã[ˆ¼¸CH½—CB�Bmî½3?ÿ¼“¾CóþDr¼ºl¼ ¼“¹BÔ¼¦½¯BùþB]î½;@CÚ‚€¼%~»ŽÜÀ¼¥|CÚ‚àCÚƒ€#À[º½,CZCW4Að½»þD@D`»À»À¼ A_ÐCQ3þAн¼ClB¼ »�ñCE”CóþClG-r\D`D`¼@¼@D`» ¼@CÀ» » CÀCÀ» D`CÀ¼@-R\C`BÔCQ4¾ð½¼ClBCóþC÷Ü»�g¼ ClG½,¼¦BÈCK4¾/ð½¼»À» D@D@-`\TBÔCZBðtBá ½’½3@CÚ‚€CÚ‚CZ�»ŽÝ¼%~CÚƒ€¼¸¼¸BätBÕ ½¢½;@¼“¾¼ ¼$Db™Cóþ¼“¹-ƒ\†CHCHCB‘Bhà½3>½’CóþClD¼ºh»�𼓼€Cóþ€¼¦½,Bù"BPà½;>½¢¼%}€¼%~¼¥Dq#CÚ‚¼%|€-µ\©CZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ @½¾¾/ð¼ ¼“¼CE˜DrClC€¼ €-ò\·C`CQ2½+ø½¾AðúCóþ¼“À»�h¼"ClC€Cóþ€¼¦BÔCK2½7÷þ½¾AлÀD@D`»À./\©CZ½,Bá"½�½3>BmðCÚ‚€¼%~»ŽÝ@¼¥|CÚ‚CÚƒ€¼¸CHBÕ"½�½;>B]ð¼ Cl@Db˜C÷Þ¼“¼€¼ €.a\†CH¼¸Bhè¼½p½’BÌÀClB¼ »�ñCE”CóþClG½,CZBPè½རBÄÀ¼%}€CÚ‚Dq"ÀCZ„¼%~¼%|€.„\TBÔ¼¦¼¨Ì¾ðBðD»À» D@D@C`¾ 0¼®Ì¾/ðBèCÿ¼“¾CóþDr¼ºl¼ ¼“¹.’\¼ ½+ú¼®ÌAðBðD¼“¾¼ ¼$Db™Cóþ¼“¹BÔCZ½7ú¼´ÌAÐBèDD@D`»À»À.„[Ú½,¼¦½Œ½àBmðBÌÀ¼%}€¼%~¼¥Dq#CÚ‚¼%|€CHCH½Œ½*àB]ðBÄÀClBCóþC÷Ü»�g¼ ClG.a[¨¼¸¼¸¼½o½— BÌÂBmð¼ ¼“¼CE˜DrClC€¼ €CZBÔ½Þ½¯ BÄÂB]ðCÚ‚€CÚ‚CZ�»ŽÝ¼%~CÚƒ€./[…¼¦½,¼¨ÎBðBAð»ÀD@D`»ÀC`¼®ÎA_ÀBèBAÐCóþClD¼ºh»�𼓼€Cóþ€-ò[w¼ ¼®ÎBÔBðB¾ð¼ Cl@Db˜C÷Þ¼“¼€¼ €CZ½,¼´ÎBÈBèB¾/ðD@»À» D@-µ[…¼¦BÔ½ÞBðpB̽’¼%}€CÚ‚Dq"ÀCZ„¼%~¼%|€CH¼¸½*ÞBäpBĽ¢Cóþ¼“À»�h¼"ClC€Cóþ€-ƒ[¨¼¸CH½—CB�Bmð½3?ÿ¼“¾CóþDr¼ºl¼ ¼“¹BÔ¼¦½¯BùþB]ð½;@CÚ‚€¼%~»ŽÝ@¼¥|CÚ‚CÚƒ€-`[Ú½,CZCW4Að½»þD@D`»À»À¼ A_ÐCQ3þAн¼ClB¼ »�ñCE”CóþClG7ò[÷D`D`¼@¼@D`» ¼@CÀ» » CÀCÀ» D`CÀ¼@7Ò[÷C`BÔCQ4¾ð½¼Cl@CóþC÷Þ»�g¼ ClG½,¼¦BÈCK4¾/ð½¼»À» D@D@7à\4BÔCZBðpBá ½’½3@CÚƒCÚ‚CZ€»ŽÝ¼%~CÚƒ€¼¸¼¸BäpBÕ ½¢½;@¼“À¼ ¼"Db™Cóÿ¼“¹8\fCHCHCB’Bhà½3>½’CóþClD¼ºh»�𼓼€Cóþ€¼¦½,Bù$BPà½;>½¢¼%}¼%~¼¥€Dq#CÚ‚¼%|€85\‰CZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ @½¾¾/ð¼ ¼“¼CE˜DrClC€¼ €8r\—C`CQ2½+ø½¾AðúCóþ¼“À»�h¼"ClC€Cóþ€¼¦BÔCK2½7÷þ½¾AлÀD@D`»À8¯\‰CZ½,Bá$½�½3>BmðCÚ‚¼%~»ŽÝ€¼¥|CÚ‚CÚƒ€¼¸CHBÕ$½�½;>B]ð¼ Cl@Db˜C÷Þ¼“¼€¼ €8á\fCH¼¸Bh༽p½’BÌÀClD¼ »�ðCE”CóÿClG½,CZBPà½རBÄÀ¼%~CÚ‚Dq"€CZ„¼%~¼%|€9\4BÔ¼¦¼¨Ì¾ðBðD»À» D@D@C`¾ @¼®Ì¾/ðBèCÿ¼“¼CóþDr¼ºl¼ ¼“¹9[÷¼ ½+ø¼®ÌAðBðD¼“À¼ ¼"Db™Cóÿ¼“¹BÔCZ½7ø¼´ÌAÐBèDD@D`»À»À9[º½,¼¦½�½àBmðBÌÀ¼%}¼%~¼¥€Dq#CÚ‚¼%|€CHCH½�½*àB]ðBÄÀCl@CóþC÷Þ»�g¼ ClG8á[ˆ¼¸¼¸¼½n½— BÌÂBmð¼ ¼“¼CE˜DrClC€¼ €CZBÔ½ܽ¯ BÄÂB]ðCÚƒCÚ‚CZ€»ŽÝ¼%~CÚƒ€8¯[e¼¦½,¼¨ÎBðBAð»ÀD@D`»ÀC`¼®ÎA_ÀBèBAÐCóþClD¼ºh»�𼓼€Cóþ€8r[W¼ ¼®ÎBÔBðB¾ð¼ Cl@Db˜C÷Þ¼“¼€¼ €CZ½,¼´ÎBÈBèB¾/ðD@»À» D@85[e¼¦BÔ½ÜBðpB̽’¼%~CÚ‚Dq"€CZ„¼%~¼%|€CH¼¸½*ÜBäpBĽ¢Cóþ¼“À»�h¼"ClC€Cóþ€8[ˆ¼¸CH½— CB�Bmð½3?ÿ¼“¼CóþDr¼ºl¼ ¼“¹BÔ¼¦½¯ BùþB]ð½;@CÚ‚¼%~»ŽÝ€¼¥|CÚ‚CÚƒ€7à[º½,CZCW4Að½»þD@D`»À»À¼ A_ÀCQ3þAн¼ClD¼ »�ðCE”CóÿClG&pc+»¦ÂÞ»OH¾‹€@½¾à0½§>Ba†Ð¼ŒÀ¼ ´¼.€Dd^CòK€¼ŒÀDm…¼Dìž’¼§•–Ba$ B™è¿*É€C]†C÷&DAü»¡Z¼ØÀC]ˆ%¯ai»�A »/˜¼²+ÜBû@CS„¤½PH¼¥|¼F»¼ÔÀD]ÎC÷»¼¥}DY·Dõ¾ÓCÞƒd¼¸Œ¼¡�\BÀ7¸Cs@CòLCñÒ»›¢¼ ´Cs@$Ð_¬¼Ú²»=ĪCC%ˆAÃuÀ¾34 ½£/à½-ļª»«†ÀDN•CþV`½-ÊC^ÍPDÈÓ+BôWˆAçu¿ M€½—0 CZ„C÷ºDC+@»¢2¼ECZƒ$‰^›¼¶CÞ»Ž·„B~tAÃw ¿!0œ¾ ×à¾,˜¼»¢¯€DCÚCÿå¾,¸BNGdDx ÅBm<°AÔ?@½¿ÔBÒ<CþVDTy@»±k¼© BÒ6$r]¶½£û~»9pBÅ?b¾¥²€¾#Wz¿€’AQ¼»žÀÀCü.Cÿù AQ¾#û‚Dȸ AÜàAÛ`†¾ ÀAÓhCÿäD]P€»¼&¼AÓH&écNEd’iºœI4@oü¿�¾-|¿CÙº¼$¸»Ž¬@¼©`CÛI@CÙ»€º�$ÑEd’h½™1À¾1€AÈA[ô€¼%CÚ Dq €C\p¼%àÀ¼%€* `-Emfžº�³O½�5½´Ò@AÏg@AnÈCØh¼#n»Ž_¼¯ìCÜ‘ÀCØhº”³OEpY§@zþ¿�¾À¾»x¼&FCÛHDqSÀCV ¼$¶À¼&D€authorauthorauthorauthorR_·’_·D@»À» D@R_w»ÀD@D`»Àò_W$2_WD@»À» D@ò_»ÀD@D`»À%ò^·*2^·D@»À» D@%ò^w»ÀD@D`»À/r^W3²^WD@»À» D@/r^»ÀD@D`»À6²_:ò_D@»À» D@6²^×»ÀD@D`»ÀGeorgeBackgammon for BeginnersAdvanced Backgammon0êab»øîº¾AÄBNLBmBöW½kp¼>¾€¼â¼€DhCî¼>¼€DÕñÝEHƒ‰CöR¼®ï(¼ªºtBG¹ CÓqCáC|R»�ä¼î@CÓp/N_G»"½£º±P—DC»X¼¢=༠kˆBOòÀ¼ª�¼X»ºÞD\`Cø¨À¼ª‰Dz½¤EV¨LAþ‡ÀB×àCJ~x¼¾óPCÁA€CîCã뀻—ÿ¼âCÁC€1½a•EQåæ»ƒ:”By@¾   ½å0¼¼ß¨CíÔ¼>@»—ȼCÁ½CíÒº³ËÌDÛ:•½U°¼J�AÑ{@CV´V¼bC[D]ú€DBDြc€4B`rDèù�»‚Sß¾»¼=¾Ø½œààBx‹PCÞy¼)¤»�þ¼‘HCÖ\€CÞ{»#cÆDÔ©½œð ¼§Ö,½¾' ?È–¼,CÁÀDh8Câü¼>C¼.5Ô_DDo!໚hN¾‹®À½7p¼¾4¤°AÞ`CÕê¼!»�ြ¼ CÞáÀCÕ逻›�úDnë²¾0Mp½•.ˆ¾† AUù@¼!†CÖ\DpCn´¼)¢€¼!‡6ª^lDè'H» øœ¼©b˜¼¶¸¨Bd€ BsáÐCÌÕ¼ »ŒÍ€½™Cæ_ÀCÌÖ»$£Dú|NAÙð€¾ ½/ǰ¾)œ`¼*CÞäDrCCô¼!¼*€î³ïZaptôFpt îpîjïR†ô�ðaîjïPQô¥spô¦ð@îjïNôË ôÌðGîjïKèôŠð<ô‹ð%îjïI´ôîjï;_3îjï7ƒôŠð+ô‹ð5îjï5OôŠðVspô‹îjï3ôÃôÄðJîjï0æô¤ðXô¥ îjï.±ô‹ð?ôŒð!îjï,}ôÄð_îjï*Iôð$îjï&môçð9ôèîjï$8ôÎð4ôÏð(î`ï ]ôîjï�ô¯ð+ô°ð7îjïLôÈðEôÉîjïsôÑpðCôÒ îjïãô¢spð,spô£îjï¯ô¼ðJô½îjï{ôðBîjï Ÿô‘ô’ðAspîjï jôçðBôèîjï 6ô…ðdîjïô–ô—ðRîjïÍô� ô‘ðZîjï™ô¨ð&ô©spð%îjïdôð$ÿ œ M �>ç[{ìî òï[w$øx û7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7îï_÷øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7îrïc—îrï\Wî/ï[wî9Òï[Wøx û7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7î ï_—î%Òï^×î/rï^wî6’ï_7û#û#û#û#û#î%²ï[Wî'²ïdî2²ïa× û7û7û7û7û7û7 œ<¢þÅìxtuCYPRESS DATA MODEL CONCEPTS7Author:PersonBookGeorgeBackgammon for BeginnersJohnBackgammon for BeginnersJohnAdvanced BackgammonTomAdvanced BackgammonThus our introduction of entities to the Relational model does not entail a different representationthan, say, a Network model might imply, but simply additional integrity checks on entity names andtypes, and new operations upon entities. This compatibility with the Relational data model isimportant, as it allows the application of the powerful Relational calculus or algebra as a querylanguage. We return to query languages in Section 2.5.Note that the only information about an entity associated directly with the entity is the name; thiscontrasts with most other data models. A person's age or spouse, for example, would berepresented in the Cypress data model via age or spouse relations. Thus the relationships in adatabase are the information-carrying elements: entities do not have attributes. However the modelprovide an abbreviation, properties, to access information such as age or spouse in a singleoperation. We will discuss properties later. In addition, the physical data modelling algorithms canstore these data directly with the person entity as a result of the relation key information (since aperson can have only one age, a field can be allocated for that field in the stored objectrepresenting a person.)2.4 Basic operationsThe data model provides the capability to define and examine the data schema, and performoperations on entities, relationships, and aggregates of entities and relationships. In this section wediscuss the basic operations on entities and relationships. In Section 2.5, we discuss the operationson aggregate types, i.e. domains and relations. We defer to Section 2.6 the discussion of"convenience" operations built upon the basic and aggregate operations.Four basic operations are defined for entities:1.DeclareEntity[domain, name]: Returns a new or existing entity in a domain. An entityname must be specified.2.DestroyEntity[entity]: Destroys an entity; this also destroys all relationships that refer to it.3.DomainOf[entity]: Returns the domain of an entity (its type).4.NameOf[entity]: Returns the string name of an entity.î+ï[{ptpôXtptptî<¢pî ïS sî ‰ïQþÿïQkpî©ïQþïQkî •ïO7î©ô€î •ïMî©î •ïJÎî©î •ïH™î©îïD¾ôšô›ð'spð"îïB‰ô‚ð'ôƒð;îï@UôÍð.ôÎð0îï> ô¹ôºðQîï;ìôð7îï8ôšð'ô›spð"îï5Üôû ôüðIîï3§ô½ð7ô¾ð(îï1sô�ðRô‚îï/>ôôs pôõð"îï- ôˆðWô‰îï*Õô ô¡ðGîï(¡ôõð)ôöð1îï&môîï rîï:pô×ð&ôØð3îïô“ðTô”îïÑô–ð[ô— îï�ôýð/ôþð+îïhôðGîïŒð/îžï ±îöuôŸpupô ð(îöï |ôîžïtîöupôƒupðCô„îžïlîöupôupð+îžïdîöupð%¼ · v=ç\•CYPRESS DOCUMENTATION8Five basic operations are defined for relationships:1.DeclareRelationship[relation, list of attribute values]: Returns a relationship with thegiven attribute values in the given relation.2.DestroyRelationship[relationship]: Destroys a relationship.3.RelationOf[relationship]: Returns a relationship's relation.4.GetF[relationship, attribute]: Returns the value associated with the given attribute of thegiven relationship.5.SetF[relationship, attribute, value]: Sets the value of the given relationship attribute.The operations upon relationships recognize a specially-distinguished undefined value for anattribute. Unassigned attributes of a newly-created relationship have this value. A client of the datamodel may retrieve a value with GetF and test whether it equals the distinguished undefined value,and may set a previously defined value to be the distinguished undefined value with SetF.Other "convenience" operations are built on top of the basic operations on entities andrelationships: properties and translucent attributes. They are described in Section 2.6. Althoughthese operations are not essential to the basis of the Cypress model, they do furnish a fundamentallydifferent perspective on the model. They provide a mechanism to associate information directlywith entities (instead of through relationships) and to write programs largely independent ofattribute types.The reader will also note that we have ignored issues of concurrent access and protection in thebasic operations. We will see later that an underlying transaction, file, and protection is associatedwith the relation and domain handles used in the basic operations. This convenience allows us totreat concurrency, protection, and data location orthogonally.2.5 Aggregate operationsThere are two kinds of operations upon domains and relations, the aggregate types in our model:the definition of domains and relations, and queries on domains and relations. We first discusstheir definitions.Schema definitionAs in other database models and a few programming languages, the Cypress model is self-representing: the data schema is stored and accessible as data. Thus application-independent toolscan be written without coded-in knowledge of the types of data and their relationships.ÿî³ïZaptôFpt îpîjïR†ôð4îïNªî`uô¼ð:pô½î`ïLuôð-îïImî`uð$pîïFeî`upð"îïC]î`uô—pð+ô˜î`ïA)ôîï>!î`uôÍð'pð(ôÎ îjï:Eô ðFspô îjï8ô€ðSô�îjï5ÜôŠupô‹îjï3§ôîð)ôïð+upîjï/Ìô ô!ðDîjï-—ô«s pspð"ô¬ îjï+cô€ô�ðQîjï).ô¶ð3ô·ð,îjï&úôïð!ôðð<îjï$Åôîjï êô°ðCô±îjïµô–ðgîjï�ô›ôœðEîjïLôð>îjïörîjïpô¥ðBspô¦îjï åôµð4ô¶ð,îjï ±ôîjïÕsîjïÍpôøð<ôùîjï™ô—ô˜ðMîjïdôðWú M �>ç[{ùCYPRESS DATA MODEL CONCEPTS9Client-defined domains, relations, and attributes are represented by entities. These entities belong tospecial built-in domains, called the system domains:the Domain domain, with one element (entity) per domainthe Attribute domain, with one element per attributethe Relation domain, with one element per relationThere is also a predefined Datatype domain, with pre-defined elements StringType, BoolType, andIntType, called built-in types. We do not allow client-defined datum types at present.Information about domains, relations, and attributes are represented by system relations in which thesystem entities participate. The pre-defined SubType relation is a binary relation between domainsand their subdomains. There are also predefined binary relations that map attributes to informationabout the attributes:aRelation: maps an attribute entity to its relation entity.aType: maps an attribute to its type entity (a domain or a built-in type)aUniqueness: maps an attribute entity to {TRUE, FALSE}, depending whether it is partof a key of its relation. We are assuming only one key per relation, here; our implementation relaxes thisassumption in the case of single-attribute keys. The following diagram graphically illustrates a segment of a data schema describing the memberrelation and several domains. The left side of the figure shows two subdomains of Organization,(Company and University), and the right shows the types and uniqueness properties of the memberrelation's attributes memberOf, memberIs, and memberAs.<==½’CóþClD¼ºh»�𼓼€Cóþ€¼¦½,Bù$BPà½;>½¢¼%}¼%~¼¥€Dq#CÚ‚¼%|€CYiCZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ @½¾¾/ð¼ ¼“¼CE˜DrClC€¼ €CRYwC`CQ2½+ø½¾AðúCóþ¼“À»�h¼"ClC€Cóþ€¼¦BÔCK2½7÷þ½¾AлÀD@D`»ÀC�YiCZ½,Bá$½�½3>BmðCÚ‚¼%~»ŽÝ€¼¥|CÚ‚CÚƒ€¼¸CHBÕ$½�½;>B]ð¼ Cl@Db˜C÷Þ¼“¼€¼ €CÁYFCH¼¸Bh༽p½’BÌÀClD¼ »�ðCE”CóÿClG½,CZBPà½རBÄÀ¼%~CÚ‚Dq"€CZ„¼%~¼%|€CäYBÔ¼¦¼¨Ì¾ðBðD»À» D@D@C`¾ @¼®Ì¾/ðBèCÿ¼“¼CóþDr¼ºl¼ ¼“¹CòX×¼ ½+ø¼®ÌAðBðD¼“À¼ ¼"Db™Cóÿ¼“¹BÔCZ½7ø¼´ÌAÐBèDD@D`»À»ÀCäXš½,¼¦½�½àBmðBÌÀ¼%}¼%~¼¥€Dq#CÚ‚¼%|€CHCH½�½*àB]ðBÄÀCl@CóþC÷Þ»�g¼ ClGCÁXh¼¸¼¸¼½n½— BÌÂBmð¼ ¼“¼CE˜DrClC€¼ €CZBÔ½ܽ¯ BÄÂB]ðCÚƒCÚ‚CZ€»ŽÝ¼%~CÚƒ€C�XE¼¦½,¼¨ÎBðBAð»ÀD@D`»ÀC`¼®ÎA_ÀBèBAÐCóþClD¼ºh»�𼓼€Cóþ€CRX7¼ ¼®ÎBÔBðB¾ð¼ Cl@Db˜C÷Þ¼“¼€¼ €CZ½,¼´ÎBÈBèB¾/ðD@»À» D@CXE¼¦BÔ½ÜBðpB̽’¼%~CÚ‚Dq"€CZ„¼%~¼%|€CH¼¸½*ÜBäpBĽ¢Cóþ¼“À»�h¼"ClC€Cóþ€BãXh¼¸CH½— CB�Bmð½3?ÿ¼“¼CóþDr¼ºl¼ ¼“¹BÔ¼¦½¯ BùþB]ð½;@CÚ‚¼%~»ŽÝ€¼¥|CÚ‚CÚƒ€BÀXš½,CZCW4Að½»þD@D`»À»À¼ A_ÀCQ3þAн¼ClD¼ »�ðCE”CóÿClG+òdWD`D`¼@¼@D`» ¼@CÀ» » CÀCÀ» D`CÀ¼@+ÒdWC`BÔCQ4¾ð½¼ClBCóþC÷Ü»�g¼ ClG½,¼¦BÈCK4¾/ð½¼»À» D@D@+àd”BÔCZBðtBá ½’½3@CÚ‚€CÚ‚CZ�»ŽÝ¼%~CÚƒ€¼¸¼¸BätBÕ ½¢½;@¼“¾¼ ¼$Db™Cóþ¼“¹,dÆCHCHCB‘Bhà½3>½’CóþClD¼ºh»�𼓼€Cóþ€¼¦½,Bù"BPà½;>½¢¼%}€¼%~¼¥Dq#CÚ‚¼%|€,5déCZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ @½¾¾/ð¼ ¼“¼CE˜DrClC€¼ €,rd÷C`CQ2½+ø½¾AðúCóþ¼“À»�h¼"ClC€Cóþ€¼¦BÔCK2½7÷þ½¾AлÀD@D`»À,¯déCZ½,Bá"½�½3>BmðCÚ‚€¼%~»ŽÝ@¼¥|CÚ‚CÚƒ€¼¸CHBÕ"½�½;>B]ð¼ Cl@Db˜C÷Þ¼“¼€¼ €,ádÆCH¼¸Bhè¼½p½’BÌÀClB¼ »�ñCE”CóþClG½,CZBPè½རBÄÀ¼%}€CÚ‚Dq"ÀCZ„¼%~¼%|€-d”BÔ¼¦¼¨Ì¾ðBðD»À» D@D@C`¾ 0¼®Ì¾/ðBèCÿ¼“¾CóþDr¼ºl¼ ¼“¹-dW¼ ½+ú¼®ÌAðBðD¼“¾¼ ¼$Db™Cóþ¼“¹BÔCZ½7ú¼´ÌAÐBèDD@D`»À»À-d½,¼¦½Œ½àBmðBÌÀ¼%}€¼%~¼¥Dq#CÚ‚¼%|€CHCH½Œ½*àB]ðBÄÀClBCóþC÷Ü»�g¼ ClG,ác輸¼¸¼½o½— BÌÂBmð¼ ¼“¼CE˜DrClC€¼ €CZBÔ½Þ½¯ BÄÂB]ðCÚ‚€CÚ‚CZ�»ŽÝ¼%~CÚƒ€,¯cż¦½,¼¨ÎBðBAð»ÀD@D`»ÀC`¼®ÎA_ÀBèBAÐCóþClD¼ºh»�𼓼€Cóþ€,rc·¼ ¼®ÎBÔBðB¾ð¼ Cl@Db˜C÷Þ¼“¼€¼ €CZ½,¼´ÎBÈBèB¾/ðD@»À» D@,5cż¦BÔ½ÞBðpB̽’¼%}€CÚ‚Dq"ÀCZ„¼%~¼%|€CH¼¸½*ÞBäpBĽ¢Cóþ¼“À»�h¼"ClC€Cóþ€,c輸CH½—CB�Bmð½3?ÿ¼“¾CóþDr¼ºl¼ ¼“¹BÔ¼¦½¯BùþB]ð½;@CÚ‚€¼%~»ŽÝ@¼¥|CÚ‚CÚƒ€+àd½,CZCW4Að½»þD@D`»À»À¼ A_ÐCQ3þAн¼ClB¼ »�ñCE”CóþClGmember,RU÷D`D`¼@¼@D`» ¼@CÀ» » CÀCÀ» D`CÀ¼@,2U÷C`BÔCQ4¾ð½¼ClBCóþC÷Ü»�g¼ ClG½,¼¦BÈCK4¾/ð½¼»À» D@D@,@V4BÔCZBðtBá ½’½3@CÚ‚€CÚ‚CZ�»ŽÝ€¼%~CÚ‚€¼¸¼¸BätBÕ ½¢½;@¼“¾¼ ¼$Db™Cóþ¼“¹,cVfCHCHCB‘Bhà½3>½’CóþClD¼ºh»�𼓼€Cóþ€¼¦½,Bù"BPà½;>½¢¼%}€¼%~¼¥Dq"€CÚ‚¼%}€,•V‰CZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ @½¾¾/ð¼ ¼“¼CE˜DrClC€¼ €,ÒV—C`CQ2½+ø½¾AðúCóþ¼“À»�h¼"ClC€Cóþ€¼¦BÔCK2½7÷þ½¾AлÀD@D`»À-V‰CZ½,Bá"½�½3>BmðCÚ‚€¼%}»ŽÝ@¼¥€CÚ‚CÚ�€¼¸CHBÕ"½�½;>B]ð¼ Cl@Db˜C÷Þ¼“¼€¼ €-AVfCH¼¸Bhè¼½p½’BÌÀClB¼ »�ñCE”CóþClG½,CZBPè½རBÄÀ¼%}€CÚƒDq"ÀCZ€¼%~¼%~€-dV4BÔ¼¦¼¨Ì¾ðBðD»À» D@D@C`¾ 0¼®Ì¾/ðBèCÿ¼“¾CóþDr¼ºl¼ ¼“¹-rU÷¼ ½+ú¼®ÌAðBðD¼“¾¼ ¼$Db™Cóþ¼“¹BÔCZ½7ú¼´ÌAÐBèDD@D`»À»À-dUº½,¼¦½Œ½àBmðBÌÀ¼%}€¼%~¼¥Dq"€CÚ‚¼%}€CHCH½Œ½*àB]ðBÄÀClBCóþC÷Ü»�g¼ ClG-AUˆ¼¸¼¸¼½o½— BÌÂBmð¼ ¼“¼CE˜DrClC€¼ €CZBÔ½Þ½¯ BÄÂB]ðCÚ‚€CÚ‚CZ�»ŽÝ€¼%~CÚ‚€-Ue¼¦½,¼¨ÎBðBAð»ÀD@D`»ÀC`¼®ÎA_ÀBèBAÐCóþClD¼ºh»�𼓼€Cóþ€,ÒUW¼ ¼®ÎBÔBðB¾ð¼ Cl@Db˜C÷Þ¼“¼€¼ €CZ½,¼´ÎBÈBèB¾/ðD@»À» D@,•Ue¼¦BÔ½ÞBðpB̽’¼%}€CÚƒDq"ÀCZ€¼%~¼%~€CH¼¸½*ÞBäpBĽ¢Cóþ¼“À»�h¼"ClC€Cóþ€,cUˆ¼¸CH½—CB�Bmð½3?ÿ¼“¾CóþDr¼ºl¼ ¼“¹BÔ¼¦½¯BùþB]ð½;@CÚ‚€¼%}»ŽÝ@¼¥€CÚ‚CÚ�€,@Uº½,CZCW4Að½»þD@D`»À»À¼ A_ÐCQ3þAн¼ClB¼ »�ñCE”CóþClG*r]7D`D`¼@¼@D`» ¼@CÀ» » CÀCÀ» D`CÀ¼@*R]7C`BÔCQ4¾ð½¼ClBCóþC÷Ü»�g¼ ClG½,¼¦BÈCK4¾/ð½¼»À» D@D@*`]tBÔCZBðtBá ½’½3@CÚ‚€CÚ‚CZ�»ŽÝ¼%~CÚƒ€¼¸¼¸BätBÕ ½¢½;@¼“¾¼ ¼$Db™Cóþ¼“¹*ƒ]¦CHCHCB‘Bhà½3>½’CóþClD¼ºh»�𼓼€Cóþ€¼¦½,Bù"BPà½;>½¢¼%}€¼%~¼¥Dq#CÚ‚¼%|€*µ]ÉCZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ @½¾¾/ð¼ ¼“¼CE˜DrClC€¼ €*ò]×C`CQ2½+ø½¾AðúCóþ¼“À»�h¼"ClC€Cóþ€¼¦BÔCK2½7÷þ½¾AлÀD@D`»À+/]ÉCZ½,Bá"½�½3>BmðCÚ‚€¼%~»ŽÝ@¼¥|CÚ‚CÚƒ€¼¸CHBÕ"½�½;>B]ð¼ Cl@Db˜C÷Þ¼“¼€¼ €+a]¦CH¼¸Bhè¼½p½’BÌÀClB¼ »�ñCE”CóþClG½,CZBPè½རBÄÀ¼%}€CÚ‚Dq"ÀCZ„¼%~¼%|€+„]tBÔ¼¦¼¨Ì¾ðBðD»À» D@D@C`¾ 0¼®Ì¾/ðBèCÿ¼“¾CóþDr¼ºl¼ ¼“¹+’]7¼ ½+ú¼®ÌAðBðD¼“¾¼ ¼$Db™Cóþ¼“¹BÔCZ½7ú¼´ÌAÐBèDD@D`»À»À+„\ú½,¼¦½Œ½àBmðBÌÀ¼%}€¼%~¼¥Dq#CÚ‚¼%|€CHCH½Œ½*àB]ðBÄÀClBCóþC÷Ü»�g¼ ClG+a\ȼ¸¼¸¼½o½— BÌÂBmð¼ ¼“¼CE˜DrClC€¼ €CZBÔ½Þ½¯ BÄÂB]ðCÚ‚€CÚ‚CZ�»ŽÝ¼%~CÚƒ€+/\¥¼¦½,¼¨ÎBðBAð»ÀD@D`»ÀC`¼®ÎA_ÀBèBAÐCóþClD¼ºh»�𼓼€Cóþ€*ò\—¼ ¼®ÎBÔBðB¾ð¼ Cl@Db˜C÷Þ¼“¼€¼ €CZ½,¼´ÎBÈBèB¾/ðD@»À» D@*µ\¥¼¦BÔ½ÞBðpB̽’¼%}€CÚ‚Dq"ÀCZ„¼%~¼%|€CH¼¸½*ÞBäpBĽ¢Cóþ¼“À»�h¼"ClC€Cóþ€*ƒ\ȼ¸CH½—CB�Bmð½3?ÿ¼“¾CóþDr¼ºl¼ ¼“¹BÔ¼¦½¯BùþB]ð½;@CÚ‚€¼%~»ŽÝ@¼¥|CÚ‚CÚƒ€*`\ú½,CZCW4Að½»þD@D`»À»À¼ A_ÐCQ3þAн¼ClB¼ »�ñCE”CóþClG2`·D`D`¼@¼@D`» ¼@CÀ» » CÀCÀ» D`CÀ¼@`·C`BÔCQ4¾ð½¼ClBCóþC÷Ü»�g¼ ClG½,¼¦BÈCK4¾/ð½¼»À» D@D@ `ôBÔCZBðrBá ½’½3@CÚ‚€CÚ‚CZƒ»ŽÝ¼%} CÚƒ€¼¸¼¸BärBÕ ½¢½;@¼“¾¼ ¼$Db™Cóþ¼“¹Ca&CHCHCB’Bhà½3=½’CóþClD¼ºg»�𼓾Cóþ€¼¦½,Bù$BPà½;=½¢¼%}€¼%~¼¥}Dq#CÚ‚à¼%|€uaICZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ @½¾¾/ð¼ ¼“¼CE™DrClB¼ €²aWC`CQ2½+ø½¾AðúCóý€¼“À»�h€¼"ClBCóþ€¼¦BÔCK2½7÷þ½¾AлÀD@D`»ÀïaICZ½,Bá$½�½3=BmðCÚ‚€¼%~»ŽÜÀ¼¥|CÚ‚àCÚƒ€¼¸CHBÕ$½�½;=B]ð¼ €Cl@Db—€C÷Þ¼“¾¼ €!a&CH¼¸Bhä¼½p½’BÌÀClB¼ »�ñCE”CóþClG½,CZBPä½རBÄÀ¼%}€CÚ‚Dq#@CZ„¼%} ¼%|€D`ôBÔ¼¦¼¨Ì¾ðBðD»À» D@D@C`¾ 0¼®Ì¾/ðBèCÿ¼“¾CóþDr¼ºl¼ ¼“¹R`·¼ ½+ú¼®ÌAðBðD¼“¾¼ ¼$Db™Cóþ¼“¹BÔCZ½7ú¼´ÌAÐBèDD@D`»À»ÀD`z½,¼¦½޽àBmîBÌÀ¼%}€¼%~¼¥}Dq#CÚ‚à¼%|€CHCH½޽*àB]îBÄÀClBCóþC÷Ü»�g¼ ClG!`H¼¸¼¸¼½n½— BÌÃBmð¼ ¼“¼CE™DrClB¼ €CZBÔ½ܽ¯ BÄÃB]ðCÚ‚€CÚ‚CZƒ»ŽÝ¼%} CÚƒ€ï`%¼¦½,¼¨ÎBðBAð»ÀD@D`»ÀC`¼®ÎA_ÀBèBAÐCóþClD¼ºg»�𼓾Cóþ€²`¼ ¼®ÎBÔBðB¾ð¼ €Cl@Db—€C÷Þ¼“¾¼ €CZ½,¼´ÎBÈBèB¾/ðD@»À» D@u`%¼¦BÔ½ÜBðpBÌý’¼%}€CÚ‚Dq#@CZ„¼%} ¼%|€CH¼¸½*ÜBäpBÄý¢Cóý€¼“À»�h€¼"ClBCóþ€C`H¼¸CH½—CB�Bmî½3?ÿ¼“¾CóþDr¼ºl¼ ¼“¹BÔ¼¦½¯BùþB]î½;@CÚ‚€¼%~»ŽÜÀ¼¥|CÚ‚àCÚƒ€ `z½,CZCW4Að½»þD@D`»À»À¼ A_ÐCQ3þAн¼ClB¼ »�ñCE”CóþClG;r`7D`D`¼@¼@D`» ¼@CÀ» » CÀCÀ» D`CÀ¼@;R`7C`BÔCQ4¾ð½¼Cl@CóþC÷Þ»�g¼ ClG½,¼¦BÈCK4¾/ð½¼»À» D@D@;``tBÔCZBðpBá ½’½3@CÚƒCÚ‚CZ€»ŽÝ¼%~CÚƒ€¼¸¼¸BäpBÕ ½¢½;@¼“À¼ ¼"Db™Cóÿ¼“¹;ƒ`¦CHCHCB’Bhà½3>½’CóþClD¼ºh»�𼓼€Cóþ€¼¦½,Bù$BPà½;>½¢¼%}¼%~¼¥€Dq#CÚ‚¼%|€;µ`ÉCZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ @½¾¾/ð¼ ¼“¼CE˜DrClC€¼ €;ò`×C`CQ2½+ø½¾AðúCóþ¼“À»�h¼"ClC€Cóþ€¼¦BÔCK2½7÷þ½¾AлÀD@D`»ÀBmðCÚ‚¼%~»ŽÝ€¼¥|CÚ‚CÚƒ€¼¸CHBÕ$½�½;>B]ð¼ Cl@Db˜C÷Þ¼“¼€¼ €0¾‹0BüDCü,DM˜€»ªž¼ÓÀBü@+1a¼åº½a¯CÒ0^½)…`½1ÈO¾™†@Î`»À»ŸdÀCþ*Cÿþ@Î@¾&7›EI9ÉBë@hAàî€BÅs°½)_@BÞˆCýÌDRˆ€»¯a¼3@BÞ†+ ^ãAQžè»=n`AÒ¤5¿Ÿ’¿‘\À"ZAv¼»ž2@CújCÿòAv¾ûDÃ8 @õÌ€@ðn¥¾¼ôÀ¿1 CÿþD`›@¼ؼ¿1ÀaRelation+’dWº5Ð�AÞÆ@Ü€@ÿì¾!)켿-€CþD`£@Òp¼€EÉ¡:B^ÆBR¤€½8óp¾‚jAÞ¶Cÿÿ€¿®»¿…@» R@RD@&òdWº>Tˆ½«xÔBô€À½¥<BÆ`¼=®e¼¼€½8CÎ7DlŒBú̼¼Eu|ÄDtÛCýÏ8»™¤Ø¼¢!PC}/7Cÿþ@Ò€¼ð»Ÿ]¿-�Cÿü€#cÿ»1¬Ò¼2™nBñJн;.@½¯ú¾p ¼ ˆ¼•ÐCI©DqæCj/@¼ ˆDǪrDAV6Bÿœè½ŠX½œáð¿?€CüC€Búȼ1É»“t½4CüD!ßcš»+¶»³'²CKu¤½1˜½‘W¿*M€¼©€¼4x½°PDsDCˈ ¼«€DËÌZDnΗB÷“à½>ì ½» 𽡦PCôxCj0¼¶W»Ž¼•ÐÀCôx ¦bß»«j»#©,CZ?p½7!8BÌgx¼"Ö€¼(8¼²þDqÄC×Ǽ"Ô€DõBfDî{5BIs°Aùð Aß“ ½ èˆCçVCˈBO¸»Œ¼¼4w`CçT€aRelation€DiÃBÚ¼ü€/†^DGs˜¾ëlAà�¾%¦”¾17`?mÀCþí½=л´€»©BÂ7Cþ컹îBÉ[AÝ+°¾p”¾3( @W�¼.Aí DE€D\u¾ȼ-0]÷DöÁ9¼„æAcsÀ¼9𑽡ûðBo›àCøv¼©t»£P€»»JCVŒ€Cøw»�ZDP%¼>¼7€DhECíÂH¼>$€cgCÁÛ CíÂCâÈ@»—»¼=ÐCÁÛ€ Ñ`Í ^m¼²é¼ð»·º€DYñCú¼²è “`áCMCúDHE€»¦¼ñCM ^t ²Zt½ k¼�»¦d�DH­Cÿq½ t Ò^zB_•CÿpDY›p»·S¼�B_Œ ±Z UBþä¼þ»“"@CÌnCü Bþà sZo½CüDlÝÀ¼3’¼þ`½ dSubType R[÷’[÷D@»À» D@ R[·»ÀD@D`»À`~]>¼¨€¼/H½)DrÞCз ¼¨Þ`°CãW€CиBÖð»�"¼/H`CãX ]BÊZ¼*_@¼ ܼ�ÔDoÊCß$`¼*`Ú]lCÕ ÀCß$Cr,»�6¼ Û CÕ ÎZÇÎY¼€ý¼Þ¼ÍÀDg3Cï" ¼€ù–ZçCCï"Cç2@»˜Í¼Ý`C)cm `mCØ�@¼#–»Žh`¼¯$CÜjCØ�ûcA¼'oÀCÜjDq— CPܼ#–¼'p`nè^®CÝ“@¼(ª»�µ ¼•ðC×VpCÝ”Ü`@¼"lÀC×VDpJ`Cj¼(©�¼"lî^¦.\FCw;¼¼»�=€BßXCñECw=¶^ˆ¼ˆÅCñDDr€½ ¨¼»¼ˆÃ0\C�XãC`—¼ v»ŽòÀC\0CöŠC`˜ô\+¼Ÿi€CöŠDq `¼£Ð¼ u�¼Ÿhî+ïYptpôXtptptî<¢pîïQ%ô…ð"ô†ðFîïNðôð%spîéïKèu pð&îéïHàupîéïEØupîïBÐô† ô‡ uvupu suspîï@›upôs ptð6îï=“pô‰ðHsôŠ p îï;_ô“ð.up ô”ð"îï9*ôŒðdîï6öôîéï3îupð3îéï0æupðEîéï-Þu pô•ðEô–îöï+©ô†tð2ô‡îöï)uôð2îï&mpô¶ðXuîï$8pô¤ð3ô¥u îï"ô€ ô� pð?uîïÏpôupusîï Ýp3îïÕô„ð2ô…ð5îï ô–ð3ô—ð.îïlôðJîöïdupð"v · ñ>QZØî 2ïQ÷$øx û7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7î-òïc·øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7îRïW·î’ïcW øÿ ûøû#û#û#û#î5ÒïZøÿ ûøû#û#û#û#îDRïX7 û7û7û7î=2ïb× îIïa÷û7û7î3ïbw û7û7û7û7î+Rï_· û7û7û7û7û7î!’ïbw û7û7î?rï\W û7û7û7û7û7î2ï]÷ û7û7î,2ïX×øÿ ûøû#û#û#û#î2ïVw û7û7îïZ÷ îïZ÷î²ï_—î’ï_·î+²ï[÷î=ï_Wû#û#û#û#û#û#û#û#û#û#øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7îrïT û#û#û#û#î 2ï\û#û#û#û#û#û#û#û#vVà…Æ×tu¼CYPRESS DOCUMENTATION10DeclareSubType[superdomain, subdomain]DeclareRelation[name], and for each attribute:DeclareAttribute[name, relation, type, uniqueness].QueriesThe operation RelationSubset[relation, attribute value list] enumerates relationships in a relationsatisfying specified equality constraints on entity-valued attributes and/or range constraints ondatum-valued attributes. For example, RelationSubset might enumerate all of the relationshipsthat reference a particular entity in one attribute and have an integer in the range 23 to 52 inanother.The operation DomainSubset[domain, name range] enumerates entities in a domain. Theenumeration may optionally be sorted by entity name, or restricted to a subset of the entities with aname in a given range.More complex queries can be implemented in terms of DomainSubset and RelationSubset. Afuture implementation will provide a MultiRelationSubset operation to efficiently enumerate singlequeries spanning more than one relation. MultiRelationSubset operates upon a parsedrepresentation of the query language, and produces the same kind of enumeration asRelationSubset. See CSL-83-4 for more details. 2.6 Convenience operationsSome more convenient specialized operations are built upon the basic operations described in theprevious two sections. They implement what we call properties and translucent attributes. Althoughtheoretically speaking these operations add no power to the model, they permit a significantlydifferent perspective on the data access and so should be thought of as part of the model.PropertiesProperties allow the client to treat entities as if they, like relationships, had "attributes." Theyprovide the convenience of treating attributes of relationships that reference an entity as if theywere attributes (or properties) of the entity itself. The property operations are: 1.GetPList[entity, attribute1, attribute2]: Attribute1 and attribute2 must be from the samerelation. Returns the values of attribute1 for all relationships in the relation that referencethe entity via attribute2. Attribute2 may be omitted, in which case it is assumed to be theonly other entity-valued attribute of the relation.î³ï[žptôFpt îpî VïSÃuôð&î`ïP»pî VïM²uð3îjïI×sîjïEûpôš uð.ô›pð&îjïCÆôêôëðDîjïA’ô¼ð'u pô½ð)îjï?^ô¾ðJô¿îjï=)îjï9Môó uð!p ôôîjï7ô†ô‡ðKîjï4äôîjï05ô±ð4u pô²u pîjï.ôŽð%up ô�îjï+Ìô7ð(ô8upîjï)˜ôMðCôNîjï'cu pôð"îjï! rîjï1pô¦ðOô§îjïüô†ð4s ps ô‡ p îjïÈôÓðPôÔ îjï“ôéð9ôêð!îjï¸s îjïÜpôÂðeîjï §ô¼ð[ô½îjï sôs pð6îï—î`upô¤uï tï—u ï tï—uô¥ ï tï—puï tï—pî`ï†ô‘ð!uïùtï†pô’ð5î`ïuô‘uïètïuu ïètïupð,ô’ î`ïdôð3” M S=ç\¸CYPRESS DATA MODEL CONCEPTS112.GetP[entity, attribute1, attribute2]: this is identical to GetPList except exactly onerelationship must reference the entity via attribute2; otherwise an error is generated. GetPalways returns one value.3.SetPList[entity, attribute1, value list, attribute2]: Attribute1 and attribute2 must be fromthe same relation. Destroys any existing relationships whose attribute2 equals the entity,and creates new ones for each value in the list, with attribute1 equal to the value, andattribute2 equal to the entity. Attribute2 can be defaulted as in GetPList.4.SetP[entity, attribute1, value, attribute2]: this is identical to SetPList except it simplyadds a new relationship referencing the entity instead of destroying any existing ones(unless attribute1 is a key of its relation, in which case the existing one must be replaced).Thus the property operations allow information specified through relationships to be treated asproperties of the entity itself, in single operations. The property operations and the operationsdefined in earlier sections may be used interchangeably, as there is only one underlyingrepresentation of information: the relationships. As an example of the use of properties, considerthe following database:<==½’CóþClD¼ºh»�𼓼€Cóþ€¼¦½,Bù"BPà½;>½¢¼%}€¼%~¼¥Dq#CÚ‚¼%|€-•[)CZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ @½¾¾/ð¼ ¼“¼CE˜DrClC€¼ €-Ò[7C`CQ2½+ø½¾AðúCóþ¼“À»�h¼"ClC€Cóþ€¼¦BÔCK2½7÷þ½¾AлÀD@D`»À.[)CZ½,Bá"½�½3>BmðCÚ‚€¼%~»ŽÝ@¼¥|CÚ‚CÚƒ€¼¸CHBÕ"½�½;>B]ð¼ Cl@Db˜C÷Þ¼“¼€¼ €.A[CH¼¸Bhè¼½p½’BÌÀClB¼ »�ñCE”CóþClG½,CZBPè½རBÄÀ¼%}€CÚ‚Dq"ÀCZ„¼%~¼%|€.dZÔBÔ¼¦¼¨Ì¾ðBðD»À» D@D@C`¾ 0¼®Ì¾/ðBèCÿ¼“¾CóþDr¼ºl¼ ¼“¹.rZ—¼ ½+ú¼®ÌAðBðD¼“¾¼ ¼$Db™Cóþ¼“¹BÔCZ½7ú¼´ÌAÐBèDD@D`»À»À.dZZ½,¼¦½Œ½àBmðBÌÀ¼%}€¼%~¼¥Dq#CÚ‚¼%|€CHCH½Œ½*àB]ðBÄÀClBCóþC÷Ü»�g¼ ClG.AZ(¼¸¼¸¼½o½— BÌÂBmð¼ ¼“¼CE˜DrClC€¼ €CZBÔ½Þ½¯ BÄÂB]ðCÚ‚€CÚ‚CZ�»ŽÝ¼%~CÚƒ€.Z¼¦½,¼¨ÎBðBAð»ÀD@D`»ÀC`¼®ÎA_ÀBèBAÐCóþClD¼ºh»�𼓼€Cóþ€-ÒY÷¼ ¼®ÎBÔBðB¾ð¼ Cl@Db˜C÷Þ¼“¼€¼ €CZ½,¼´ÎBÈBèB¾/ðD@»À» D@-•Z¼¦BÔ½ÞBðpB̽’¼%}€CÚ‚Dq"ÀCZ„¼%~¼%|€CH¼¸½*ÞBäpBĽ¢Cóþ¼“À»�h¼"ClC€Cóþ€-cZ(¼¸CH½—CB�Bmð½3?ÿ¼“¾CóþDr¼ºl¼ ¼“¹BÔ¼¦½¯BùþB]ð½;@CÚ‚€¼%~»ŽÝ@¼¥|CÚ‚CÚƒ€-@ZZ½,CZCW4Að½»þD@D`»À»À¼ A_ÐCQ3þAн¼ClB¼ »�ñCE”CóþClGB`÷D`D`¼@¼@D`» ¼@CÀ» » CÀCÀ» D`CÀ¼@Aò`÷C`BÔCQ4¾ð½¼Cl@CóþC÷Þ»�g¼ ClG½,¼¦BÈCK4¾/ð½¼»À» D@D@Ba4BÔCZBðpBá ½’½3@CÚƒCÚ‚CZ€»ŽÝ¼%~CÚƒ€¼¸¼¸BäpBÕ ½¢½;@¼“À¼ ¼"Db™Cóÿ¼“¹B#afCHCHCB’Bhà½3>½’CóþClD¼ºh»�𼓼€Cóþ€¼¦½,Bù$BPà½;>½¢¼%}¼%~¼¥€Dq#CÚ‚¼%|€BUa‰CZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ @½¾¾/ð¼ ¼“¼CE˜DrClC€¼ €B’a—C`CQ2½+ø½¾AðúCóþ¼“À»�h¼"ClC€Cóþ€¼¦BÔCK2½7÷þ½¾AлÀD@D`»ÀBÏa‰CZ½,Bá$½�½3>BmðCÚ‚¼%~»ŽÝ€¼¥|CÚ‚CÚƒ€¼¸CHBÕ$½�½;>B]ð¼ Cl@Db˜C÷Þ¼“¼€¼ €CafCH¼¸Bh༽p½’BÌÀClD¼ »�ðCE”CóÿClG½,CZBPà½རBÄÀ¼%~CÚ‚Dq"€CZ„¼%~¼%|€C$a4BÔ¼¦¼¨Ì¾ðBðD»À» D@D@C`¾ @¼®Ì¾/ðBèCÿ¼“¼CóþDr¼ºl¼ ¼“¹C2`÷¼ ½+ø¼®ÌAðBðD¼“À¼ ¼"Db™Cóÿ¼“¹BÔCZ½7ø¼´ÌAÐBèDD@D`»À»ÀC$`º½,¼¦½�½àBmðBÌÀ¼%}¼%~¼¥€Dq#CÚ‚¼%|€CHCH½�½*àB]ðBÄÀCl@CóþC÷Þ»�g¼ ClGC`ˆ¼¸¼¸¼½n½— BÌÂBmð¼ ¼“¼CE˜DrClC€¼ €CZBÔ½ܽ¯ BÄÂB]ðCÚƒCÚ‚CZ€»ŽÝ¼%~CÚƒ€BÏ`e¼¦½,¼¨ÎBðBAð»ÀD@D`»ÀC`¼®ÎA_ÀBèBAÐCóþClD¼ºh»�𼓼€Cóþ€B’`W¼ ¼®ÎBÔBðB¾ð¼ Cl@Db˜C÷Þ¼“¼€¼ €CZ½,¼´ÎBÈBèB¾/ðD@»À» D@BU`e¼¦BÔ½ÜBðpB̽’¼%~CÚ‚Dq"€CZ„¼%~¼%|€CH¼¸½*ÜBäpBĽ¢Cóþ¼“À»�h¼"ClC€Cóþ€B#`ˆ¼¸CH½— CB�Bmð½3?ÿ¼“¼CóþDr¼ºl¼ ¼“¹BÔ¼¦½¯ BùþB]ð½;@CÚ‚¼%~»ŽÝ€¼¥|CÚ‚CÚƒ€B`º½,CZCW4Að½»þD@D`»À»À¼ A_ÀCQ3þAн¼ClD¼ »�ðCE”CóÿClGJohn Smith.[1EÏ•½Eu© BkDBBpBöÐÀ¼-. CñÿCtl½H»�e¼‹”Còº)+zº§RD@ªˆ»�:p¼ × CÇ¿`¼€¼3车lDs?C̼€3C^”EufdD÷æpCÇÀ¼0t½ŠˆÀCûˆCC¼6À»’˜¼¼õCûˆ€º? »9’üCÀ|¼+5Þ½¯ï ½´y�¼¼‹”Bê¸Dr›Ctl¼7'`Edî\Dm�"CP�м•Ìa½´±à@BÅ@CþâBÃ�¼t»˜e½@CJİBR„ ½˜ê¼€àCïDs€½�à¼æ@¼€ß8Ì\ÄCõdP»¿mˆ¿'~BÊ hAßS€¾# `C⫼.x»‘ƒ¼=„CÑŠCâ®»½ÀLCí~:¾—DBÏêpAó|€¾² ¼)çCÞ¶DrCDܼ!H@¼)è9F\PDnj,»¤ÁzAAÝÀCPZxBG¥È½­ŽˆCñ+¼ˆh»š‘¼Cw™Cñ.»‚ÐDB‡‘¾Š# Bü ¼BfB8¾<âð¼UCшDn}CÂ|¼.v¼R:.[·EE?´»6ÑGCZ”°Cè½±\@¼¶3¾Cú¼²ˆ»¥ô»·ÞCMt€Cúº³3Da¡ž½�“€Aê Bû™àBðH€¼ÔCwœDepCíò¼ˆe¼ÖCi[À¼)=°½6æpB\Zp¼Ѐ¼³¸CÀúDn¶CLGÀ¼ЀER ÝDfqÚCJmè¼§ƒ5¾Ž@½<ÊÆCÿrB_0¼g»šw½ ÐCÿs€´^Šº£}»‹å^Bø¢P¼‰±l½›4 BË68¼ y¼Ÿ\C\DqC`¥À¼ xEZ,ìDɆŒAú*AWÌAMO€½&)ÈCú/€CLD¼?»‘K¼³¸@Cú0€$�^üº! €E{îBÉW€½µ\`¼9Ú¨¼`l¼\€C[D]òDBú¼¤ÿ@¼[€Eéнº¯‚ô»²I,»&È´C[d°Cú˜Cë2¼: »•ð@¼%*CÅó Cë1€]be¼’ÅnBÓº@Äû ¿”ìP¿”n ?ϸÀ¼¼€CW¨D]@DDJ¼¨YÀ¼ºCmö¶½/ÚØ@Ä€P¿”p¿•à?ÐG@C÷£€¼¥»¢»½C[ÀC÷£€'byº–_DÌüN½0¼# ޽«¾ÀAè〼x@BÍ`DMÅ DU:½2¤¼xEtP»¹�½-£P¼-e6½�]@À5ÈCøC€¼¨X»¢ÿÀ»»¶CW¦@CøF¶cWº¥ÅPCîTþ½¢”€¼Ÿ™)¾@AJM¬¼ ApDB˜ D^6¾�T¼E_щ½,bB½µé`¼©Cº½º(`¿ŒÉ@Cþ‡À½2 »²:À»ªÆBÍ\CþˆÑc—º¸÷òB{ø´¾k½"íy@Ñ‘AüHµ¼¿€CýlD`Ù@퀼€EH{ùAûø²A|߀¾cÀ¾WKCÿô¾�»½g໡ÊAo¬Cÿòr]—r[—Ò[—Ò]—r]—’]—’[—»À» D@D@R]—D@D`»À»Àr[·Ò[·D@»À» D@r[w»ÀD@D`»À²[—²]—D@D`»À»Àò[—»À» D@D@Ò]wr]w»ÀD@D`»ÀÒ]·D@»À» D@professormembermemberOfmemberIsmemberAs-ˆZ º=ucº‚gý?s`½�¹À¼¨�ðCß °¼‡¼=«BOÀDsD€CÂV@¼ˆ€EÌÁ¼E]í»¦5 D|%¤CÁ=¼1TPCÝ€C×ÚCM_»ŽA¼(&CÝ)#V†¼ôN¼3ì¾&0@HTAP§à@åà¼�¼…¨BÒ¸DrêCzX¼�DA\ÈCÇ�¾##@lu@AT˜ @Øå CíxCÂV½°H»Œ»¼=ª@Cíw€(¡V;º¶ä\»0sÿ¼�ÀàCllpBÀD°A^™€¼º¼´JCÁ}Dn¡€CK·€¼»EQ'Ddr˜¼ª4èC`§8Aóý@Aî@CðpCzX½-H»�¼…¨Cðp&0U6º™ŠV»�h¼‰TPCÕíBÕ� ¿%€¼¤€½™�Cì&€DeìBfo¼¤EmDAC×â�¼¾š@CÉ-³At³AèàCúFCK¸¼>ƒ»‘]¼´H€CúG"×TŒº dG¼3ý}PCuFBxÓ ¾³“H¼€AØDDD]*¾'ú¼E` ø¼½âR¾‹Ce8ãAf�€A],ÀCÿ[€Bfp¼Ù€»š½™�Cÿ\ÑTwº"ßCÀÄBu_D`—쿟ؼ?'c¼ê@BØ<DO– DS‰€½'ļéEÛoˆ»€0½œ©€@Ö`BÅ;@C~;Cÿှ'ð»»ï»¢×AØCÿá€UwWwÒWwÒUwUwòUwòWwD@D`»À»À2Uw»À» D@D@WWÒWW»ÀD@D`»ÀW—D@»À» D@òWwòUw»À» D@D@²WwD@D`»À»ÀÒU—U—D@»À» D@ÒUW»ÀD@D`»À34ageageIsageOf$òS—&òS—D@»À» D@$òSW»ÀD@D`»À2r`—7r`—D@»À» D@2r`W»ÀD@D`»À$²_—)²_—D@»À» D@$²_W»ÀD@D`»Àî+ï[4ptpôXtptptî;òï[pîžïS6îöuôïR©tïS6u ïR©tïS6upupôupîöïQ%ôŽð+uïP˜tïQ%p ô�uîöïOpôîžïK8îöuô�ïJ«tïK8uïJ«tïK8uô‘ ïJ«ïK8puïJ«tïK8p îöïIô¯ð>uïHvtïIpô°îöïFòô»ô¼ð"uïFetïFòpîöïDáuïDTtïDárôpuïDTtïDápupîžïA(îöuô¼ï@›tïA(uï@›tïA(upupô½îöï?ôáð.ôâð(îöï<ãô”uïgôÁðFôÂîjï<3ôíð9ôîîjï9þôîjï6"ôËð\ôÌîjï3îô”ð)ô• upð%îjï1ºô«u pupô¬îjï/…ôŠô‹upð3îjï-QôÞðNôßîjï+ôíð)ôîð-îjï(èô¡ ô¢ðRîjï&³ôðNîjï"Øô� s ôž pð>îjï £ô�ð1upup ôŽîjïoîjï“uôpupôîjï^ô�ð$ôžðDîjï*ô‡ðIôˆspîjïNuôÅð&pôÆð%îjïô™ðVôšîjï åô˜ð$upð(ô™îjï ±ôðGîjïÕsîjïÍpôŒðKô�îjï™uôŠpô‹ð3îjïdô�ð0ô‚ð5 � M ?Q]ö#CYPRESS DATA MODEL CONCEPTS13one did. See the description of ChangeName in Section 3.4 for precise semantics in our implementation, however. 2.7 NormalizationA few comments on relational normalization are included here for users who must do their own dataschema design. Others may skip to the next section.A relation is normalized by breaking it into two or more relations of lower order (fewer attributes)to eliminate undesirable dependencies between the attributes. For example, one could define a"publication" relation with three attributes:Publication:PersonBookDateGeorgeBackgammon for Beginners1978JohnBackgammon for Beginners1978MaryHow to Play Chess1981MaryHow to Cheat at Chess1982This relation represents the fact that John and George wrote a book together entitled "Backgammonfor Beginners," published in 1978, and Mary wrote two books on the subject of chess, in 1981 and1982. Alternatively, we could encode the same information in two relations, an author relation and apublication-date relation:Author:PersonBookGeorgeBackgammon for BeginnersJohnBackgammon for BeginnersMaryHow to Play ChessMaryHow to Cheat at ChessPublication-date:BookDateBackgammon for Beginners1978How to Play Chess1981How to Cheat at Chess1982Although the second two relations may seem more verbose than the first one, they are actuallyrepresentationally better in some sense, because the publication dates of books are not representedredundantly. If one wants to change the publication date of "Backgrammon for Beginners" to 1979,for example, it need only be changed in one place in the publication-date relation but in two placesin the publication relation. If the date were changed in only one place in the publication relation,ÿî+ï[5ptpôXtptptî;òpîïSZô¯tð&ô°ðBpôîïMrîïIûpô„ô… s pð7îïGÆôð4îïD¾ôšðXô› îïBŠôÇð^îï@Uôð-î ïôšð"îï*ô€ð%ô�ð@îï'Îôî ï#òsî ‰ï!gþÿï!¾pî©ï!gþï!¾î •ï‰î©ô€î •ïUî©î •ï î©î •ïìî©î ïsî ‰ï…þïÜpîiï…þ×ïÜî •ï§îiî •ïsîiî •ï >îiîï 6ôÃôÄðJîïô£ðFô¤îïÍôŠðaîï™ô�ôŽðKîïdô›ð9ôœð,¼ · ¼>Q\OCYPRESS DOCUMENTATION14the database would become inconsistent. This kind of behavior is called an update anomaly. Thesecond two relations are said to be a normalized form (as it happens, third normal form) of the firstrelation, and thereby avoid this particular kind of update anomaly. Relational normalization is not strictly part of the Cypress data model. However the model'soperations (and the tools we will develop in the implementation) encourage what we will callfunctionally irreducible form, in which relations are of the smallest order that is naturally meaningful. A relation is in irreducible form if it is of the smallest order possible without introducing newartificial domain(s) not otherwise desired (all relations can be reduced to binary by introducingartificial domains). We will allow a slight weakening of irreducible form, functionally irreducibleform, which permits combining two or more irreducible relations only when their semantics aremutually dependent (and therefore all present or absent in our world representation). For example,a birthday relation between a person, month, day, and year can be combined instead of using threerelations. Another example would be an address relation between a person, street, city, and zip code.Combining an age and phone relation would not result in functionally irreducible form, however, astheir semantics are not mutually dependent. The functionally irreducible relations seen by the user are independent of the physical representationchosen by the system for efficiency, so we are concerned only with the logical data access. Note thatin addition to avoiding update anomalies, functionally irreducible form provides a one-to-onecorrespondence between the relationships in the database and the atomic facts they represent, acanonical form that is in some sense more natural than any other form. 2.8 SegmentsWe would like a mechanism to divide up large databases, to provide different perspectives or subsetsof the data to different users or application programs. In this section we discuss a mechanism toprovide this separation: segments. A segment is a set of entities and relationships that a databaseclient chooses to treat as one logical and physical part of a database.In introducing segments, we will slightly change the definition of an entity, previously defined to beuniquely determined by its domain and name. We will treat entities with the same name anddomain in different segments as different entities, although they may represent the same externalentity. The unique identifier of an internal entity is now the triple[segment, domain, name]. A consequence of this redefinition of entities is that relations and domains do not span segments,either. Application programs must maintain any desired correspondence between entities, domains,or relations with the same name in different segments. We will return to this later. In the nextsection, we will discuss a more powerful but more complex and expensive mechanism, augments, inwhich the database system itself maintains the correspondence.ÿî³ï]"ptôFpt îpîjïUGô¡ô¢ð:spîjïSôŠô‹ðHîjïPÞôðDîjïMÖôÛðHôÜîjïK¡ôÛðJôÜîjïImsô„pð8ô…ôîjïFeôÎôÏs pspð@îjïD0ôÌôÍðIîjïAüô±ðdîjï?ÇôÅðIôÆîjï=“ô�ðVô� îjï;^ô–spð0ô—ð'îjï9*ô€ð!ô�spð7îjï6öô‘ spspð<ô’ îjï4Áôð,îjï1¹ô„ô…ðVîjï/…ô‚ðaôƒîjï-PôñðRôò îjï+ôÇð(ôÈð7îjï(çôðGîjï"�r îjïˆpôƒð:ô„ð*îjïTô©ðbîjïôžôŸspðCîjïëôðGîjïãôŒô�ðNîjï®ôÈðLôÉ îjïzô´ðEôµîjïFôðFî`ï =îjï 5ô©ð6ôªð,îjïô›ðNôœîjïÌô«ð7ô¬rp îjï˜ô”ðSspîjïdôð=sÿ  M Ï?Q^< CYPRESS DATA MODEL CONCEPTS15We introduce three new operations to the data model in conjunction with segments:DeclareSegment[segment, file]: opens a segment with the given name, whose data isstored in the given file.GetSegments[] returns a list of all the segments which have been opened.SegmentOf[entity or relationship] returns the segment in which a given entity orrelationship exists. It may also be applied to relations or domains, since they are entities.With the addition of segments to the data model, we redefine the semantics of the basic accessoperations as follows:1.DeclareDomain and DeclareRelation take an additional argument, namely the segment inwhich the defined domain or relation will reside. The entity representing a domain orrelation now represents data in a particular segment.2.DeclareEntity and DeclareRelationship are unaffected: they implicitly refer to thesegment in which the respective domain or relation was defined. By associating a segment(and therefore a transaction and underlying file) with each relation or domain entityreturned to the database client, we conveniently obviate the need for additional argumentsto every invocation of the basic operations in the data model.3.DestroyEntity, DestroyRelationship, GetF, SetF, DomainOf, RelationOf, and Eq aresimilarly unaffected: they deal with entities and relationships in whatever segment they aredefined. Note that by our definition, entities in different segments are never Eq. Also notethat nothing in our definition makes a SetF across a segment boundary illegal (i.e.SetF[relationship, attribute, entity] where the relationship and entity are in differentsegments). Our current implementation requires that special procedures GetFR and SetFR be used onattributes that can cross segment boundaries, see Section 3.4.DomainSubset and RelationSubset are unchanged when applied to client-defined domainsor relations, i.e., they enumerate only in the segment in which the relation or domain wasdeclared. However an optional argument may be used when applied to one of the systemdomains or relations (e.g. the Domain domain), allowing enumeration over a specificsegment or all segments. RelationSubset's attribute-value-list arguments implictly indicate the appropriatesegment even for system relations, so a segment is not normally needed unless the entire relation isenumerated.Note that the data in a segment is stored in an underlying file physically independent from othersegments, perhaps on another machine. Introducing a file system into the conceptual data modelmay seem like an odd transgression at this point. From a practical point of view, however, weî+ï]"ptpôXtptptî;òpîïUGôðQîöïQkuôÉpð!ôÊîöïO6ôîöïK[u pð:îöïGuôð"p ôð#îöïEJô§ðTô¨ îï@›ô¿ôÀðMîï>gôîžï:‹îöu pô“upô”îöï8VôÁð6ôÂîöï6"ôð5îžï2Fîöu pôýupð.îöï0ô”ð)ô•ð0îöï-Ýôëð+ôìð*îöï+©ô›ôœðKîöï)tôð>îžï%™îöuôìð9ôí pupîöï#dôŠô‹ðBîöï!0ô�ô‚ð=up îöïûôùôúð@îöïÇuôçð&pð2îöï’ô¾ tðAô¿îöï^ôð<îžï‚pîöu pô‚u pôƒð5îöïNôœð?ô�îöïô—ô˜ð@îöï åôíðJôîîöï °ô—tðTîöï Ÿôå ôæðXîöï± îïÌpô¨ð?ô©ð"îï˜ô­ð_îïdô¼ð7ô½ð' f · Ï>Q^<CYPRESS DOCUMENTATION16believe it better to view certain problems at the level of file systems. This point of view allowssegments to be used for the following purposes:1.Physical independence: Different database applications typically define their data inseparate segments. As a result one application can continue to operate although the datafor another has been logically or physically damaged. One application can entirely rebuildits database without affecting another, or an application can continue to operate in adegraded mode missing data in an unavailable segment.2.Logical independence: Different database applications may have information which pertainsto the same external entity, e.g. a person with a particular social security number. Whenone application performs a DestroyEntity operation, however, we would like the entity todisappear only from that application's point of view. Information maintained by otherapplications should remain unchanged. 3.Protection: Clients can trust the protection provided by a file system more easily than acomplex logical protection mechanism provided by the database system. An even higherassurance of protection can be achieved by physical isolation of the segment at a particularcomputer site. A more complex logical protection mechanism would be desirable for somepurposes, but was deemed beyond the scope of Cypress.4.Performance: Data may be distributed to sites where they are most frequently used. Forexample, personal data may reside on a client's machine while publicly accessed data resideon a file server. If the file system provides replication, it can be used to improveperformance for commonly accessed data.Concurrency control is handled by the file system. As noted earlier, information about an external entity may be distributed over multiple segments.One or more database applications may cooperate in maintaining the illusion that entities, domains,and relations span segment boundaries. This illusion may be used in at least two ways:1.Private additions may be added to a public segment by adding entities or relationships in aprivate segment. The new relationships may reference entities in the public segment bycreating representative entities with the same name in the private segment. An examplewould be personal phone numbers and addresses added to a public database of phonenumbers and addresses: an application program would make the two segments appear tothe user as one database.2.If two applications use separate segments A and B, they may safely reference each other'sdata yet remain physically independent. One of the applications may destroy andreconstruct its segment if it uses the same unique names for its entities. If both applicationsî³ï\•ptôFpt îpîjïTºôµðcîjïR…ôð/îïN©î`sôpôð@î`ïLuô¥ô¦ðFî`ïJAô”ðJô•î`ïH ôàðIôá î`ïEØôð5îïAüî`sô‰pð"ôŠð$î`ï?Çô¥ðLô¦ î`ï=“ô­s pô®î`ï;_ôÊð&ôËð0î`ï9*ôð&îï5Nî`s pôªð1ô«î`ï3ô®ðFô¯î`ï0åô’ðOô“ î`ï.±ô� ô�ðIî`ï,}ôð5îï(¡î`s pôžðHôŸî`ï&lôŒð/ô�ð,î`ï$8ôëðEôìî`ï"ôð'îjïûð3îjïóô°ðNô±îjï¿ô–ð!ô—ðBîjïŠôðWîï¯î`ô�ð*ôŽð1î`ïzô¶ô·ðFî`ïFô´ðBôµî`ï ôÉð6ôÊî`ï Ýô¢ð4ô£î`ï¨ôîïÍî`ôŸð*spspô ð'î`ï˜ô ðPî`ïdô�ð@ô‚ÿ ¶ M \?Q]¯CYPRESS DATA MODEL CONCEPTS17have relationships referencing an entity e, and application A does a DestroyEntity operationon e, the entity and relationships referencing it disappear from application A's point ofview, but application B's representative entity and relationships remain.ÿî5ï ¨ptpôXtptptî6üpîïÍô‰ð)spôŠspîï˜ôÃspð-ôÄsp îïdôspð2ÿ­ZI3û Â:193. Model Level InterfaceWe now describe the Cedar interface to the implementation of the Cypress data model. We assumethat the reader is familiar with the basic conceptual data model, i.e., has read the previous section.Our presentation is therefore slightly different in this section: we describe the procedures in thedatabase interface in roughly the order that a client will want to use them in a program. We presenttypes and initialization, schema definition, the basic operations, and then queries. It should be emphasized that the interface we are about to describe is only one possibleimplementation of the abstract data model described in Section 2. For example, we have chosen toimplement a procedural interface called by Cedar programs, and to do type checking at run-time.3.1 TypesIn this subsection we describe the most important types in the interface. Less pervasive types aretreated at the point where they are first used.Entity: TYPE;Relship: TYPE;An Entity or Relship is not the actual database entity or relationship; they are handles for the actualdatabase objects. All accesses to database objects are performed by calling interface procedures withthe handles as parameters. Even comparisons of two entities for equality must be done in this way.The Entity and Relship handles are allocated from storage and automatically freed by the garbagecollector when no longer needed.Value: TYPE = REF ANY;ValueType: TYPE;Datatype: TYPE;StringType, IntType, BoolType, AnyDomainType: DataType;Storing Cedar data values in tuples presents several problems. First, since we would like to define asingle operation to store a new value into a specified attribute of a Relship (for instance), there mustbe a single type for all values that pass through this "store-value" procedure. This is the type Valueabove, represented as untyped REFs in Cedar. The DataTypes will be discussed in the next section.Entities, strings, integers, and booleans are the types of values the system currently recognizes andallows as attribute values. More precisely, these four types are Entity, ROPE, REF INT, and REFBOOL. In the case of an entity-valued attribute, an attribute's type may be AnyDomainType or aspecific domain may be specified. The latter is highly preferred, as AnyDomainType is a loopholein the type mechanism and limits the kinds of operations that can be performed automatically by theÿîG©ïfñpî ·ï^Ïqôî ·ïZópô‰ð&ôŠð9î ·ïX¿ô�ôžðFî ·ïVŠô±ð8ô²ð,î ·ïTVô‚ðFôƒî ·ïR"ôðUî ·ïNFô ô ð<î ·ïLô�ð>ô‘ð#î ·ïIÝôªð*ô«ð5î ·ïC†rôî ·ï?ªpô¥ðYô¦ î ·ï=vôð/î Èï9šsôX î Èï7f î ·ï3Špô…spspô†ð:tpî ·ï1Uôˆô‰ðTî ·ï/!ôŽð3ô�ð0î ·ï,íô spspð'ô¡ð#î ·ï*¸ôî Èï&ÜsôXî Èï$¨î Èï"sî Èï ?ð7î ·ïcpô‡ðLôˆî ·ï/ô‚ðFspôƒ î ·ïúô…ô†ð^sî ·ïÆpô‚ôƒspspð'î ·ï‘ô¥ðaô¦î ·ï]ô¡ðBspspspsî ·ï)pôšô›ð@s pî ·ï ôô—ðFs pô˜ î ·ï Àô‚ðc h · y?Q]’CYPRESS DOCUMENTATION20database system or associated tools. We currently provide no mechanism to store compound Cedardata structures such as arrays, lists, or records in a database; the database system's data structuringmechanisms should be used instead. Cypress query operations such as RelationSubset cannot becomposed upon data that appears as uninterpreted bits in the database.Note that a Value may be either an Entity or a Datum. Some operations accept any Value, e.g.SetF; others require an Entity, e.g. NameOf. Others may require an Entity from a particular client-defined domain, e.g. a Person. We might think of the hierarchy of built-in and client defined typesand instances of values like this:Value type hierarchyDatabase representative of typeValue (REF ANY)ValueType Datum DatumType ROPE StringType INT IntType BOOL BoolType Entity AnyDomainType person Entity Person domain employee Entity Employee domain ... other client-defined entities ... ... other client-defined domains ...As Cedar doesn't have a good mechanism for defining type hierarchies or new types for client-defined domains, most Cypress operations simply take a REF ANY or an Entity as argument,performing further type checking at run-time.3.2 Transactions and segmentsIn this section we describe the basic operations to start up a database application's interaction withCypress. The client application's data is stored in one or more segments, accessed undertransactions. The Cypress system currently runs on the same machine as the client program,however transactions are implemented by the underlying file system which may reside on anothermachine. Data in remote segments may therefore be concurrently accessed by other instances ofCypress on other client machines.A transaction is a sequence of read and write commands. The system supports the property that theentire sequence of commands executes atomically with respect to all other data retrieval and updates,that is, the transaction executes as if no other transactions were in progress at the same time.Because there may in fact be other transactions accessing the same data at the same time, it ispossible that two transactions may deadlock, in which case one of them must be aborted. So theî"ïfñpuôFpu î Mpî ·ï_ô”ð%ô•ð:î ·ï\áôŸðMô î ·ïZ­ô¶ðZô·î ·ïXxôðFî ·ïT�ô© spspspôªspî ·ïRhspôˆspspô‰spî ·ïP4ô…spô†ð6î ·ïMÿôð"îïH%þ YïH|rô€î%àïH%þ€ïH|rî+`ïH%þÐïH|ôîïFHsô€î%àîïDî%àô îïAßô€î%àô îï?ªô€î%àô îï=vô€î%àô îï;Aô€î%àôîï9 pô€ sî%àpôspîï6Ùô€sî%àpôspîï4¤ô€ð)î%àôð(î ·ï0ÈôÁôÂðAî ·ï.”ôÙð(ôÚspsp î ·ï,_ôð-î ·ï&Ürî ·ï#pô�ðfî ·ï Ìô ðSô î ·ï˜ôàôáðIî ·ïcô«ô¬ðFî ·ï/ô³ðKô´î ·ïúôð!î ·ïô†ô‡ðDî ·ïêô„ð%t pô…ð1î ·ï¶ôÔð*ôÕð6î ·ï �ôÄôÅðFî ·ï MôžðFôŸÿð M ?Q]<MODEL LEVEL INTERFACE21price paid for concurrent access is that programs be prepared to retry aborted transactions.The database system provides the capability of accessing a database stored on the same machine asthe database client, using the Pilot file system or on Alpine file servers. We currently permit onlyone transaction per segment per instance of the database software on a client machine. That is, datain remote segments may concurrently be updated by application programs under separatetransactions, but on the same machine transactions are used simply to make application transactionson their respective segments independent. This transaction-per-segment scheme is a majorsimplification of the Cypress package. In addition, as we shall see presently, nearly all Cypressprocedures can automatically infer the appropriate segment and transaction from the procedurearguments, avoiding the need to pass the transaction or segment for every database operation. Calls to Initialize, DeclareSegment, and OpenTransaction start the database session. Atransaction is either passed in by the client, or created by the database package (the latter is just aconvenience feature). The operation MarkTransaction below forms the end of a databasetransaction and the start of a new one. The operation AbortTransaction may be used to abort atransaction. Data in a database segment may not be read or updated until the segment andtransaction have been opened. Clients must decide when to tell the system that a transaction iscomplete (with CloseTransaction), and must be prepared to deal with unsolicited notification thatthe current transaction has been aborted because of system failure or lock conflict.The client's interaction with the database system begins with a call to Initialize:Initialize: PROC[ nCachePages: CARDINAL_ 256, nFreeTuples: CARDINAL_ 32, cacheFileName: ROPE_ NIL ];Initialize initializes the database system and sets various system parameters: nCachePages tells thesystem how many pages of database to keep in virtual memory on the client's machine,nFreeTuples specifies the size to use for the internal free list of Entity and Relship handles, andcacheFileName is the name of the disk file used for the cache backing store. Any or all of thesemay be omitted in the call; they will be given default values. Initialize should be called before anyother operation; the schema declaration operations generate the error DatabaseNotInitialized if thisis violated.Before database operations may be invoked, the client must open the segment(s) in which the dataare stored. The location of the segment is specified by using the full path name of the file, e.g."[MachineName]SubDirectory>SegmentName.segment". Each segment has a uniquename, the name of a Cedar ATOM which is used to refer to it in Cypress operation. The name ofthe Cedar ATOM is normally, though not necessarily, the same as that of the file in which it isî"SïfñpuôFpupuîG©pî ·ï_ôð\î ·ï[:ôšð^ô›î ·ïYôœð$ô�ðAî ·ïVÑô‡ðFôˆî ·ïT�ô'ðLô(î ·ïRhô”ðJô•î ·ïP4ôðQôî ·ïMÿôÀðDôÁî ·ïKËô×ðSôØ î ·ïI–ôÛð?ôÜôî ·ïE»ô!spspô"î ·ïC†ô�ð`ôžî ·ïARô ô spð"î ·ï?ô¥ð7spô¦î ·ï<éôÝð3ôÞð&î ·ï:´ô¸ð?ô¹ð!î ·ï8€ôŸsp ô ð4î ·ï6KôðTî ·ï2pðHs î Èï.”ôXî Èï,_î Èï*+î Èï'÷î ·ï$ pô‹ôŒð&s pî ·ï!æô ôðJî ·ï²s pô¥ô¦ð#spsp î ·ï}s pôšðKô›î ·ïIôŽð.ô�s pî ·ïô‘ðFspô’î ·ïàô î ·ïôœðNô�î ·ïÐô®ð8ô¯ð+î ·ï›ôðOôî ·ï gô•spð4ô– î ·ï 3ô¸ spð%ô¹ð, Œ · ì>Q^(CYPRESS DOCUMENTATION22stored, except the extension ".segment" and the prefix specifying the location of the file is omitted inthe ATOM. If the file is on the local file system, its name is preceded by "[Local]". For example,"[Local]Foo" refers to a segment file on the local disk named Foo.database;"[Alpine]Baz" refers to a segment named Baz.segment on the directory onthe Alpine server. It is generally a bad idea to access database segments other than through thedatabase interface. However, because segments are physically independent and contain no referencesto other files by file identifier or explicit addresses within files, the segment files may be movedfrom machine to machine or renamed without effect on their contents. If a segment file in a set ofsegments comprising a client database is deleted, the others may still be opened to produce adatabase missing only that segment's entities and relationships. A segment is defined by theoperation DeclareSegment:DeclareSegment: PROC[ filePath: ROPE, segment: Segment, number: INT_ 0, readOnly: BOOL_ FALSE, version: Version_ OldOnly, nBytesInitial, nBytesPerExtent: LONG CARDINAL_ 32768] RETURNS [Segment];Segment: TYPE = ATOM;Version: TYPE = {NewOnly, OldOnly, NewOrOld};The version parameter to DeclareSegment defaults to OldOnly to open an existing file. The signalIllegalFileName is generated if the directory or machine name is missing from fileName, andFileNotFound is generated at the time a transaction is opened on the segment if the file does notexist. If version NewOnly is passed, a new segment file will be created, erasing any existing one. Inthis case, a number assigned to the segment by the database administrator must also be passed. Thisnumber hack is necessitated by our current implementation of segments (it specifies the section of the database addressspace in which to map this segment). Please bear with us. Finally, the client program can passversion=NewOrOld to open a new or existing segment file; in this case the segment number mustalso be passed, of course.The other parameters to DeclareSegment specify properties of the segment. If readOnly=TRUE,then writes are not permitted on the segment; any attempt to invoke a procedure which modifiesdata will generate the error ProtectionViolation. nBytesInitial is the initial size to assign to thesegment, and nBytesPerExtent is the incremental increase in segment size used when more space isrequired for data in the file.For convenience, a call is available to return the list of segments that have been declared in thecurrent Cypress session: ÿî"ïfñpuôFpu î Mpî ·ï_ô€ð+ô�ð=î ·ï\áô•sp ô–ðNî ·ïZ­ôçð7ôèî ·ïXxô²ðZî ·ïVDô°ô±ðKî ·ïTô‚ðMôƒî ·ïQÛô´ ôµðVî ·ïO§ô�ð*ô�ð9î ·ïMrôÕð<ôÖð!î ·ïK>ôäð]î ·ïI ô s pî ÈïE-sôXî ÈïBùð3î Èï@Åð3î Èï>�ð7î Èï<\î Èï8€î Èï6Kð-î ·ï2ppôƒsp s p spô„î ·ï0;spôÚð.ôÛspî ·ï.s pô¢ð1ô£ð$î ·ï+ÒôƒspðMî ·ï)žô‡ spð6ôˆuî ·ï'�ô�ð"ôžðUî ·ï%|ôôpð&î ·ï#Gspô”ð9ô•î ·ï!ôî ·ï7ô˜s pô™ s pî ·ïô¬ð9ô­ð%î ·ïÎôµsps pô¶î ·ïšôŒ spô�ðAî ·ïeôî ·ï‰ô´ð.ôµð4î ·ïUô > M?QYýMODEL LEVEL INTERFACE23GetSegments: PROC RETURNS[LIST OF Segment ];A transaction is associated with a segment by using OpenTransaction: OpenTransaction: PROC[ segment: Segment, userName, password: ROPE_ NIL, useTrans: Transaction_ NIL ];If useTrans is NIL then OpenTransaction establishes a new connection and transaction with thecorresponding (local or remote) file system. Otherwise it uses the supplied transaction. The sametransaction may be associated with more than one segment by calling OpenTransaction with thesame useTrans argument for each. The given user name and password, or by default the logged inuser, will be used if a new connection must be established.Any database operations upon data in a segment before a transaction is opened or after a transactionabort will invoke the Aborted signal. The client should catch this signal on a transaction abort,block any further database operations and wait for completion of any existing ones. Then the clientmay re-open the aborted transaction by calling OpenTransaction. When the remote transaction issuccessfully re-opened, the client's database operations may resume.Note that operations on data in segments under different transactions are independent. Normallythere will be one transaction (and one or more segments) per database application program. A clientmay find what transaction has been associated with a particular segment by callingTransactionOf: PROC [segment: Segment] RETURNS [Transaction];Transactions may be manipulated by the following procedures:MarkTransaction: PROC[trans: Transaction];AbortTransaction: PROC [trans: Transaction];CloseTransaction: PROC [trans: Transaction];MarkTransaction commits the current database transaction, and immediately starts a new one. Uservariables which reference database entities or relationships are still valid.AbortTransaction aborts the current database transaction. The effect on the data in segmentsassociated with the segment is as if the transactions had never been started, the state is as it was justafter the OpenTransaction call or the most recent MarkTransaction call. Any attempts to usevariables referencing data fetched under the transaction will invoke the NullifiedArgument error. Aÿî"SïfñpuôFpupuîG©pî Èï_sôXð,î ·ï[:pôð4spî ÈïW^sôXî ÈïU*î ÈïRõî ÈïPÁî ·ïLåpô¶spwpspô·î ·ïJ±ô¡ð7ô¢ð,î ·ïH|ô°ô±ð5spî ·ïFHô‰spôŠðRî ·ïDôð;î ·ï@7ô„ðXô… î ·ï>ô´ôµspsp spð0î ·ï;Ïô‹ðdî ·ï9šôšð/spô›î ·ï7fôðDî ·ï3Šô«ðEô¬î ·ï1Uô€ð"ô�ðBî ·ï/!ôðRî Èï+EsôXð=î ·ï'ipôð<î Èï#ŽsôXð*î Èï²ð,î ÈïÖð,î ·ïúpô„ðLô…î ·ïÆôðMî ·ïêspôÒðMî ·ï¶ô‰ðWôŠî ·ï �ô½ spô¾spî ·ï MôŒð,ô�sp º · >Q]îCYPRESS DOCUMENTATION24call to OpenTransaction is necessary to do more database operations, and all user variablesreferencing database items created or retrieved under the corresponding transaction must be re-initialized (they may reference entities or relationships that no longer exist, and in any case they aremarked invalid by the database system).A simple client program using the database system might have the form, then:Initialize[];DeclareSegment["[Local]Test", $Test];OpenTransaction[$Test];...... database operations, including zero or more MarkTransaction calls ......CloseTransaction[TransactionOf[$Test]];3.3 Data schema definitionThe definition of the client's data schema is done through calls to procedures defined in this section.The data schema is represented in a database as entities and relationships, and although updates tothe schema must go through these procedures to check for illegal or inconsistent definitions, theschema can be read via the normal data operations described in the next section. Each domain,relation, etc., has an entity representative that is used in data operations which refer to that schemaitem. For example, we pass the domain entity when creating a new entity in the domain. The typesof schema items are:Domain, Relation, Attribute, Datatype, Index, IndexFactor: TYPE = Entity;Of course, since the schema items are entities, they must also belong to domains; there are pre-defined domains, which we call system domains, in the interface for each type of schema entity:DomainDomain, RelationDomain, AttributeDomain, DatatypeDomain, IndexDomain: Domain;There are also pre-defined system relations, which contain information about sub-domains, attributes,and indices. Since these are not required by the typical (application-specific) database client, wedefer the description of the system relations to Section 3.6. In general, any of the data schema may be extended or changed at any time; i.e., data operationsand data schema definition may be intermixed. However, there are a few specific orderingconstraints on schema definition we will note shortly. Also, the database system optimizes for betterperformance if the entire schema is defined before any data are entered. The interactive schema editingî"ïfñpuôFpu î Mpî ·ï_ôíspôîðDî ·ï\áôÌð5ôÍð*î ·ïZ­ôŽðOô�î ·ïXxôð'î ·ïT�ðLî­ïPÁs î­ïNŒð%î­ïLXî­ïJ#î­ïGïpðIî­ïE»sî­ïC†ð'î ·ï=/rî ·ï9Tpô†ô‡ðVî ·ï7ô�ð,ôžð-tpî ·ï4ëô»ð]ô¼î ·ï2¶ô´ ôµtpðLî ·ï0‚ô–ðgî ·ï.Môƒðbî ·ï,ôî Èï(=sôXðIî ·ï$apô¸ðEô¹î ·ï"-ô»ô¼t pð2î ÈïQsôXðSî ·ïupô‚ðYôƒ î ·ïAôµô¶ðGî ·ï ôð=uî ·ï1pô¥ô¦ðNî ·ïüôòðPôóî ·ï Èôˆð6ô‰ð0î ·ï “ô™ðJuôšÔ M L?Q\¿ßMODEL LEVEL INTERFACE25tool described in the database tools documentation allows the schema to be changed regardless of ordering constraints andexisting data, by recreating schema items and copying data invisibly to the user when necessary.All the data schema definition operations take a Version parameter which specifies whether theschema element is a new or existing one. The version defaults to allowing either (NewOrOld): i.e.,the existing entity is returned if it exists, otherwise it is created. This feature avoids separateapplication code for creating the database schema the first time the application program is run. DeclareDomain: PROC [name: ROPE, segment: Segment, version: Version_ NewOrOld, estRelations: INT_ 5] RETURNS [d: Domain];DeclareSubType: PROC[sub, super: Domain];DeclareDomain defines a domain with the given name in the given segment and returns itsrepresentative entity. If the domain already exists and version=NewOnly, the signal AlreadyExistsis generated. If the domain does not already exist and version=OldOnly, then NIL is returned.The parameter estRelations is used to estimate the largest number of relations in which entities ofthis domain are expected to participate.The client may define one domain to be a subtype of another by calling DeclareSubType. Thispermits entities of the subdomain to participate in any relations in which entities of thesuperdomains may participate. All client DeclareSubType calls should be done before declaringrelations on the superdomains (to allow some optimizations). The error MismatchedSegment isgenerated if the sub-domain and super-domain are not in the same segment.DeclareRelation: PROC [ name: ROPE, segment: Segment, version: Version_ NewOrOld] RETURNS [r: Relation];DeclareAttribute: PROC [ r: Relation, name: ROPE, type: ValueType_ NIL, uniqueness: Uniqueness _ None, length: INT_ 0, link: {Linked, Unlinked, Colocated, Remote}_ yes, version: Version_ NewOrOld] RETURNS[a: Attribute];Uniqueness: TYPE = {NonKey, Key, KeyPart, OptionalKey};DeclareRelation defines a new or existing relation with the given name in the given segment andreturns its representative entity. If the relation already exists and version=NewOnly, the signalAlreadyExists is generated. If the relation does not already exist and version=OldOnly, then NILis returned.ÿî"SïfñpuôFpupuîG©pî ·ï_9uô†ð2ô‡ðGî ·ï](ôð`î ·ïYLpôÃð.ôÄspð&î ·ïWô‹ôŒðMî ·ïTãôÓôÔðQî ·ïR¯ôÆôÇðPôî ÈïNÓsôXð2î ÈïLžðHî ÈïHÃð)î ·ïDç pôÕôÖsp spî ·ïB²ô’up ô“ð0s î ·ï@~pôµð7ô¶spspsp î ·ï>Jô— s pô˜ðIî ·ï<ôð(î ·ï89ô©ð>ôªs pî ·ï6ôôðJî ·ï3Ðô²ô³s pð&î ·ï1œôïup x spî ·ï/hôðIî Èï+ŒsôXî Èï)WðRî Èï%|î Èï#Gð0î Èï!ð1î ÈïÞðOî Èïªî ÈïÎð7î ·ïòpô’ô“ð"sp spî ·ï¾ôÄðWôÅ î ·ï‰s pô—ð;spspô˜sî ·ïUpô  & ·@QYýýCYPRESS DOCUMENTATION26DeclareAttribute is called once for each attribute of the relation, to define their names, types, anduniqueness. If version=NewOrOld and the attribute already exists, Cypress checks that the newtype, uniqueness, etc. match the existing attribute. The error MismatchedExistingAttribute isgenerated if there is a discrepancy. The attribute name need only be unique in the context of itsrelation, not over all attributes. Note this is the only exception to the data model's rule that names be unique in adomain. Also note that we could dispense with DeclareAttribute altogether by passing a list into the DeclareRelationoperation; we define a separate procedure for programming convenience.The attribute type should be a ValueType, i.e. it may be one of the pre-defined types (IntType,StringType, BoolType, AnyDomainType) or the entity representative for a domain. For pre-defined types, the actual values assigned to attributes of the relationship instances of the relationmust have the corresponding type: REF INT, ROPE, REF BOOL, or Entity. If the attribute has adomain as type, the attribute values in relationships must be entities of that domain or some sub-domain thereof. The type is permitted to be one of the pre-defined system domains such as theDomainDomain, thereby allowing client-defined extensions to the data schema (for example, acomment for each domain describing its purpose). The attribute uniqueness indicates whether the attribute is a key of the relation. If its uniquenessis NonKey, then the attribute is not a key of the relation. If its uniqueness is OptionalKey, then thesystem will ensure that no two relationships in r have the same value for this attribute (if a value hasbeen assigned). The error NonUniqueKeyValue is generated if a non-unique key value results froma call to the SetP, SetF, SetFS, or CreateRelship procedures we define later. Key acts the same asOptionalKey, except that in addition to requiring that no two relationships in r have the same valuefor the attribute, it requires that every entity in the domain referenced by this attribute must bereferenced by a relationship in the relation: the relationships in the relation and the entities in thedomain are in one-to-one correspondence. Finally, if an attribute's uniqueness is KeyPart, then thesystem will ensure that no two relationships in r have the same value for all key attributes of r,though two may have the same values for some subset of them.The length and link arguments to DeclareAttribute have no functional effect on the attribute, butare hints to the database system implementation. For StringType fields, length characters will beallocated for the string within the space allocated for a relationship in the database. There is noupper limit on the size of a string-valued attribute; if it is longer than length, it will be storedseparately from the relationship with no visible effect except for the performance of databaseapplications. The link field is used only for entity-valued fields; it suggests whether the databasesystem should link together relationships which reference an entity in this attribute. In addition, itcan suggest that the relationships referencing an entity in this attribute be physically co-located aswell as linked. Again, its logical effect is only upon performance, not upon the legal operations.ÿî"ïfñpuôFpu î Mpî ·ï_spô�ðUî ·ï\áô®spô¯ð$î ·ïZ­ôâð5ôã spî ·ïXxô£ô¤ðPî ·ïVDô‚ð$uôƒðNî ·ïT3ôªðUô«î ·ïR"ôðFî ·ïNFpô¯ sp spô°ð&sî ·ïLôØð#pôÙî ·ïIÝô¶ð>ô·ð'î ·ïG¨ô€ð#xô�pxpî ·ïEtô¥ô¦ðEî ·ïC@ôªô«spðEî ·ïA s pôÝðMôÞî ·ï>×ôð1î ·ï:ûô� s p ôŽðDî ·ï8Æô‚spð3ôƒs p î ·ï6’ô‚ð0spôƒî ·ï4^ô‡spôˆî ·ï2)ô‚ sps pôƒspî ·ï/õs pôŠðDspô‹î ·ï-Àô¶ðLô·î ·ï+Œô•ð2ô–ð6î ·ï)Wô�ð(ô‘ð+sp î ·ï'#ô´ ôµð%sptpspî ·ï$îôð<î ·ï!ôžspsp spð0î ·ïÞô¢ð6s pspî ·ïªô®ðXô¯ î ·ïuô¼ ô½ð=spî ·ïAôâôãðKî ·ï ô­spð9ô®î ·ïØôšô›ðUî ·ï¤ô©ôªðRî ·ïoô°ðMô± : M(>QXãPMODEL LEVEL INTERFACE27DestroyRelation: PROC[r: Relation];DestroyDomain: PROC[d: Domain];DestroySubType: PROC[sub, super: Domain];Relations, domains, and subdomain relationships may be destroyed by calls to the above procedures.Destroying a relation destroys all of it relationships. Destroying a domain destroys all of its entitiesand also any relationships which reference those entities. Destroying a sub-domain relationship hasno effect on existing domains or their entities; it simply makes entities of domain sub no longereligible to participate in the relations in which entities of domain super can participate. Existingrelationships violating the new type structure are allowed to remain. Existing relations and domains may only bemodified by destroying them with the procedures above, with one exception: the operationChangeName (described in Section 3.4) may be used to change the name of a relation or domain.DeclareIndex: PROC [ relation: Relation, indexedAttributes: AttributeList, version: Version];DeclareIndex has no logical effect on the database; it is a performance hint, telling the databasesystem to create a B-Tree index on the given relation for the given indexedAttributes. The indexwill be used to process queries more efficiently. Each index key consists of the concatenated valuesof the indexedAttributes in the relationship the index key references. For entity-valued attributes,the value used in the key is the string name of the entity. The version parameter may be used as inother schema definition procedures, to indicate a new or existing index. If any of the attributes arenot attributes of the given relation then the signal IllegalIndex is generated.The optimal use of indices, links, and colocation, as defined by DeclareIndex and DeclareAttribute,is complex. It may be necessary to do some space and time analysis of a database application tochoose the best trade-off, and a better trade-off may later be found as a result of unanticipatedaccess patterns. Note, however, that a database may be rebuilt with different links, colocation, orindices, and thanks to the data independence our interface provides, existing programs will continueto work without change.If a relation is expected to be very small (less than 100 relationships), then it might reasonably bedefined with neither links nor indices on its attributes. In the typical case of a larger relation, oneshould examine the typical access paths: links are most appropriate if relationships that pertain toparticular entities are involved, indices are more useful if sorting or range queries are desired.B-tree indices are always maintained for domains; that is, an index contains entries for all of theentities in a domain, keyed by their name, so that sorting or lookup by entity name is quick. Stringcomparisons are performed in the usual lexicographic fashion.î"SïfñpuôFpupuîG©pî Èï_sôXð#î Èï[:î ÈïW^ð)î ·ïS‚pô‰ðLôŠî ·ïQNô�ðEô‘ð$î ·ïOô• ô–ðXî ·ïLåô°ðTspô±î ·ïJ±ô¼ðEspuô½î ·ïH|ô‚ðEpð)ôƒî ·ïFHôòðOôó î ·ïDs pô—ð1ô˜ð"î Èï@7sôXî Èï>ðJî ·ï:' pô¯ð-ô°ð)î ·ï7óô—ð-spô˜sp î ·ï5¾ô�ðQô�î ·ï3Šô™spð"ôšð+î ·ï1Uô‚ðAspî ·ï/!ô�ðHô‘î ·ï,íôð5s p î ·ï)ô„ðAs pô…spî ·ï&Üô¨ðHô©î ·ï$¨ô½ðPô¾î ·ï"sô¨ð0ô©ð4î ·ï ?ô� ô�ðXî ·ï ôî ·ï/ô¡ô¢ðUî ·ïúô™ð:ôšð.î ·ïÆôŸðUô î ·ï‘ôÕðYôÖî ·ï¶ô°ð_ô±î ·ï �ô‰ðGôŠî ·ï Môð= > · ?Q]CYPRESS DOCUMENTATION28DeclareProperty: PROC [ relationName: ROPE, of: Domain, type: ValueType, uniqueness: Uniqueness_ None, version: Version_ NewOrOld] RETURNS [property: Attribute];DeclareProperty provides a shorthand for definition of a binary relation between entities of thedomain "of" and values of the specified type. The definitions of type and uniqueness are the sameas for DeclareAttribute. A new relation relationName is created, and its attributes are given thenames "of" and "is". The "is" attribute is returned, so that it can be used to represent the propertyin GetP and SetP defined in the next section.3.4 Basic operations on entities and relationshipsIn this section, we describe the basic operations on entities and relationships; we defer the operationson domains and relations to the next section.A number of error conditions are common to all of the procedures in this section. Since values arerepresented as REF ANYs, all type checking must currently be done at run-time. The procedures inthis section indicate illegal arguments by generating the errors IllegalAttribute, IllegalDomain,IllegalRelation, IllegalValue, IllegalEntity, and IllegalRelship, according to the type of argumentexpected. The error NILArgument is generated if NIL is passed to any procedure that cannot acceptNIL for that argument. The error NullifiedArgument is generated if an entity or relationship ispassed in after it has been deleted or rendered invalid by transaction abort or close. DeclareEntity: PROC[ d: Domain, name: ROPE_ NIL, version: Version_ NewOrOld] RETURNS [e: Entity];DeclareEntity finds or creates an entity in domain d with the given name. The name may beomitted if desired, in which case an entity with a unique name is automatically created. If versionis OldOnly and an entity with the given name does not exist, NIL is returned. If version is NewOnlyand an entity with the given name already exists, the signal NonUniqueEntityName is generated.DeclareRelship: PROC [ r: Relation, avl: AttributeValueList_ NIL, version: Version_ NewOrOld] RETURNS [Relship];DeclareRelship finds or creates a relship in r with the given attribute values. If version isNewOnly, a new relship with the given attribute values is generated. If version is OldOnly, therelship in r with the given attribute values is returned if it exists, otherwise NIL is returned. Ifî"ïfñpuôFpu î Mpî Èï_sôXî Èï\áð2î ÈïZ­ð;î ÈïXxî ·ïT�pô»ô¼ðHî ·ïRhôŠspspô‹ð5î ·ïP4ô§sps pô¨î ·ïMÿô‰ ôŠðXî ·ïKËôspspî ·ïEtrð2î ·ïA˜pô�ðYô‚î ·ï?dôð-î ·ï;ˆôŽð1ô�ð2î ·ï9Tô† s pð6ô‡î ·ï7ôêð5ôë sî ·ï4ëô·ð,pô¸s pð#î ·ï2¶ô† ô‡s pspð.î ·ï0‚spôÊspð*ôËî ·ï.MôðWî Èï*rsôXî Èï(=ð9î Èï& î ·ï"- pôÀð&spôÁî ·ïøô”ðAô•sî ·ïÄpô€spð3spô�sî ·ï�pô±ð=sp î Èï´sôXî ÈïðHî ÈïKî ·ïo pôßspôàð&spî ·ï ;spô°ô±ð3spspî ·ï ô¹ spôºðEspÿ R M ¿>Q]LMODEL LEVEL INTERFACE29version is NewOrOld, the relship with the given attribute values is returned if it exists, otherwiseone is created. If the creation of a new relship violates the key constraints specified byDeclareAttribute, the signal NonUniqueAttributeValue is generated.DestroyEntity: PROC[e: Entity];DestroyEntity removes e from its domain, destroys all relationships referencing it, and destroys theentity representative itself. Any client variables that reference the entity automatically take on thenull value (Null[e] returns TRUE), and cause error NullifiedArgument if passed to database systemprocedures. After an entity is destroyed, its old name may be re-used in creating a new one.DestroyRelship: PROC[t: Relship];DestroyRelship removes t from its relation, and destroys it. Any client variables that reference therelationship automatically take on the null value, and will cause error NullifiedArgument ifsubsequently passed to database system procedures.SetF: PROC[t: Relship, a: Attribute, v: Value];SetF assigns the value v to attribute a of relationship t. If the value is not of the same type as theattribute (or a subtype thereof if the attribute is entity-valued), then the errorMismatchedAttributeValueType is generated. If a is not an attribute of t's relation, IllegalAttributeis generated.GetF: PROC[t: Relship, a: Attribute] RETURNS [Value];GetF retrieves the value of attribute a of relationship t. If a is not an attribute of t's relation, errorIllegalAttribute is generated. The client should use the V2x routines described in the next section tocoerce the value into the expected type.SetFS: PROC [t: Relship, a: Attribute, v: ROPE];GetFS: PROC[t: Relship, a: Attribute] RETURNS [ROPE];GetFS and SetFS provide a convenient veneer on top of GetF and SetF that provide the illusionthat all relation attributes are string-valued. The effect is something like the Relational data model,and is useful for applications such as a relation displayer and editor that deal only with strings. Thesemantics of GetFS and SetFS depend upon the actual type of the value v of attribute a:ÿî"SïfñpuôFpupuîG©pî ·ï_spô¨sp ô©ðDî ·ï\áôô ðKî ·ïZ­spô sp î ÈïVÑsôXî ·ïRõ pô˜spð,ô™ð!î ·ïPÁô¤ðFô¥ð!î ·ïNŒô™ spspsp ôšî ·ïLXôÌð*ôÍð3î ÈïH|sôXð!î ·ïD  pô’spô“ðHî ·ïBlôð&ôð!spî ·ï@7ôð2î Èï<\sôXð/î ·ï8€pô�sp spô‘spð.î ·ï6Kô¶ðCô·î ·ï4spôƒspô„sp sî ·ï1ãpô î Èï.sôXð5î ·ï*+pôŒ ô�spspspspî ·ï'÷spôƒð-ô„ð*î ·ï%Âôð(î Èï!æsôXð0î Èï²ð5î ·ïÖpôŸspô spspî ·ï¢ô’ðaô“î ·ïmô‡ôˆðJî ·ï9ôí ôîspspð*sp sH ·ò>QS CYPRESS DOCUMENTATION30typeGetFS returnsSetFS assigns attribute to beStringTypethe string vthe string vIntTypev converted to decimal stringthe string converted to decimal integerBoolType"TRUE" or "FALSE"true if "TRUE", false if "FALSE"a domain Dthe name of the ref'd entitythe entity with name v(or null string if v is NIL)(or NIL if v is null string)AnyDomainTypesame, but includes domain:the entity with the given domain and name:(or NIL if v is null string)The same signals generated by GetF and SetF, such as IllegalAttribute, can also be generated bythese procedures. The string NIL represents the undefined value. The signal NotFound is generatedin the last case above if no entity with the given name is found.NameOf: PROC [e: Entity] RETURNS [s: ROPE];ChangeName: PROC [e: Entity, s: ROPE];NameOf and ChangeName retrieve or change the name of an entity, respectively. They generatethe signal IllegalEntity if e is not an entity.ChangeName should be used with caution. It is not quite equivalent to destroying and re-creating an entity with the newname but the same existing relationships referencing it. ChangeName is considerably faster than that, and furthermoreentity-valued variables which reference the entity are not nullified by ChangeName, though they would be byDestroyEntity. These features should be a help, not a hindrance. However, changing an entity name may invalidatereferences to the entity from outside the segment, e.g. in another segment or in some application-maintained file such as alog of updates. DomainOf: PROC[e: Entity] RETURNS [Domain];RelationOf: PROC[t: Relship] RETURNS [Relation];DomainOf and RelationOf can be used to find the entity representative of an entity's domain or arelationship's relation, respectively. The signal IllegalEntity is generated if e is not an entity. Thesignal IllegalRelship is generated if r is not a relationship.SegmentOf: PROC[e: Entity] RETURNS [Segment];SegmentOf returns the segment in which an entity is stored. It can be applied to domain, relation,or attribute entities.Eq: PROC [e1: Entity, e2: Entity] RETURNS [BOOL];Eq returns TRUE iff the same database entity is referenced by e1 and e2. This is not equivalent tothe Cedar expression "e1 = e2", which computes Cedar REF equality. If e1 and e2 are inÿî"ïfñpuôFpu î Mpî Èï^¿þ.ï_vî`ï^¿þ ï_ôX î-€ï^¿þÊï_î Èï\ás î` î-€ î ÈïZ­î`î-€ð'î ÈïXxî`î-€î ÈïVD î`î-€î`ïTî-€î ÈïQÛ î`î-€ð)î`ïO§î-€î ·ïKËpôªspsp sp ô«î ·ïI–ô‚ôƒspð-sp î ·ïGbôðAî ÈïC†sôXð+î ÈïARð&î ·ï=vpô s pô¡ð(î ·ï;Aô s pspî ·ï7‰uô„ðtô…î ·ï5›ô¡ðGô¢ð/î ·ï3­ôòð7yuð+ôóî ·ï1¿ôªðBô«ð0î ·ï/Ñôƒð2ô„ðIî ·ï-äôî Èï*+sôXð+î Èï'÷ð0î ·ï$pô™s pð.ôšî ·ï!æô�ð3s pôžð)î ·ï²ôspspî ÈïÖsôXð-î ·ïúpô�ðEôŽî ·ïÆôî ÈïêsôXð1î ·ï ;ôŠpspð/spspô‹tp î ·ï ôÍôÎspð*spsp  M ¿>Q]L+MODEL LEVEL INTERFACE31different segments, Eq returns true iff they have the same name and their domains have the samename.Null: PROC [x: EntityOrRelship] RETURNS [BOOL];Null returns TRUE iff its argument has been destroyed, is NIL, or has been invalidated by abortionof the transaction under which it was created.GetP: PROC [e: Entity, aIs: Attribute, aOf: Attribute_ NIL] RETURNS [Value];SetP: PROC [e: Entity, aIs: Attribute, v: Value, aOf: Attribute_ NIL] RETURNS[Relship];GetP and SetP are convenience routines for a common use of relationships, to represent"properties" of entities. Properties allow the client to think of values stored in relationshipsreferencing an entity as if they are directly accessible fields (or "properties") of the entity itself. Seethe figure on page 15 illustrating properties. GetP finds a relationship whose from attribute is equal to e,and returns that relationship's to attribute. The from attribute may be defaulted if the relation isbinary, it is assumed to be the other attribute of to's relation. If it is not binary, the current implementationwill find the "first" other attribute, where "first" is defined by the order of the original calls calls to DeclareAttribute.SetP defaults the from attribute similarly to GetP, but operates differently depending on whetherfrom is a key of the relation. Whether it is a key or not, any previous relationship that referenced ein the from attribute is automatically deleted. In either case, a new relationship is created whosefrom attribute is e and whose to attribute is v. SetP returns the relationship it creates for theconvenience of the client. GetP and SetP can generate the same errors as SetF and GetF, e.g. if eis not an entity or to is not an attribute. In addition, GetP and SetP can generate the errorIllegalProperty if to and from are from different relations. GetP generates the errorMismatchedPropertyCardinality if more than one relationship references e in the from attribute; ifno such relationships exist, it returns a null value of the type of the to attribute. SetP allows anynumber of existing relationships referencing e; it simply adds another one (when from is a key, ofcourse, there will always be one relationship). GetPList: PROC [e: Entity, to: Attribute, from: Attribute_ NIL] RETURNS [LIST OF Value];SetPList: PROC [e: Entity, to: Attribute, vl: LIST OF Value, from: Attribute_ NIL];GetPList and SetPList are similar to GetP and SetP, but they assume that any number ofrelationships may reference the entity e with their from attribute. They generate the signalMismatchedPropertyCardinality if this is not true, i.e. the from attribute is a key. GetPList returnsthe list of values of the to attributes of the relationships that reference e with their from attribute.Cedar has LISP-like list manipulation facilities. SetPList destroys any existing relationships that reference ewith their from attribute, and creates Length[vl] new ones, whose from attributes reference e andÿî"SïfñpuôFpupuîG©pî ·ï_ô¡spô¢ð3î ·ï\áî ÈïYsôXð/î ·ïTVpô•ô–spð)spð%î ·ïR"ôð.î ÈïNFsôXðLî ÈïLðWî ·ïGbpôôspðIî ·ïE-ôèð%ôéð<î ·ïBùôŽô�ðQuî ·ï@Åô˜ô™pspspsî ·ï>�pô¦spspô§ð.î ·ï<\ô‚ð3sp ôƒuð/î ·ï:'ô ð,ô¡ðQî ·ï7óspô¨ spspô©ð.î ·ï5¾spô…ðDô†sî ·ï3Špôªspð$ô«ð5î ·ï1Uspô¼ ô½sp sp spspð,î ·ï/!ôŒô� spspð!spsp sî ·ï,ípôÉspð$spspî ·ï*¸spô@spspspspî ·ï(„spô�ð*spôŽsp î ·ï&Otpôœô�ð,sp sp î ·ï$ôœð-spð#spô�î ·ï!æôð1î Èï sôXðXî ÈïÖðSî ·ï'pôêspspspð$î ·ïòôïð'sp spð%î ·ï¾spôƒô„spspî ·ï‰ôœô�spð0sp sp î ·ïUuô�ð%ô‘ pspð3sî ·ï pô® spspô¯ spspÿ ¾ · Ù?Q\2oCYPRESS DOCUMENTATION32whose to attributes are the elements of vl. GetPList and SetPList may generate any of the errorsthat GetF and SetF may generate, and the error IllegalProperty if to and from are from differentrelations.Note that the semantics of SetPList are not quite consistent with the semantics of SetP. SetPListreplaces the current values associated with a "property" with the new values (i.e., destroys and re-creates relationships); SetP adds a new property value, unless the aOf attribute is a key, in whichcase it replaces the current value. The semantics are defined in this way because this has proven themost convenient in our application programs.Examples of the use of the property procedures for data access can be found in Section 4.3.Properties are also useful for obtaining information about the data schema. For example, GetP[a,aRelationIs] will return the attribute a's relation, and GetPList[d, aTypeOf] will return all theattributes that can reference domain d.E2V: PROC[e: Entity] RETURNS[v: Value];B2V: PROC[b: BOOLEAN] RETURNS[v: Value];I2V: PROC[i: LONG INTEGER] RETURNS[v: Value];S2V: PROC[s: ROPE] RETURNS[v: Value];The x2V routines convert the various Cedar types to Values. The conversion is not normallyrequired for ropes and entities since the compiler will widen these into the REF ANY type Value.V2E: PROC[v: Value] RETURNS[Entity];V2B: PROC[v: Value] RETURNS[BOOLEAN];V2I: PROC [v: Value] RETURNS[LONG INTEGER];V2S: PROC [v: Value] RETURNS[ROPE];The V2x routines convert Values to the various Cedar types. The MismatchedValueType error israised if the value is of the wrong type. It is recommended that these routines be used rather thanuser-written NARROWs, as the representation of Values may change. Also, NARROWs of opaque typesdon't yet work in the Cedar compiler.3.5 Query operations on domains and relationsIn this section we describe queries upon domains and relations: operations that enumerate entitiesor relationships satisfying some constraint.î"ïfñpuôFpu î Mpî ·ï_ôœspô�spspspî ·ï\áôœspspô�spspspsp î ·ïZ­ î ·ïUýô™ ôš spð0spsî ·ïSÉtpô¦ð#ô§ð9î ·ïQ”ô¥sptpð"spô¦î ·ïO`ô„ð#ô…ðCî ·ïM,ôð,î ·ïH|ôÜðKôÝî ·ïFHô ð>ô¡sî ·ïD pôÊspspôËî ·ïAßôð%spî Èï;«sôXð'î Èï9wð(î Èï7Bð-î Èï5ð%î ·ï0_pôÏspð-spð!î ·ï.*ôœð)ô�ð7î Èï*NsôXð$î Èï(ð%î Èï%åð+î Èï#±ð#î ·ïpô—spô˜spð"spî ·ïÍô’ð)ô“ð;î ·ï™ô¯ wpsp ô°uwuî ·ïdôð%î ·ï rð-î ·ï ^pô›ð#ôœð@î ·ï *ôð,ÿÖ M ã?Q](MODEL LEVEL INTERFACE33RelationSubset: PROC[ r: Relation, constraint: AttributeValueList_ NIL] RETURNS [RelshipSet];NextRelship: PROC[rs: RelshipSet] RETURNS [Relship];PrevRelship: PROC[rs: RelshipSet] RETURNS [Relship];ReleaseRelshipSet: PROC [rs: RelshipSet];AttributeValueList: TYPE = LIST OF AttributeValue;AttributeValue: TYPE = RECORD [ attribute: Attribute, low: Value, high: Value_ NIL -- omitted where same as low or not applicable --];The basic query operation is RelationSubset. It returns a generator of all the relationships inrelation r which satisfy a constraint list of attribute values. The relationships are enumerated bycalling NextRelship repeatedly; it returns NIL when there are no more relationships. PrevRelshipmay similarly be called repeatedly to back the enumeration up, returning the previous relationship; itreturns NIL if the enumeration is at the beginning. ReleaseRelshipSet should be called when theclient is finished with the query.The constraint list may be NIL, in which case all of the relationships in r will be enumerated.Otherwise, relationships which satisfy the concatenation of constraints on attributes in the list will beenumerated. If an index exists on some subset of the attributes, the relationships will be enumeratedsorted on the concatenated values of those attributes. For a StringType, IntType, or TimeTypeattribute a of r, the contraint list may contain a record of the form [a, b, c] where the attributevalue must be greater or equal to b and less than or equal to c to satisfy the constraint. For anytype of attribute, the list may contain a record of the form [a, b] where the value of the attributemust exactly equal b. The Cedar ROPE literals "" and "\377" may be used in queries as aninfinitely large and infinitely small string, respectively. The signal MismatchedAttributeValueTypeis generated by RelationSubset if one of the low or high values in the list is of a different typethan its corresponding attribute.DomainSubset: PROC[ d: Domain, lowName, highName: ROPE_ NIL, searchSubDomains: BOOL_ TRUE, searchSegment: Segment_ NIL]ÿî"SïfñpuôFpupuîG©pî Èï_sôXî Èï\áð3î ÈïZ­î ÈïVÑð4î ÈïRõð4î ÈïOð)î ÈïK>ð2î ÈïI î ÈïFÕî ÈïD  î ÈïBlðGî ·ï=¼pôÆôÇ s pð5î ·ï;ˆô¶spðZî ·ï9Tôœs pô�spð(s î ·ï7pô€ðUô�î ·ï4ëô—spô˜ð*spî ·ï2¶ôð"î ·ï.ôÊspð,spî ·ï+Òôˆð&ô‰ðCî ·ï)žô�ð5ô‚ð1î ·ï'iô¸ô¹ð$s pspsî ·ï%5pô­ spspô®ð'spî ·ï#ôžôŸ spspð$î ·ï Ìô ð<ô¡spð!î ·ï˜ôÇsp spôÈî ·ïcô–ô—ð8sî ·ï/pô§s pspsp ô¨î ·ïúôð!î ÈïsôXî Èïê î Èï¶î Èï �î Èï MÿD · ?Q]ÿCYPRESS DOCUMENTATION34 RETURNS [EntitySet];NextEntity: PROC[EntitySet] RETURNS [Entity];PrevEntity: PROC[EntitySet] RETURNS [Entity];ReleaseEntitySet: PROC[EntitySet];DomainSubset enumerates all the entities in a domain. If lowName and highName are NIL, theentire domain is enumerated, in no particular order. Otherwise, only those entities whose names arelexicographically greater than lowName and less than highName are enumerated, in lexicographicorder. If searchSubDomains is TRUE, subdomains of d are also enumerated. Each subdomain issorted separately. The searchSegment argument is currently only used if d is one of the systemdomains, e.g. the Domain domain. It is used to specify which segment to search.Analogously to relation enumeration, NextEntity and PrevEntity may be used to enumerate theentities returned by DomainSubset, and ReleaseEntitySet should be called upon completion.GetDomainRefAttributes: PROC [d: Domain] RETURNS [AttributeList];This procedure returns a list of all attributes, of any relation defined in d's segment, which referencedomain d or one of its superdomains. The list does not include AnyDomainType attributes, whichcan reference any domain. GetDomainRefAttributes is implemented via queries on the dataschema. GetDomainRefAttributes is useful for application-independent tools; most specificapplications can code-in the relevant attributes.GetEntityRefAttributes: PROC [e: Entity] RETURNS [AttributeList];This procedure returns a list of all attributes in which some existing relationship actually referencese, including AnyDomainType attributes.3.6 System domains and relationsIn this section we describe what one might call the schema schema, the pre-defined system domainsand relations which constitute the data schema for client-defined domains and relations. The typicaldatabase application writer may skip this section, since the schema declaration operations defined inSection 3.3 are adequate when the data schema is completely defined and known at the time aprogram is written. The system domains and relations we describe in this section are most useful forgeneral-purpose tools (e.g. for displaying, querying, or dumping any database), where the tools mustÿî"ïfñpuôFpu î Mpî Èï_sôXî Èï[:ð-î ÈïW^ð-î ÈïS‚ð"î ·ïNÓ pô ô¡spspspî ·ïLžô‡ôˆðHî ·ïJjôªspspô« î ·ïH6ôµ spspô¶uî ·ïFôÄps pð$sp ôÅî ·ïCÍôðPî ·ï?ôÈ ôÉs ps pî ·ï<éôès psp ôéî Èï9 sôXðAî ·ï4^pô†ô‡ð4spî ·ï2)ô”spð/ô•s pî ·ï/õôèspð"ôéî ·ï-Àôspð;î ·ï+Œôð1î Èï'°sôXðAî ·ï#pô˜ð/ô™ð8î ·ï Ìsôp s p sî ·ïurî ·ïšpô“ð4t pô”î ·ïeô‰ð'ôŠð>î ·ï1ô‘ð)ô’ð<î ·ïüôÁðGôÂî ·ï Èô‚ðUôƒî ·ï “ô�ðAtpÿ® M L>Q\¿üMODEL LEVEL INTERFACE35examine the data schema "on the fly".As noted earlier, the permanent repository for data describing user-defined data in a database is thedatabase's data schema, represented by schema entities and relationships. Schema entities aremembers of one of the pre-defined system domains: DomainDomain, RelationDomain,DatatypeDomain, and so on. Every client-defined domain, relation, or attribute contains arepresentative entity in these domains. Client-defined datatypes are not currently permitted, so theonly entities in the DataType domain are the pre-defined IntType, StringType, and BoolType.The information about the client-defined domains and attributes are encoded by relationships in thedatabase. Domains participate in the system relation dSubType, which encodes a domain typehierarchy:dSubType: Relation; dSubTypeOf: Attribute; -- the domain in this attribute is a super-type of dSubTypeIs: Attribute; -- the domain in this attributeThe dSubType has one element per direct domain-subdomain relationship, it does not contain thetransitive closure of that relation. However, it is guaranteed to contain no cycles. That is, thedatabase system checks that there is no set of domains d1, d2, ... dN, N>1, such that d1 is a subtypeof d2, d2 is a subtype of d3, and so on to dN, and d1=dN. The dSubType may define a lattice asopposed to a tree, i.e. the sSubType attribute is not a key of the relation.The information about attributes is encoded as binary relations, one relation for each argument tothe DeclareAttribute procedure defining properties of the attribute. The names are easy toremember; for each argument, e.g. Foo, we define the aFoo relation, with attributes aFooOf andaFooIs. The aFooIs attribute is the value of that argument, and the aFooOf attribute is [the entityrepresentative of] the attribute it pertains to. Thus we have the following relations: aRelation: PUBLIC READONLY Relation; -- Specifies attribute - relation correspondence: -- [aRelationOf: KEY Attribute, aRelationIs: Relation] aRelationOf: PUBLIC READONLY Attribute; -- attribute whose relation we are specifying aRelationIs: PUBLIC READONLY Attribute; -- the relation of that attribute aType: PUBLIC READONLY Relation; -- Specifies types of relation attributes: -- [aTypeOf: KEY Attribute, aTypeIs: ValueType] aTypeOf: PUBLIC READONLY Attribute; -- the attribute aTypeIs: PUBLIC READONLY Attribute; -- domain or datatype of the attribute aUniqueness: PUBLIC READONLY Relation; -- Specifies attribute value uniqueness: -- [aUniquenessOf: KEY Attribute, aUniquenessIs: INT LOOPHOLE[Uniqueness]]î"SïfñpuôFpupuîG©pî ·ï_ôð%î ·ï[:ô�ô�ðPî ·ïYôäð-tp ôåð$î ·ïVÑô?ð(tp s ô@î ·ïT�pôôðDî ·ïRhô›ðeî ·ïP4ôÈ ôÉspsps pspî ·ïLXôŽðNô�î ·ïJ#ôÈð%ôÉspî ·ïGï î ÈïDsôXî ÈïAßðKî Èï?ªð8î ·ï;ÏpôŸspðFô  î ·ï9šôÁð1ôÂð2î ·ï7fôˆð$ô‰ï6Ùï7fï6Ùï7fï6Ùï7fï6Ùï7f î ·ï51ôˆï4¤ï51ï4¤ï51ô‰ï4¤ï51ï4¤ï51ï4¤ï51ï4¤ï51spî ·ï2ýôspð(î ·ï/!ô¦ð+ô§ð7î ·ï,íôòspð?ôóî ·ï*¸ôªð!ô«spspspî ·ï(„spô�spð2sp ôŽ î ·ï&OôðWî Èï"ssôXðXî Èï ?ð:î Èï ðYî ÈïÖðMî ÈïmðMî Èï9ð3î Èïð8î ÈïÐðNî Èï gðQî Èï 3ðM J · ì>Q^'CYPRESS DOCUMENTATION36 aUniquenessOf: PUBLIC READONLY Attribute; -- the attribute aUniquenessIs: PUBLIC READONLY Attribute; -- INT for Uniqueness: 0=None, 1=Key, etc. aLength: PUBLIC READONLY Relation; -- Specifies length of attributes: -- [aLengthOf: KEY Attribute, aLengthIs: INT] aLengthOf: PUBLIC READONLY Attribute; -- the attribute aLengthIs: PUBLIC READONLY Attribute; -- INT corresponding to attribute's length aLink: PUBLIC READONLY Relation; -- Specifies whether attribute is linked: -- [aLinkOf: KEY Attribute, aLinkIs: INT] aLinkOf: PUBLIC READONLY Attribute; -- the attribute aLinkIs: PUBLIC READONLY Attribute; -- 0=unlinked, 1=linked, 2 =colocated The final set of system relations pertain to index factors. Each index on a relation is defined toinclude one or more attributes of a relation. For each attribute in the index, there is an index factorentity. For each index, there is an index entity. Each index factor is associated with exactly oneindex and exactly one attribute. Indices may have many index factors, however, and an attributemay be associated with more than one index factor, since attributes may participate in multipleindices. The two relations pertaining to indices map indices on to their index factors, and indexfactors to the attributes they index: ifIndex: PUBLIC READONLY Relation; -- Specifies the index factors for each index -- [ifIndexOf: KEY IndexFactor, ifIndexIs: Index] ifIndexOf: PUBLIC READONLY Attribute; -- the index factor ifIndexIs: PUBLIC READONLY Attribute; -- index of the factor ifAttribute: PUBLIC READONLY Relation; -- Specifies attribute index factor corresponds to -- [ifAttributeOf: KEY IndexFactor, ifAttributeIs: Attribute] ifAttributeOf: PUBLIC READONLY Attribute; -- the index factor ifAttributeIs: PUBLIC READONLY Attribute; -- the attribute this factor representsThe relations on attributes, index factors, and domains can be queried with the RelationSubset orGetPList operations. For example, GetP[a, aRelationIs] returns the attribute a's relation.GetPList[r, aRelationOf] returns the relation r's attributes. RelationSubset[dSubType,LIST[[dSubTypeIs, d]]] will enumerate all the dSubType relationships in which d is the subtype.As noted earlier, the data schema (attributes, relations, domains, indices, index factors, and relationspertaining to these) may only be read, not written by the database client. In order to ensure theconsistency of the schema, it must be written indirectly through the schema definition procedures:DeclareDomain, DeclareRelation, DeclareAttribute, and DeclareSubType. Attempts to performÿî"ïfñpuôFpu î Mpî Èï_sôXð>î Èï\áðXî ÈïXxðGî ÈïVDð1î ÈïTð:î ÈïQÛðUî ÈïMrðLî ÈïK>ð-î ÈïI ð8î ÈïFÕðOî ·ïBùpô±ð-t pð&ô²î ·ï@Åô„ð#ô…ðEî ·ï>�ô§ðdî ·ï<\ô«ô¬ð@î ·ï:'ôÆðVôÇî ·ï7óô±ð5ô²ð-î ·ï5¾ôð%î Èï1ãsôXðRî Èï/®ð5î Èï-zð>î Èï+EðAî Èï&Üð[î Èï$¨ðAî Èï"sðAî Èï ?ðUî ·ïcpôœð;ô�s pî ·ï/spôsp ô sp î ·ïúsôspôtspsî ·ïÆô¦pspspî ·ïêô’ð9ô“ð/î ·ï¶ô¨ô©ðEî ·ï �ô¦ô§ðHî ·ï Msô¥psps p ô¦  Z M ?Q]çMODEL LEVEL INTERFACE37updates through operations such as SetP result in the error ImplicitSchemaUpdate.3.7 ErrorsWhen a database system operation invokes an error, the SIGNAL Error is generated, with an errorcode indicating the type of error that occured. The error code is a Cedar enumerated type:Error: SIGNAL [code: ErrorCode];ErrorCode: TYPE = {AlreadyExists, -- Entity already exists and client said version=NewOnlyBadUserPassword, -- On an OpenTransactionDatabaseNotInitialized, -- Attempt to do operation without calling InitializeFileNotFound, -- No existing segment found with given nameIllegalAttribute, -- Attribute not of the given relship's Relation or not an attributeIllegalValueType, -- Type passed DeclareAttribute is not datatype or domainIllegalDomain, -- Argument is not actually a domainIllegalFileName, -- No directory or machine given for segmentIllegalEntity, -- Argument to GetP, or etc., is not an EntityIllegalRelship, -- Argument to GetF, or etc., is not a RelshipIllegalRelation, -- Argument is not a relationIllegalSegment, -- Segment passed to DeclareDomain, or etc., not yet declaredIllegalString, -- Nulls not allowed in ROPEs passed to the database systemIllegalSuperType, -- Can't define subtype of domain that already has entitiesIllegalValue, -- Value is not REF INT, ROPE, REF BOOL, or EntityIllegalValueType, -- Type passed DeclareAttribute is not datatype or domainImplicitSchemaUpdate, -- Attempt to modify schema with SetP, DeclareEntity, etc.InternalError, -- Impossible internal state (possibly bug or bad database)MismatchedProperty, -- aOf and aIs attribute not from the same relationMismatchedAttributeValueType, -- Value not same type as required (SetF)MismatchedExistingAttribute, -- Existing attribute is different (DeclareAttribute)MismatchedExistingSegment, -- Existing segment is different (DeclareSegment)MismatchedPropertyCardinality, -- Did GetP with aOf that is not a KeyMismatchedSegment, -- Attempt to create ref across segment boundary (SetF)MismatchedValueType, -- value passed V2E, V2I, etc. not of expected typeMultipleMatch, -- More than one relationship satisfied avl on DeclareRelship.NonUniqueEntityName, -- Entity in domain with that name already existsNonUniqueKeyValue, -- Relship already exists with that valueNotFound, -- Version is OldOnly but no such Entity, Relation, or etc foundNotImplemented, -- Action requested is not yet implementedNILArgument, -- Attempt to perform operation on NIL argumentNullifiedArgument, -- Entity or relationship has been deleted or invalidatedProtectionViolation, -- Read or write to segment not permitted this user.SegmentNotDeclared, -- Attempt to open transaction w/o DeclareSegmentServerNotFound -- File server does not exist or does not respond };ÿî"SïfñpuôFpupuîG©pî ·ï_ôð#spspî ·ïX¿r î ·ïTãpôœð7s pô�î ·ïR¯ôÝð0ôÞð+î ÈïNÓsôXî ÈïLžî¾ïJjðGî¾ïHŸð)î¾ïFÕðMî¾ïE ð:î¾ïC@ðVî¾ïAuðKî¾ï?ªð3î¾ï=àð=î¾ï<ð=î¾ï:Kð>î¾ï8€ð.î¾ï6µðMî¾ï4ëðJî¾ï3 ðMî¾ï1Uð@î¾ï/‹ðKî¾ï-ÀðPî¾ï+öðJî¾ï*+ðGî¾ï(`ðGî¾ï&–ðRî¾ï$ËðLî¾ï#ðEî¾ï!6ðJî¾ïkðHî¾ï¡ðMî¾ïÖðFî¾ï ð<î¾ïAðJî¾ïvð:î¾ï¬ð<î¾ïáðLî¾ïðIî¾ïLðEî¾ï �ð@î¾ï · Ê · p>Q\›ÑCYPRESS DOCUMENTATION38In this report, the expression "generates the error X" means that the SIGNAL Error is generatedwith code=X. Unless otherwise specified, the client may CONTINUE from the signal, aborting theoperation in question. Signals should not be RESUMEd except by a wizard who knows the result ofproceeding with an illegal operation.Two special signals are associated with the file system level:Aborted: SIGNAL [trans: Transaction];Failure: SIGNAL [why: ATOM, server: ROPE];The Aborted signal can be generated by any database operation, and indicates that the transactionhas been aborted. The client must call AbortTransaction and may then call OpenTransaction toproceed. The Failure signal is generated when a transaction cannot be open due to server failure orcommunication difficulties.î"ïfñpuôFpu î Mpî ·ï_ô°ô±ð3s p î ·ï\áô”ð)ô•spî ·ïZ­ô‚ôƒspð+î ·ïXxôð%î ·ïT�ð>î¾ïPžsôXð%î¾ïNÓð*î ·ïJ÷pô spð3ô¡ð#î ·ïHÃôœð'ô�spspî ·ïFŽôˆ spðOî ·ïDZôÿ$ MD>Q#øj394. Application ExampleThis section provides a simple example of the use of Cypress. Section 4.1 introduces the example, adatabase of documents. Section 4.2 is a discussion of database design: the process of representingabstractions of real-world information structures in a database, somewhat specialized to the datastructures available in Cypress. In Section 4.3, a working program is illustrated.Our example is necessarily short; don't expect any startling revelations on these pages. We will tryto consider some of the most common cases, however.4.1 A database applicationWhat are the properties of a well-designed database? To a large extent these properties follow fromthe general properties of databases. For instance, we would like our databases to extend gracefullyas new types of information are added, since the existing data and programs are likely to be quitevaluable.It may be useful to consider the following point. The distinguishing aspect of information stored ina database system is that at least some of it is stored in a form that can be interpreted by the systemitself, rather than only by some application-specific program. Hence, one important dimension ofvariation among different database designs is in the amount of the database that is system-interpretable, i.e. the kinds of queries that can be answered by the system.As an example of variation in this dimension, consider the problem of designing a database fororganizing a collection of Mesa modules. In the present Mesa environment, this database wouldneed to include at least the names of all the definitions modules, program modules, configurationdescriptions, and current .Bcd files. A database containing only this information is little more than afile directory, and therefore the system's power to answer queries about information in this databaseis very limited. A somewhat richer database might represent the DIRECTORY and IMPORTS sectionsof each module as relationships, so that queries such as "which modules import interface Y?" can beanswered by the system. This might be elaborated further to deal with the use of individual typesand procedures from a definitions module, and so on. There may be a limit beyond which it isuseless to represent smaller objects in the database; if we aren't interested in answering queries like"what procedures in this module contain IF statements?", it may be attractive to represent the bodyof a procedure (or some smaller naming scope) as a text string that is not interpretable by thedatabase system, even though it is stored in a database. We shall illustrate design ideas with a database of information about documents. Our currentfacilities, which again are simply file directories, leave much to be desired. The title of a documentÿî;òï[{pîïSYqô€îïO}pôˆðbô‰îïMIô˜ô™ðMîïKôÈôÉðGîïH™ô€ðSîïD¾pô–ðeîïBCô€ð3îï;ìrîï8pôŠô‹ð\îï5Üô— ô˜ðYîï3§ôŸ ô ðVîï1sîï-—pô�ðbôŽîï+côˆð#spð2ô‰ îï).ô«ðaîï&úôöð"ô÷ð9îï$Åô€ðLîï épô¿ð6ôÀð(îïµô´ôµðGîï�ô«ð-ô¬ð4îïLô„ð\ô… îïô�ð3ôŽð2îïãô™ð2ôštptpîï¯ô‰ð8ôŠð!tpîïzôšô›ðJîïFô¯ð5ô°ð(îï ô” ô•ð]îï Ýð(tpô–ð9îï©ôÄðXôÅîïtô€ð8î)Tpôîï˜ôÒôÓð=îïdô�ð"ô�ðEÿ â · v>Q\•þCYPRESS DOCUMENTATION40on the printed page does not tell the reader where the document is stored or how to print a copy.Relationships between different versions of the same basic document are not explicit. Retrievals bycontent are impossible. Our goal here is not to solve all of these problems, but to start a design thathas the potential of dealing with some of them.4.2 Schema designEach document in our example database has a title and a set of authors. Hence we might representa collection of documents with a domain of entities whose name is the title of the document, and anauthor property specifying the authors:Document: Domain = DeclareDomain["Domain"];dAuthors: Property = DeclareProperty["author", Document, StringType];Here the authors' names are concatenated into a single string, using some punctuation scheme toallow the string to be decoded into the list of authors. This is a very poor database design because itdoes not allow the system to respond easily to queries involving authors; the system cannot parse theencoded author list.Note that in the above definition authors are strings, so anything is acceptable as an author. Thisweak typing has some flexibility: the database will never complain that it doesn't know the authoryou just attached to a certain document. However, the system is not helpful in catching errors whena new document is added to the database. If "Mark R. Brown" is mistakenly spelled "Mark R.Browne", then one of Mark's papers will not be properly retrieved by a later search. A step in thedirection of stronger type checking is to provide a separate domain for authors.To represent authors as entities, and to allow a variable number number of authors for a document,a better design would be:Document: Domain = DeclareDomain["Domain"];Person: Domain = DeclareDomain["Person"];author: Property = DeclareProperty["author", Document, Person];Incidentally, in the last line above we define a property rather than relation for brevity. Instead ofthe author property declaration we could have written:author: Relation = DeclareRelation["author"]; authorOf: Attribute = DeclareAttribute[author, "of", Document]; authorIs: Attribute = DeclareAttribute[author, "is", Person];î³ïY�ptôFpt îpîjïQ²ô›ðLôœîjïO}ô’ðKô“îjïMIô„ð\ô… îjïKô€ð/îjïD¾rîjï@âpô‹ð;ôŒð&îjï>­ô‡ð\ôˆîjïQ\O&CYPRESS DOCUMENTATION42where a large number of relationships are expected to refer to the same entity, it is also more spaceefficient in our implementation.If an authorOrder attribute is defined, the client may wish to redefine the authorOf attribute sothat links (pointers) are not maintained between the Document entities and author relationships,instead defining a more space-efficient B-tree index on the [authorOf, authorOrder] pair:authorOf: Attribute = DeclareAttribute[ relation: author, name: "of", type: Document, link: FALSE];authorIndex: Index = DeclareIndex[author, LIST[[authorOf, authorOrder]]];The Cypress implementation will use this index to process any call of the formRelationSubset[author, LIST[[authorOf, x]]This call to RelationSubset will therefore enumerate authors of document x sorted by authorOrder.Cypress will also use the index in processing for GetPList[..., authorOf] as GetPList usesRelationSubset.This solution is also somewhat less than perfect, as it depends upon the fact that the Cypressimplementation orders relationships when an index exist; but indices are not intended to change thesemantics of the operations, only to improve performance. Probably the best solution, if theordering is important to the semantics of a database application, is to represent a list by a binary"next" relation connecting the entities in an ordering.Documents have other interesting properties. Some of these, for example the date on which thedocument was produced, are in one-to-one correspondence with documents. Such properties can bedefined by specifying a relation or property as being keyed on the document:publDate: Property = DeclareProperty["publDate", Document, StringType, Key];We are using the convention that domain names are capitalized and relation, attribute, and propertynames are not capitalized, both for the Cedar Mesa variable names and in the names used in thedatabase system itself. If and when the database system is better integrated with Cedar Mesa, the Cedar anddatabase names will be one and the same.We might wish to include additional information for particular kinds of documents, for exampleconference papers. Conference papers may participate in the same relations as other documents.For example, they have authors. In addition, we may want to define relations in which onlyconference papers may participate, for example a presentation relation which defines who presentedthe paper, and where. We can define a conference paper to be a sub-domain of documents, andÿî³ï]"ptôFpt îpîjïUGô�ð_ô�îjïSô€îjïO6pô¯u pð-ô° up îjïMô´ôµup upîjïJÎô€ðYî{ïFòuôXð'î{ïD½ð@î{ï@TðIîjïîïdô€Ü ·#·>QDT°CYPRESS DOCUMENTATION44<==2U—D`D`¼@¼@D`» ¼@CÀ» » CÀCÀ» D`CÀ¼@>U—C`BÔCQ4¾ð½¼Cl@CóþC÷Þ»�g¼ ClG½,¼¦BÈCK4¾/ð½¼»À» D@D@> UÔBÔCZBðpBá ½’½3@CÚƒCÚ‚CZ€»ŽÝ€¼%~CÚ‚€¼¸¼¸BäpBÕ ½¢½;@¼“À¼ ¼"Db™Cóÿ¼“¹>CVCHCHCB’Bhà½3>½’CóþClD¼ºh»�𼓼€Cóþ€¼¦½,Bù$BPà½;>½¢¼%}¼%~¼¥€Dq"€CÚ‚¼%}€>uV)CZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ @½¾¾/ð¼ ¼“¼CE˜DrClC€¼ €>²V7C`CQ2½+ø½¾AðúCóþ¼“À»�h¼"ClC€Cóþ€¼¦BÔCK2½7÷þ½¾AлÀD@D`»À>ïV)CZ½,Bá$½�½3>BmðCÚ‚¼%}»ŽÝ€¼¥€CÚ‚CÚ�€¼¸CHBÕ$½�½;>B]ð¼ Cl@Db˜C÷Þ¼“¼€¼ €?!VCH¼¸Bh༽p½’BÌÀClD¼ »�ðCE”CóÿClG½,CZBPà½རBÄÀ¼%~CÚƒDq"€CZ€¼%~¼%~€?DUÔBÔ¼¦¼¨Ì¾ðBðD»À» D@D@C`¾ @¼®Ì¾/ðBèCÿ¼“¼CóþDr¼ºl¼ ¼“¹?RU—¼ ½+ø¼®ÌAðBðD¼“À¼ ¼"Db™Cóÿ¼“¹BÔCZ½7ø¼´ÌAÐBèDD@D`»À»À?DUZ½,¼¦½�½àBmðBÌÀ¼%}¼%~¼¥€Dq"€CÚ‚¼%}€CHCH½�½*àB]ðBÄÀCl@CóþC÷Þ»�g¼ ClG?!U(¼¸¼¸¼½n½— BÌÂBmð¼ ¼“¼CE˜DrClC€¼ €CZBÔ½ܽ¯ BÄÂB]ðCÚƒCÚ‚CZ€»ŽÝ€¼%~CÚ‚€>ïU¼¦½,¼¨ÎBðBAð»ÀD@D`»ÀC`¼®ÎA_ÀBèBAÐCóþClD¼ºh»�𼓼€Cóþ€>²T÷¼ ¼®ÎBÔBðB¾ð¼ Cl@Db˜C÷Þ¼“¼€¼ €CZ½,¼´ÎBÈBèB¾/ðD@»À» D@>uU¼¦BÔ½ÜBðpB̽’¼%~CÚƒDq"€CZ€¼%~¼%~€CH¼¸½*ÜBäpBĽ¢Cóþ¼“À»�h¼"ClC€Cóþ€>CU(¼¸CH½— CB�Bmð½3?ÿ¼“¼CóþDr¼ºl¼ ¼“¹BÔ¼¦½¯ BùþB]ð½;@CÚ‚¼%}»ŽÝ€¼¥€CÚ‚CÚ�€> UZ½,CZCW4Að½»þD@D`»À»À¼ A_ÀCQ3þAн¼ClD¼ »�ðCE”CóÿClG>rLwD`D`¼@¼@D`» ¼@CÀ» » CÀCÀ» D`CÀ¼@>RLwC`BÔCQ4¾ð½¼Cl@CóþC÷Þ»�g¼ ClG½,¼¦BÈCK4¾/ð½¼»À» D@D@>`L´BÔCZBðpBá ½’½3@CÚƒCÚ‚CZ€»ŽÝ€¼%~CÚ‚€¼¸¼¸BäpBÕ ½¢½;@¼“À¼ ¼"Db™Cóÿ¼“¹>ƒLæCHCHCB’Bhà½3>½’CóþClD¼ºh»�𼓼€Cóþ€¼¦½,Bù$BPà½;>½¢¼%}¼%~¼¥€Dq"€CÚ‚¼%}€>µM CZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ @½¾¾/ð¼ ¼“¼CE˜DrClC€¼ €>òMC`CQ2½+ø½¾AðúCóþ¼“À»�h¼"ClC€Cóþ€¼¦BÔCK2½7÷þ½¾AлÀD@D`»À?/M CZ½,Bá$½�½3>BmðCÚ‚¼%}»ŽÝ€¼¥€CÚ‚CÚ�€¼¸CHBÕ$½�½;>B]ð¼ Cl@Db˜C÷Þ¼“¼€¼ €?aLæCH¼¸Bh༽p½’BÌÀClD¼ »�ðCE”CóÿClG½,CZBPà½རBÄÀ¼%~CÚƒDq"€CZ€¼%~¼%~€?„L´BÔ¼¦¼¨Ì¾ðBðD»À» D@D@C`¾ @¼®Ì¾/ðBèCÿ¼“¼CóþDr¼ºl¼ ¼“¹?’Lw¼ ½+ø¼®ÌAðBðD¼“À¼ ¼"Db™Cóÿ¼“¹BÔCZ½7ø¼´ÌAÐBèDD@D`»À»À?„L:½,¼¦½�½àBmðBÌÀ¼%}¼%~¼¥€Dq"€CÚ‚¼%}€CHCH½�½*àB]ðBÄÀCl@CóþC÷Þ»�g¼ ClG?aL¼¸¼¸¼½n½— BÌÂBmð¼ ¼“¼CE˜DrClC€¼ €CZBÔ½ܽ¯ BÄÂB]ðCÚƒCÚ‚CZ€»ŽÝ€¼%~CÚ‚€?/K弦½,¼¨ÎBðBAð»ÀD@D`»ÀC`¼®ÎA_ÀBèBAÐCóþClD¼ºh»�𼓼€Cóþ€>òK×¼ ¼®ÎBÔBðB¾ð¼ Cl@Db˜C÷Þ¼“¼€¼ €CZ½,¼´ÎBÈBèB¾/ðD@»À» D@>µK弦BÔ½ÜBðpB̽’¼%~CÚƒDq"€CZ€¼%~¼%~€CH¼¸½*ÜBäpBĽ¢Cóþ¼“À»�h¼"ClC€Cóþ€>ƒL¼¸CH½— CB�Bmð½3?ÿ¼“¼CóþDr¼ºl¼ ¼“¹BÔ¼¦½¯ BùþB]ð½;@CÚ‚¼%}»ŽÝ€¼¥€CÚ‚CÚ�€>`L:½,CZCW4Að½»þD@D`»À»À¼ A_ÀCQ3þAн¼ClD¼ »�ðCE”CóÿClGRick CattellMark Brown rT7 rQw2Qw2T7 rT7 ’T7 ’Qw»À» D@D@ RT7D@D`»À»À rQ—2Q—D@»À» D@ rQW»ÀD@D`»ÀQwT7D@D`»À»ÀRQw»À» D@D@2T rT»ÀD@D`»À2TWD@»À» D@òT7òQ·»À» D@D@²T7D@D`»À»À ÒI× ÒG’G’I× ÒI× òI× òG»À» D@D@ ²I×D@D`»À»À ÒG7’G7D@»À» D@ ÒF÷»ÀD@D`»ÀrGrI×D@D`»À»À²G»À» D@D@’I· ÒI·»ÀD@D`»À’I÷D@»À» D@RI×RGW»À» D@D@I×D@D`»À»À,òV×,òT5²T5²V×,òV×-V×-T»À» D@D@,ÒV×D@D`»À»À,òT75²T7D@»À» D@,òS÷»ÀD@D`»À5’T5’V×D@D`»À»À5ÒT»À» D@D@5²V·,òV·»ÀD@D`»À5²V÷D@»À» D@1rV×1rTW»À» D@D@12V×D@D`»À»À-RJ×-RH6H6J×-RJ×-rJ×-rH»À» D@D@-2J×D@D`»À»À-RH76H7D@»À» D@-RG÷»ÀD@D`»À5òH5òJ×D@D`»À»À62H»À» D@D@6J·-RJ·»ÀD@D`»À6J÷D@»À» D@1ÒJ×1ÒHW»À» D@D@1’J×D@D`»À»ÀCypress DatabaseAn Analysis ofPriority Queues-2P—-2M×5òM×5òP—-2P—-RP—-RM×»À» D@D@-P—D@D`»À»À-2M÷5òM÷D@»À» D@-2M·»ÀD@D`»À5ÒM×5ÒP—D@D`»À»À6M×»À» D@D@5òPw-2Pw»ÀD@D`»À5òP·D@»À» D@1²P—1²N»À» D@D@1rP—D@D`»À»Àofofofofofisisis198219774ïIwEsåÙCá¢r½,ð¾6½;2ðCÁrŽCù!CR¾¼‰Ü»�w¼­A€Cù!€º—˲»8Ñ9¼ z°D[<ÕCZTˆ¼‰nå¼´½”ÀCë0Df-Bk@¼´8hJEÁįDÙÚ†»²šDÉü‚CÜ—»§ôðCö>Cb ¼¦”»ŽÎ¼�ô€Cö>€º€pÝ»<ŽCï€ »‰¬Ô¼+øDY}¼ß¼­BCv$Do‰CR¾€¼Þ€»¸BM0Am`@ê €½6S̼ ¼�ôCYlDq2Cb €¼ Á€4òOWEÎ(†AÑ šBÄ4@¿"€@¼¤3¼;è&Cþ½' »°O€»¬’BØÙCþ €º8QDeÚ¼)s¨»—«¹BÜ©àCÆ Ú»À¿¾Cÿ9D`B@B`»À9¸OEI…|¼W¾¾ª¼†ÊŒ½ƒ(?ÿüCõ漜P»Ÿª¼þCc³Cõ纽õìDo¯a½ é¼8©:½ŸÈAú€@¼ñBØàDO°€DSn½''¼ó€;îNsDÏ?K»¼ý,@÷̽¹�½´Q A~ˆ€Cìr¼<»–ȼ!UCÃþ@Cìr€»6é¢D[¦Š@[¼¾:`½º~àA×ûÀ¼ Cc²D`UCþÿ¼œO¼ =#MÒDÛ[õ»�oÓ½ŸB¼¤@ÕûBÄÏ@Cäê¼1A»’{€¼7`Cο@Cä逻)­úDÃ[öB@€ ¾%Ÿ ½Ÿ@ ½²¡€¼ŽCÄDi8CÞ«¼<À¼�€4SU×EÐh¼žVq¾†áAIîBÃ# D@?T¼@»ŸëÀ«€D@º0Ò¿œ ¾95€Ce ¯AW’½<|à¼AÎ DCœ€D]}¾1ô¼9RU·EÌ*@å"¹¾=1C[^AR뽆².CÿçAÏ€¼Œ»�–¾0ŒCÿèº4¼¡”оŒãAF•Bz Ó»ÀÀ¬CÿÀD`?T€»À.:U8º?õ\»€ªB?áø?èÈ¿&߀¼耽pCÍDlÄBý�¼èEÕoDÀªBAL¾ƒO¿Š@Ñ €Cü9Bû€¼2»“f½€Cü8*:T8º74¯»6ZоW¾ ཆ¥CZ)°¼D€½8$CãÉDh€BÇܼDEÌ’ÅDVÓ©¼6áPCü †Bò]€¼«PCü€Bý�¼2ý»“<½sCü%–S7ºšp»;,„»©ÈDÏ{C~'€¼ø¼€AQ@DAãÀD^¶€¾®Ü¼€FA¦œ¼¬²½„ÿÀ¿ˆ¼ªÙ�CêEúCþ»BÇܼ8»—÷€½8#Cþ¼.N׺€pdDCƒAAoÀ>ÿ€¾1ÿ¾LȼƀBp€DJ(ÀDXd½�€¼Ä€EÀpc¼ h½¼à½*±”AD€Aó@Cþ䀽<Ü»³ö@»©9€BÃ(Cþä*OWº£DWú0¼´®°¼ŸÿHCspCàËü¼Á€BûDU5@DM˽à€¼Á€EÝmT»#j™CíÅ@D{n̼®n�¼8Cÿ9€½�€»µ×@»§œBp€Cÿ;€#êP8º®DàpöCñÔàDÄk½†à¼.€¼ á€CoìDcˆ@Cô¸¼�€¼ áE×üûºªsë¾¶�CP LCf™�CÈÚ‚Cü>€½仪ÊÀ»²5Bû Cü>€-Rx»›q*CáĪ@iÔÀÀ,¬€¼ €Cp²Dcº@Cô ¼�L¼ Ddc€¼�þÀ5V?C^?Ϋ?F§Có¼�»œx@¼ KCoì€CóSH×EìÅj¼Ž¥²½ƒË€¿ €¼¼ðCÙ-&Cþí€BÂ(¼߀»˜ˆ½=Ü€CþŠÒ»—RÚ»µºìDÂQÝCm`¼'ÒÚ¼€A DCD]Ý€¾=Z¼€#îH÷EÉ;DLN`¼;GðDFÌ—Cc\`¼ÞCÿ>BoX¼¡»™›€½�°Cÿ?º6 C»¿KÖCÔ@@»­Õ´¼—f CåÑí¼€½=ØCæ €DgxBÂ#€¼€(oI·E×:ìDLQ:D@àè»�¿*¼ŸNÐCÌ:CÿÖ€¾ »»<@»£Z€Aç`CÿÕ€º!�vCÌQ9Bz@@?òBïâ`¼3bƼ½�¨Cê_DfdBoP¼Á€ñR÷EÄRQBÖ׬¾§F¾–„BRШCÿÙ@Aãм ‚@»œþ¾0CÿÙ€º<¤¡¼–׬½7,ÀBûüAïâ½®/W¼€¾®ÀCü)€Da@AQR¼€0SEÒùÕCÀÅ\½G@C]3êBQ+½„]tCÿ‰BWP¼Ö»šå½¨¯Cÿˆº.|ë¼b®¾�ÖÀ„¾(zB~2Œ¼&À¾0Cö}ÀDcAãм&€¯H·EÏ2`Cù´AÞg€?á€BGW@½+âCÿíAÅð¼ €»�߀¾:Cÿìº.dÀ¼¦ÐCXé ¼3Dë½<Û`BåÌ ¼–@½žCí€De®Ba怼–€±IEÆÊˆCM]ûCCÆ�¼Œ ½˜¡ÀBÍ=úCÿû€¾»À»¾i»¡AD4Cÿüº7eDBÍ]üAÍÿAæ¼€½2‚¼¾:Cù_€Db €AÅæ¼isisrwD`D`¼@¼@D`» ¼@CÀ» » CÀCÀ» D`CÀ¼@RwC`BÔCQ2¾î½¾ClB€Cóý€C÷Û@»�h€¼ €ClB½,¼¦BÈCK2¾/ð½¾»À» D@D@`´BÔCZBðqBá$½’½3=CÚ‚€CÚ‚€CZƒ»ŽÜÀ¼%} Cڂ༸¼¸BärBÕ$½¢½;=¼“¾¼ €¼$Db—€Cóþ¼“¾ƒæCHCHCB’€Bhä½3=½’CóýÀClB¼ºg€»�ñ¼“¾Cóþ¼¦½,Bù%BPä½;=½¢¼%}€¼%}€¼¥}Dq#@CÚ‚à¼%} µ CZBÔCW1€½¾¾ðD@»À» D@¼ CQ1€¾ 0½¾¾/ð¼ @¼“¾CE˜€DrClB¼ òC`CQ1€½+ú½¾AðúCóýÀ¼“¾»�h`¼$ClBCóþ¼¦BÔCK1€½7ùþ½¾AлÀD@D`»À/ CZ½,Bá%½޽3=BmîCÚ‚€¼%}€»ŽÜÀ¼¥}CÚ‚àCڂ༸CHBÕ%½޽;=B]î¼ @ClBDb— C÷ܼ“¾¼ aæCH¼¸Bhä¼½n½’BÌÃClB¼ »�ñCE™CóþClB½,CZBPä½ܽ¢BÄü%}€CÚ‚€Dq#@CZƒ¼%} ¼%} „´BÔ¼¦¼¨Î¾ðBðB»À» D@D@C`¾ 0¼®Î¾/ðBèAÿ¼“¾CóþDr¼ºg¼ ¼“¾’w¼ ½+ú¼®ÎAðBðB¼“¾¼ €¼$Db—€Cóþ¼“¾BÔCZ½7ú¼´ÎAÐBèBD@D`»À»À„:½,¼¦½޽ÜBmîBÌü%}€¼%}€¼¥}Dq#@CÚ‚à¼%} CHCH½޽*ÜB]îBÄÃClBCóý€C÷Ü»�h€¼ ClBa¼¸¼¸¼½m€½—BÌÃBmî¼ @¼“¾CE˜€DrClB¼ CZBÔ½Û½¯BÄÃB]îCÚ‚€CÚ‚€CZƒ»ŽÜÀ¼%} CÚ‚à/弦½,¼¨Î€BðBAð»ÀD@D`»ÀC`¼®Î€A_ÐBèBAÐCóýÀClB¼ºg€»�ñ¼“¾Cóþò×¼ ¼®Î€BÔBðB¾ð¼ @ClBDb— C÷ܼ“¾¼ CZ½,¼´Î€BÈBèB¾/ðD@»À» D@µå¼¦BÔ½ÛBðrBÌý’¼%}€CÚ‚€Dq#@CZƒ¼%}@¼%} CH¼¸½*ÛBärBÄý¢CóýÀ¼“¾»�h`¼$ClBCóþƒ¼¸CH½—CB’Bmí½3<ÿ¼“½€CóþDr ¼ºg¼ ¼“¾BÔ¼¦½¯Bù#þB]î½;=CÚ‚€¼%}€»ŽÜÀ¼¥}CÚ‚àCÚ‚à`:½,CZCW2Að½½þD@D`»À»À¼ A_ÐCQ1þAн¾ClB¼ »�ñ@CE™Cóý�ClB,’,’÷:÷:,’,²,²÷»À» D@D@,rD@D`»À»À,’:D@»À» D@,’×»ÀD@D`»À9ò÷9òD@D`»À»À:2÷»À» D@D@:÷,’÷»ÀD@D`»À:7D@»À» D@0Ò0Ò÷»À» D@D@0’D@D`»À»À5²5²÷»À» D@D@5rD@D`»À»ÀR.·D`D`¼@¼@D`» ¼@CÀ» » CÀCÀ» D`CÀ¼@2.·C`BÔCQ2¾ð½¾ClBCóþC÷Ü»�h¼ ClC€½,¼¦BÈCK2¾/ð½¾»À» D@D@@.ôBÔCZBðrBá$½’½3>CÚ‚€CÚ‚CZƒ»ŽÝ€¼%} CÚ‚¼¸¼¸BärBÕ$½¢½;>¼“¾¼ ¼$Db˜Cóþ¼“¼€c/&CHCHCB’Bhà½3=½’CóþClD¼ºg»�𼓾Cóÿ¼¦½,Bù$BPà½;=½¢¼%}€¼%~¼¥}Dq"€CÚ‚à¼%~•/ICZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ @½¾¾/ð¼ ¼“¼CE™DrClB¼ Ò/WC`CQ2½+ø½¾AðúCóý€¼“À»�h€¼"ClBCóÿ¼¦BÔCK2½7÷þ½¾AлÀD@D`»À/ICZ½,Bá$½�½3=BmðCÚ‚€¼%}»ŽÜÀ¼¥€CÚ‚àCÚ‚¼¸CHBÕ$½�½;=B]ð¼ €Cl@Db—€C÷Þ¼“¾¼ A/&CH¼¸Bhä¼½n½’BÌÂClB¼ »�ñCE˜CóþClC€½,CZBPä½ܽ¢Bļ%}€CÚƒDq#@CZ€¼%} ¼%~d.ôBÔ¼¦¼¨Î¾ðBðB»À» D@D@C`¾ 0¼®Î¾/ðBèAÿ¼“¾CóþDr¼ºh¼ ¼“¼€r.·¼ ½+ú¼®ÎAðBðB¼“¾¼ ¼$Db˜Cóþ¼“¼€BÔCZ½7ú¼´ÎAÐBèBD@D`»À»Àd.z½,¼¦½޽ÜBmîB̼%}€¼%~¼¥}Dq"€CÚ‚à¼%~CHCH½޽*ÜB]îBÄÂClBCóþC÷Ü»�h¼ ClC€A.H¼¸¼¸¼½n½— BÌÃBmð¼ ¼“¼CE™DrClB¼ CZBÔ½ܽ¯ BÄÃB]ðCÚ‚€CÚ‚CZƒ»ŽÝ€¼%} CÚ‚.%¼¦½,¼¨ÎBðBAð»ÀD@D`»ÀC`¼®ÎA_ÀBèBAÐCóþClD¼ºg»�𼓾CóÿÒ.¼ ¼®ÎBÔBðB¾ð¼ €Cl@Db—€C÷Þ¼“¾¼ CZ½,¼´ÎBÈBèB¾/ðD@»À» D@•.%¼¦BÔ½ÜBðpBÌý’¼%}€CÚƒDq#@CZ€¼%} ¼%~CH¼¸½*ÜBäpBÄý¢Cóý€¼“À»�h€¼"ClBCóÿc.H¼¸CH½—CB’Bmî½3=ÿ¼“¾CóþDr¼ºh¼ ¼“¼€BÔ¼¦½¯Bù#þB]î½;>CÚ‚€¼%}»ŽÜÀ¼¥€CÚ‚àCÚ‚@.z½,CZCW2Að½½þD@D`»À»À¼ A_ÐCQ1þAн¾ClB¼ »�ñCE˜CóþClC€?1D`D`¼@¼@D`» ¼@CÀ» » CÀCÀ» D`CÀ¼@>ò1C`BÔCQ2¾ð½¾Cl@CóþC÷Þ»�h¼ ClC€½,¼¦BÈCK2¾/ð½¾»À» D@D@?1TBÔCZBðpBá$½’½3>CÚƒCÚ‚CZ€»ŽÝ€¼%~CÚ‚¼¸¼¸BäpBÕ$½¢½;>¼“À¼ ¼"Db˜Cóÿ¼“¼€?#1†CHCHCB’Bhà½3>½’CóþClD¼ºh»�𼓼€Cóÿ¼¦½,Bù$BPà½;>½¢¼%}¼%~¼¥€Dq"€CÚ‚¼%~?U1©CZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ @½¾¾/ð¼ ¼“¼CE˜DrClC€¼ ?’1·C`CQ2½+ø½¾AðúCóþ¼“À»�h¼"ClC€Cóÿ¼¦BÔCK2½7÷þ½¾AлÀD@D`»À?Ï1©CZ½,Bá$½�½3>BmðCÚ‚¼%}»ŽÝ€¼¥€CÚ‚CÚ‚¼¸CHBÕ$½�½;>B]ð¼ Cl@Db˜C÷Þ¼“¼€¼ @1†CH¼¸Bh༽n½’BÌÂClD¼ »�ðCE˜CóÿClC€½,CZBPà½ܽ¢Bļ%~CÚƒDq"€CZ€¼%~¼%~@$1TBÔ¼¦¼¨Î¾ðBðB»À» D@D@C`¾ @¼®Î¾/ðBèAÿ¼“¼CóþDr¼ºh¼ ¼“¼€@21¼ ½+ø¼®ÎAðBðB¼“À¼ ¼"Db˜Cóÿ¼“¼€BÔCZ½7ø¼´ÎAÐBèBD@D`»À»À@$0Ú½,¼¦½�½ÜBmðB̼%}¼%~¼¥€Dq"€CÚ‚¼%~CHCH½�½*ÜB]ðBÄÂCl@CóþC÷Þ»�h¼ ClC€@0¨¼¸¼¸¼½n½— BÌÂBmð¼ ¼“¼CE˜DrClC€¼ CZBÔ½ܽ¯ BÄÂB]ðCÚƒCÚ‚CZ€»ŽÝ€¼%~CÚ‚?Ï0…¼¦½,¼¨ÎBðBAð»ÀD@D`»ÀC`¼®ÎA_ÀBèBAÐCóþClD¼ºh»�𼓼€Cóÿ?’0w¼ ¼®ÎBÔBðB¾ð¼ Cl@Db˜C÷Þ¼“¼€¼ CZ½,¼´ÎBÈBèB¾/ðD@»À» D@?U0…¼¦BÔ½ÜBðpB̽’¼%~CÚƒDq"€CZ€¼%~¼%~CH¼¸½*ÜBäpBĽ¢Cóþ¼“À»�h¼"ClC€Cóÿ?#0¨¼¸CH½— CB’Bmð½3=ÿ¼“¼CóþDr¼ºh¼ ¼“¼€BÔ¼¦½¯ Bù#þB]ð½;>CÚ‚¼%}»ŽÝ€¼¥€CÚ‚CÚ‚?0Ú½,CZCW2Að½½þD@D`»À»À¼ A_ÀCQ1þAн¾ClD¼ »�ðCE˜CóÿClC€?R'÷D`D`¼@¼@D`» ¼@CÀ» » CÀCÀ» D`CÀ¼@?2'÷C`BÔCQ2¾ð½¾Cl@CóþC÷Þ»�h¼ ClC€½,¼¦BÈCK2¾/ð½¾»À» D@D@?@(4BÔCZBðpBá"½’½3>CÚƒCÚ‚€CZ€»ŽÝ@¼%~CÚ‚¼¸¼¸BäpBÕ"½¢½;>¼“À¼ ¼"Db˜Cóÿ¼“¼€?c(fCHCHCB’Bhè½3>½’CóþClB¼ºh»�ñ¼“¼€Cóþ¼¦½,Bù$BPè½;>½¢¼%}¼%}€¼¥€Dq"ÀCÚ‚¼%~?•(‰CZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ 0½¾¾/ð¼ ¼“¾CE˜DrClC€¼ ?Ò(—C`CQ2½+ú½¾AðúCóþ¼“¾»�h¼$ClC€Cóþ¼¦BÔCK2½7ùþ½¾AлÀD@D`»À@(‰CZ½,Bá$½Œ½3>BmðCÚ‚¼%}€»ŽÝ€¼¥CÚ‚CÚ‚¼¸CHBÕ$½Œ½;>B]ð¼ ClBDb˜C÷ܼ“¼€¼ @A(fCH¼¸Bh༽o½’BÌÂClD¼ »�ðCE˜CóÿClC€½,CZBPà½Þ½¢Bļ%~CÚ‚€Dq"€CZ�¼%~¼%~@d(4BÔ¼¦¼¨Î¾ðBðB»À» D@D@C`¾ @¼®Î¾/ðBèAÿ¼“¼CóþDr¼ºh¼ ¼“¼€@r'÷¼ ½+ø¼®ÎAðBðB¼“À¼ ¼"Db˜Cóÿ¼“¼€BÔCZ½7ø¼´ÎAÐBèBD@D`»À»À@d'º½,¼¦½�½ÞBmðB̼%}¼%}€¼¥€Dq"ÀCÚ‚¼%~CHCH½�½*ÞB]ðBÄÂCl@CóþC÷Þ»�h¼ ClC€@A'ˆ¼¸¼¸¼½n½—BÌÂBmð¼ ¼“¾CE˜DrClC€¼ CZBÔ½ܽ¯BÄÂB]ðCÚƒCÚ‚€CZ€»ŽÝ@¼%~CÚ‚@'e¼¦½,¼¨ÎBðBAð»ÀD@D`»ÀC`¼®ÎA_ÐBèBAÐCóþClB¼ºh»�ñ¼“¼€Cóþ?Ò'W¼ ¼®ÎBÔBðB¾ð¼ ClBDb˜C÷ܼ“¼€¼ CZ½,¼´ÎBÈBèB¾/ðD@»À» D@?•'e¼¦BÔ½ÜBðtB̽’¼%~CÚ‚€Dq"€CZ�¼%~¼%~CH¼¸½*ÜBätBĽ¢Cóþ¼“¾»�h¼$ClC€Cóþ?c'ˆ¼¸CH½— CB‘Bmð½3=ÿ¼“¼CóþDr¼ºh¼ ¼“¼€BÔ¼¦½¯ Bù!þB]ð½;>CÚ‚¼%}€»ŽÝ€¼¥CÚ‚CÚ‚?@'º½,CZCW2Að½½þD@D`»À»À¼ A_ÀCQ1þAн¾ClD¼ »�ðCE˜CóÿClC€Rick CattellMark Brown-Ò2W-Ò/—6’/—6’2W-Ò2W-ò2W-ò/—»À» D@D@-²2WD@D`»À»À-Ò/·6’/·D@»À» D@-Ò/w»ÀD@D`»À6r/—6r2WD@D`»À»À6²/—»À» D@D@6’27-Ò27»ÀD@D`»À6’2wD@»À» D@2R2W2R/×»À» D@D@22WD@D`»À»À.,.)W6Ò)W6Ò,.,.2,.2)W»À» D@D@-ò,D@D`»À»À.)w6Ò)wD@»À» D@.)7»ÀD@D`»À6²)W6²,D@D`»À»À6ò)W»À» D@D@6Ò+÷.+÷»ÀD@D`»À6Ò,7D@»À» D@2²+×2²)W»À» D@D@2r+×D@D`»À»Àofofisis5Ò*×EÎ(†AÑ šBÄ4@¿"À@¼¤3¼;ç¦Cþ½'$»°O€»¬�@BØÙCþÀº8QDeÚ¼)s¨»—¬9BÜ©àCÆ Z»À¿½€Cÿ9D`B€@B`»À:˜*—EI…|¼W¾¾ª¼†ÆŒ½ƒ(@@~Cõ漜P»Ÿª¼Cc³Cõå@º½õìDo¯a½ é¼8§:½ŸÈAú�@¼ñBØÜDO°€DSoÀ½''¼ñ@<Î)óDÏ?K»¼ý,@÷̽»�½´Q A~x€Cìr¼<€»–ȼ!S€CÃþ@Cìr»6é¢D[¦Š@[¼¾;`½º~àA×óÀ¼ Cc°D`UCÿ¼œO¼ À>)RDÛ[õ»�oÓ½ŸB¼¤@ÕûBÄÑ@Cäê¼1A»’{€¼7bCο@CäèÀ»)­úDÃ[öB@€ ¾%— ½Ÿ@ ½²¥€¼ŽCÃþ€Di8CÞ¬€¼<À¼Ž/0¸º?õ\»€ªB?áø?èÈ¿&¿€¼耽tCÍDlÀBý�¼èEÕoDÀªBAL¾ƒo¿Š@Ñ€Cü9Bû|¼2»“f½€Cü8À+/¸º74¯»6ZоW¾ ཆ¥CZ)°¼E½8(CãÈDhBÇݼDEÌ’ÅDVÓ©¼6áPCü †Bò]€¼«PCü€BýŒ¼2ý»“<€½sCü&v.·ºšp»;,„»©ÈDÏ{C~'€¼ø¼€AQ@DAãÀD^¶€¾®Ü¼FA¦œ¼¬²½„ÿÀ¿ˆ¼ªÙ�CêEúCþ»BÇØ¼8»—ø½8#Cþ¼.î*Wº€pdDCƒAAoÀ€ÿ¾1ÿ¾DȼƀBp€DJ(ÀDXc€½�€¼ÆEÀpc¼ h½¼à½*·”AD€Aó @Cþ䀽<Ö»³ö@»©9€BÃ(CþäÀ*î*׺£DWú0¼´®°¼ŸþHCspCàË|¼Á€Bû DU5@DMÊ€½à€¼ÁÀEÝmT»#j™CíÅ@D{n ¼®n�¼8„Cÿ9€½�€»µ×@»§œ€Bp€Cÿ:$Ê+¸º®DàpöCñÔàDÄ˽†à¼.¼ á€CoìDcˆ@Cô·¼�€¼ â@E×üûºªsë¾¶�CP LCf™�CÈÛCü>€½⻪ÊÀ»²5@Bû Cü> -ø»›q*CáĪ@hÔÀÀ.,€¼ €Cp´Dcº@Cô ¼�L¼ Ddc€¼�þÀ5V?I^?Ϋ?C§Có¼�»œx@¼ JCoì€Có@ConferencePapersub-domain of Documentwhich can participate in a "presentation" relation.AuthorrelationPresentationrelation8R—Ep¤üÀ®XN½ ‹€¾Ÿ¯À¼´â€CÁbCûüBÿ0¼3¶»“@½ÐCûý º£h»¡뻣ÝPD]�€CÅ`À¼…AÔ»¿ÿ€D@D_ý@»À;šÕD{u:C~¥r¼¯·úBbsLBg,pBAÎðCð:C{½0l»� €¼„äCð: »™Uô¼b[¼£ÕNBÍb BÃqÌAqH¼½ÎCÌKDlä@Bÿ0¼ ~»°æÿ½<¼¿s€BR Bo- ¼½¼-ù€½èDrµÀCÒ¼¼à=VõDIÖWDiv¬¼µùµBRPBMc¼BN+ðC]ÊC÷DAỡG@¼æC]ʼT6»>ÏF½ ‘À˜HAÉ(€BÂü¼6–¼$€¼,"Dk}CèÚ€¼6–`=ÏÜDs�BEIVм€ÉCÒ¶¸C@�d½JBá4Cý¬DR€»®ð€¼TBá3€»¿‡êº¬¤¨½œŽø¼·½ 8Cf ø¼¢6¼滾D^¸ÀC÷¼¢6>s!]DÏ¢Eæö޼£æ¼‡ B{xCQ7pBÙøCþ€DSB»° À¼ÿBÙö»;Ѻ {GÀ?¿(⽇8¼²g�½̼T»­å€DQ€Cý¬½Ì€Ñ.`Dãoº*rn@\@¾«Ò½›X ¾) €C@$¼€»“€CËÏ€Cûë€C@$»& ÞEÖäÞ¼¸Ö˜½¦ B\óàBG?À¼¸×CúõDnÀ¼:i¼ ¼¸ØQ(ÿDÆØÎº;�T½œ˜Aé CݺäCCÍCu"¼/»�ZÀBçàCñÐàCu!»ç„Ez†¸Duø‰DJd¼,_¼‡4ð¼¿ÜCûê€Dlù€¼40€¼€¼¿Ü ¬$àCôe^»ŽæAé’ÀBÅÏ€AÕc`¾æ CȽ€¼­€»Œ£€¾†°CéR@CȾ»·2ôDihfBNìpBÌÊxAe @¾I`¼ŠÞCñЀDr¥€½&¼.`¼ŠÝ!,$ D«œ»wùCRðôCWÇô@×5½žÕCÜ÷¼(»�†À¼™C×ýCÜö€»'’XDÓ²BÎ:ØCK’ÀBÅ`½¿bð¼7B€CéR€Ds\€AyP¼­ ¼7B"b"§EI°·ºº@òCÎåCÈ-T½н‚ÂàCém€¼7j»”Ø@¼*q€CÈ–àCém º¬a/Dó%½%Ë CWÐPCSAf$€¼# C×ü€Dpy@Cfí¼(¼#€$ä ±EËZ¾º˜<·¼™r€Cøõ(CpÚ@B@YCõ€¼˜@»ž•À¼Y€CgÀCõ`º0y EF�ãCÖîàDQ<„¼¸’À½1w€¼’€CÈ–Dk'ÀCÕŽ€¼7i ¼’`)ŸôE~—5»ÈCoŽCäëÒ½ƒžÀ¼ºbCù°€¼°›»¥b@»¸•COdCù°`º<¥ÍD×ἶì@Ap€Bîè Bø‹È¼ û€CgÀDaj@Cû¦€¼˜@¼ û Conferencedomainofatby3QQ»˜â„º=œ¾à½'–`¼?Ù*Cɶ ¼”¤¼ ͼbDb\Cô2€¼”¤Dç;XEo»%»•¦DMi¨¾”i A`R°As­ð¼)"¼!ý@¼“´Dp(CÞ@¼)!ÀCuÕC~ ¨¾º°¾˜³pAc­PApÒCϺCä#€CÆz»’"À¼ÝÀCϺ1Jứ?–»¢—¼¶�îAÙ³ÐBYÚèBBލ¼ª¼5Ù¾ÀDsS CÊ&€¼ª Dj¦¨DKÌŒ¼¾QAÅ×ÀBEBI-XCÖÞCÞ€ClL»�Ø@¼!ýÀCÖÞ0‚3»€Ñ»¥ м«B}hðBj¢ÐA٘м ¼˜CMïDq¸ÀCgý€¼ @DË8òDBá伸˜$BlB(BF�0Aðw0CèUCÊ'Aî`»Œ¬`¼5Ø€CèU`/e“»´»¦Òм˜.CEä3BÅJÐAH°Ð¼€½éCÒÜ€Dk® Bð¼DñB†C奚¼¸3Áh¼vCBý€DVãÀDKè ¼½@¼vEgDŽ»�~¿=¶¾�#àAìw@Bw0Cü÷½(»¬¼»°!ÀBî×Cüöà# º÷LD÷UBÉœ ½!'ؽ=€¾!’ ¼R€BóâDTDO½ €¼R`EîÞ»ó.½ ¼©ÀhBa£Að¥`Cûм½€»©@»´àCBüÀCûŠ+غ$ÌåDÔÄZ½;' ½ Ñ�AÑ&€BN¡ ¼»€Bé:DR] DP̽Ƽ» EÜfr»2b-A@À€¾9€½¶`Cü­€½ »«ï»°úBóá€Cü­ ACM SIGMOD 1982The Cedar DBMS: APreliminary Report.87.5w6Ò5w6Ò87.87.287.25w»À» D@D@-ò87D@D`»À»À.5—6Ò5—D@»À» D@.5W»ÀD@D`»À6²5w6²87D@D`»À»À6ò5w»À» D@D@6Ò8.8»ÀD@D`»À6Ò8WD@»À» D@2’872’5·»À» D@D@2R87D@D`»À»À?77D`D`¼@¼@D`» ¼@CÀ» » CÀCÀ» D`CÀ¼@>ò77C`BÔCQ2¾ð½¾Cl@CóþC÷Þ»�h¼ ClC€½,¼¦BÈCK2¾/ð½¾»À» D@D@?7tBÔCZBðpBá$½’½3>CÚƒCÚ‚CZ€»ŽÝ€¼%~CÚ‚¼¸¼¸BäpBÕ$½¢½;>¼“À¼ ¼"Db˜Cóÿ¼“¼€?#7¦CHCHCB’Bhà½3>½’CóþClD¼ºh»�𼓼€Cóÿ¼¦½,Bù$BPà½;>½¢¼%}¼%~¼¥€Dq"€CÚ‚¼%~?U7ÉCZBÔCW2½¾¾ðD@»À» D@¼ CQ2¾ @½¾¾/ð¼ ¼“¼CE˜DrClC€¼ ?’7×C`CQ2½+ø½¾AðúCóþ¼“À»�h¼"ClC€Cóÿ¼¦BÔCK2½7÷þ½¾AлÀD@D`»À?Ï7ÉCZ½,Bá$½�½3>BmðCÚ‚¼%}»ŽÝ€¼¥€CÚ‚CÚ‚¼¸CHBÕ$½�½;>B]ð¼ Cl@Db˜C÷Þ¼“¼€¼ @7¦CH¼¸Bh༽n½’BÌÂClD¼ »�ðCE˜CóÿClC€½,CZBPà½ܽ¢Bļ%~CÚƒDq"€CZ€¼%~¼%~@$7tBÔ¼¦¼¨Î¾ðBðB»À» D@D@C`¾ @¼®Î¾/ðBèAÿ¼“¼CóþDr¼ºh¼ ¼“¼€@277¼ ½+ø¼®ÎAðBðB¼“À¼ ¼"Db˜Cóÿ¼“¼€BÔCZ½7ø¼´ÎAÐBèBD@D`»À»À@$6ú½,¼¦½�½ÜBmðB̼%}¼%~¼¥€Dq"€CÚ‚¼%~CHCH½�½*ÜB]ðBÄÂCl@CóþC÷Þ»�h¼ ClC€@6ȼ¸¼¸¼½n½— BÌÂBmð¼ ¼“¼CE˜DrClC€¼ CZBÔ½ܽ¯ BÄÂB]ðCÚƒCÚ‚CZ€»ŽÝ€¼%~CÚ‚?Ï6¥¼¦½,¼¨ÎBðBAð»ÀD@D`»ÀC`¼®ÎA_ÀBèBAÐCóþClD¼ºh»�𼓼€Cóÿ?’6—¼ ¼®ÎBÔBðB¾ð¼ Cl@Db˜C÷Þ¼“¼€¼ CZ½,¼´ÎBÈBèB¾/ðD@»À» D@?U6¥¼¦BÔ½ÜBðpB̽’¼%~CÚƒDq"€CZ€¼%~¼%~CH¼¸½*ÜBäpBĽ¢Cóþ¼“À»�h¼"ClC€Cóÿ?#6ȼ¸CH½— CB’Bmð½3=ÿ¼“¼CóþDr¼ºh¼ ¼“¼€BÔ¼¦½¯ Bù#þB]ð½;>CÚ‚¼%}»ŽÝ€¼¥€CÚ‚CÚ‚?6ú½,CZCW2Að½½þD@D`»À»À¼ A_ÀCQ1þAн¾ClD¼ »�ðCE˜CóÿClC€56×EÄ?~BàA3¾»Á¾®”Aÿ»4CÿàAÚ°¼ »�B€¾%\Cÿàº<~ü¼ A3½�³@BÞôgAÖF¾Ä̼¾¥ÀCû¼DacAZ`¼9Q6÷EÜðµCÁé`½´ CYçÞBL9@½ˆ™„Cÿ¢BMp¼ã»›o½²�Cÿ¢Àº$xZ¼ô°¾ŸÀÀ¢¾'½€ByV|¼ ¾%PC÷`Db½€AÚ¤¼ 4Ö1EÒCr»³¤‰½�8€@Pÿ€AÀE€Cp–ÞCÿý@퀼”»Ÿ'¿€CÿýÀº.†ä½:HŒ½`DUcfBc•@¼�»"¼ÚBvDJ¤DWü€½‰ò¼Ú9ò0·EЃ¼BÄåu½àDR˜úBb’ƒ^Cþ²BÈØ¼Ÿ»—ß½7(Cþ²@º0AÞ»¤NW½œÿ@¿„ AÂ#Cp¢¼¿€CýlD`Ù@퀼@Nori Suzuki/^6™º¶Yú»�02BaGÀAÛð@AÑS€½*`¼g¼‚ BÆ<Ds €C}c€¼g@ED³óDÍ03Cgs@¼6�̽*Ó BÚ- C÷CC\ö¼œê»�P¼£ €C÷C@-"5›º„¥¢ºº´¼DCª»‚åd¼6ÐDCî¼ê¼6ì¾7€Ds[CÉÀ¼é€Eu<¨EQ†°¼9-�DQîC `»¹§Cï™C}`½9Ä»Œõ€¼‚œ€Cï˜À)„2ýº¡ódº¾™7¼<xCÛ£BÄù ¾.Û¼ .¼›òCU�DqaCd¼ .Eh�—DØÉ¢¼šŒ`Cr§PAÜé€BÇ5@Cé€CÉAÈx»Œ¥¼6ìCé@&a1H»Ÿ}M¼. ;0Ï€AI" AEÝÀ@[¼z¼¤bCe¡DpŒC[�¼zDb/–CËA«¾4< @÷]ÀAAB@@~ïCõÒCd¼ªq»ŽŸ¼›òCõÒ%�0ùº6&š»Ë*¼?ШCï2ÀBíJÀ¼©™,¼,¼·úCÄÏDn €CH¼,EÌ¿ÈDÚÅAc½"޽9á@C]ÔC÷…€C[ž¼š_»�t¼¤dC÷† Û/xº¯Ã$»¡æàAvù€¾(Ö¿E@ƒ€¼µªC½€Dnr€CJT¼„EOá’D`óp@nÄ?Â?ßì¾½¤CúÔCH¼;1»‘߀¼·ùCúÔofisFigure 4-1: A fragment of a simple database of documentsFigure 4-2: A fragment of a document database including conference papers,î³ï -ptôFpt îpîjïd2ÿ* M\ÄT Gî rï_÷$qî Òï[·îRï[×î,²ï[·î;Òï[×î;²ïZ7î,’ïZ7î 2ïZîRïZWøxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7pî2ïUøx û7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7î@rïUW î@’ïK× øÿûøû#û#û#û#û#øÿûøû#û#û#û#û#øÿûøû#û#û#û#û#øÿûøû#û#û#û#û#îRïVwîòïK— îòïJøÿ ûøû#û#û#û#û#îïT×îrïJ—î.2ïW·î.’ïQ7î.òïK—î3ïQwî32ïK—î2’ïW—î ïQ÷î rïG·û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7î ²ïT×î 2ïJ—øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7øÿûøû#û#û#û#û#û#øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7îAï0× îA2ï'W øÿûøû#û#û#û#û#øÿûøû#û#û#û#û#î/Rï2×î/rï,·î3òï,×î3rï2×û7û7û7û7û7û7û7û7û7û7û7qîRï7÷îòï6Wî rï7ð3î.òï<·î.²ï;î.’ï# î/Òï!Wû7û7û7û7û7û7û7û7û7û7û7û7û7û7îRïW îòï·pî.ï×î2rï×î7ï×û7û7û7û7û7û7û7û7û7û7û7û7îòïî²ï.÷îRï-Wøÿûøû#û#û#û#û#øxû7øû7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7û7îAï6— û7û7û7û7û7û7î/rï8·î3’ï8·qî Òï?×ð8î rïðJ*ošEý1tu�APPLICATION EXAMPLE454.3 ExampleThe following program defines a small schema and database of persons and documents. It illustratesthe use of most of the procedures defined in Section 3.DocTestImpl: PROGRAM IMPORTS DB, IO, Rope =BEGIN OPEN IO, DBtty: IO.Handle_ CreateViewerStreams["VLTest1Impl.log"].out;Person, Conference: Domain;Thesis, ConferencePaper, Document: Domain;author: Relation; authorOf, authorIs: Attribute;presentation: Relation; presentationOf, presentationBy, presentationDate: Attribute;publDate: Attribute;rick, mark, nori: --Person-- Entity;cedarPaper, cypressDoc, thesis: --Document-- Entity;Initialize: PROC = BEGIN tty.PutF["Defining data dictionary...\n"]; -- Declare domains and make ConferencePapers and Theses be subtypes of Document: Person_ DeclareDomain["Person"]; Conference_ DeclareDomain["Conference"]; Document_ DeclareDomain["Document"]; ConferencePaper_ DeclareDomain["ConferencePaper"]; Thesis_ DeclareDomain["Thesis"]; DeclareSubType[of: Document, is: ConferencePaper]; DeclareSubType[of: Document, is: Thesis]; -- Declare publDate property of Document publDate_ DeclareProperty["publDate", Document, IntType]; -- Declare author relation between Persons and Documents author_ DeclareRelation["author"]; authorOf_ DeclareAttribute[author, "of", Document]; authorIs_ DeclareAttribute[author, "is", Person]; -- Declare presentation relation presentation_ DeclareRelation["presentation"]; presentationOf_ DeclareAttribute[presentation, "of", Document]; presentationBy_ DeclareAttribute[presentation, "by", Person]; presentationAt_ DeclareAttribute[presentation, "at", Conference]; END;îxï[5ptôF ptî;òpîïSZrô€ îïO~pôƒð<ô„ð'îïMIô€ð7îïFBuôXîïDxîï@âîï=Mð;îï9¸îï7íð*îï6#îï4Xîï2Žîï0Ãð>îï.øîï-.ð$îï+cð4îï'Îîï&îï$9ð,îï"nðRîï £ð"îïÙð*îïð&îïDð4îïyð"îï®ð4îïäð+îïð*îïOð;îï„ð:îï¹ð$îï ïð6îï $ð4îï Zð"îï�ð0îïÄðBîïúð@îï/ðDîïdr · ¼>Q\O·CYPRESS DOCUMENTATION46InsertData: PROC = BEGIN t: Relship; tty.PutF["Inserting data...\n"]; cedarPaper_ DeclareEntity[ConferencePaper, "The Cedar DBMS"]; cypressDoc_ DeclareEntity[Document, "Cypress DB Concepts & Facilities"]; thesis_ DeclareEntity[Thesis, "An Analysis of Priority Queues"]; sigmod_ DeclareEntity[Conference, "SIGMOD 81"]; rick_ DeclareEntity[Person, "Rick Cattell"]; mark_ DeclareEntity[Person, "Mark Brown"]; -- Note we can create entity and then set name... nori_ DeclareEntity[Person]; ChangeName[nori, "Nori Suzuki"]; -- Data can be assigned with SetP, SetF, or DeclareRelship's initialization list: t_ DeclareRelship[presentation,, NewOnly]; SetF[t, presentationtOf, cedarPaper]; SetF[t, presentationBy, mark]; SetF[t, presentationAt, sigmod]; []_ SetPList[cypressDoc, authorIs, LIST[rick, mark]]; -- the Cedar notation LIST[ ... ] defines a list []_ SetPList[cedarPaper, authorIs, LIST[rick, mark, nori]]; []_ DeclareRelship[author, LIST[[authorOf, thesis], [authorIs, mark]]]; []_ SetP[cypressDoc, publDate, I2V[1982]]; []_ SetP[thesis, publDate, I2V[1977]]; -- the I2V[...] calls needed because Cedar Mesa does not yet coerce INT to REF ANY -- Check that thesis can't be presented at conference: ok_ FALSE; t_ DeclareRelship[presentation]; SetF[t, presentationOf, thesis ! MismatchedAttributeValueType => {ok _ TRUE; CONTINUE}]; IF NOT ok THEN ERROR; END;DestroySomeData: PROCEDURE = -- Destroy one person entity and all frog entities BEGIN flag: BOOL_ FALSE; tty.Put[char[CR], rope["Deleting Rick from database..."], char[CR]]; DestroyEntity[DeclareEntity[Person, "Frank Baz", OldOnly]]; DestroyDomain[Frog]; END;PrintDocuments: PROC = -- Use DomainSubset with no constraints to enumerate all Documents BEGIN doc: -- Document -- Entity; authors: LIST OF Value; es: EntitySet; tty.PutF["Documents:\n\n"]; tty.PutF["Titleauthors\n"];î³ï\rptôFpt îpî{ïT—uôXî{ïRÌî{ïQð"î{ïO7ð?î{ïMlðJî{ïK¢ðBî{ïI×ð1î{ïH ð.î{ïFBð,î{ïDwð3î{ïB­î{ï@âð"î{ï?ðSî{ï=Mð,î{ï;‚ð)î{ï9¸ð"î{ï7íð$î{ï6"ð7î{ï4Xð4î{ï2�ð=î{ï0ÂðIî{ï.øð,î{ï--ð(î{ï+cðVî{ï)˜ð8î{ï'Í î{ï&ð"î{ï$8î{ï"nð=î{ï £î{ïØî{ïCî{ïyð4î{ï®î{ïãðFî{ïð=î{ïNî{ïƒî{ï îî{ï $ðDî{ï Yî{ïŽî{ïÄî{ïùî{ï/î{ïdî6 z M 6‘]ŒÊAPPLICATION EXAMPLE47 es_ DomainSubset[Document]; WHILE (doc_ NextEntity[es])#NIL DO tty.PutF["%g", rope[GetName[doc]]]; authors_ GetPList[doc, authorIs]; FOR al: LIST OF Entity_ NARROW[authors], al.rest UNTIL al=NIL DO tty.PutF["%g ", rope[GetName[al.first]]]] ENDLOOP; ENDLOOP; ReleaseEntitySet[es]; END;PrintPersonsPublications: PROC [pName: ROPE] = -- Use RelationSubset to enumerate publications written by person BEGIN p: Person_ DeclareEntity[Person, pName, OldOnly]; authorT: --author-- Relship; rs: RelshipSet; first: BOOL_ TRUE; IF p=NIL THEN {tty.PutF["%g is not a person!", rope[pName]]; RETURN}; tty.PutF["Papers written by %g are:\n", rope[pName]]; rs_ RelationSubset[author, LIST[[authorIs, p]]]; WHILE (authorT_ NextRelship[rs])#NIL DO IF first THEN first_ FALSE ELSE tty.Put[rope[", "]]; tty.Put[rope[GetFS[authorRS, authorOf]]]; ENDLOOP; tty.PutF["\n"]; ReleaseRelshipSet[rs]; END;tty.Put[rope["Creating database..."], char[CR]];Initialize[];DeclareSegment["[Local]Test", $Test, 1,, NewOnly];OpenTransaction[$Test];Initialize[];InsertData[];PrintDocuments[];PrintPersonsPublications["Mark Brown"];DestroySomeData[];PrintDocuments[];CloseTransaction[TransactionOf[$Test]];tty.Close[];END.ÿîgïWptôF ptî9ápîïO7uôXîïMlð$îïK¡îwîïI×ð%îïH ðDîïFBð8îïDw îïB¬îï@âîï=Mð.îï;‚ðCîï9·îï7íð3îï6"îï4Xîï2�îï0Âîï.øð;îï--ð7îï+bð2îï)˜ð)îï'Íð8îï&ð-îï$8 îï"mîï £îïØîïxð0îï® îïãð2îïîïN îïƒ îï¹îï îð'îï #îï YîïŽð'îïÄ îïdÿä Èß+oX,°ÿ HELVETICAÿ HELVETICA ÿ HELVETICAÿ HELVETICA ÿ TIMESROMAN ÿ TIMESROMAN ÿ TIMESROMAN ÿ TIMESROMAN ÿ TIMESROMAN ÿ TIMESROMAN ÿ TIMESROMAN ÿ TIMESROMAN ÿ TIMESROMAN ÿ TIMESROMANÿ HELVETICA ÿ HELVETICA ÿ HELVETICA ÿ HELVETICA ÿ TIMESROMAN ÿ TIMESROMAN ÿ TIMESROMAN ÿ HELVETICA ÿ TIMESROMAN ÿ TIMESROMANÿ HELVETICA ÿ HELVETICAÿGACHA  ÿ TIMESROMAN j  ¶ï*&ÖPîW]2@�ç– °ݸé¾ àÇçÏåׯÙßÄæØîïöü! °íï õ'Õ.‘6ý<BHÙPW/^–ah)nÚvþ}P‚;r½IÂ6ÇPË0bÕ'?bïôiôŒê~dCd>»zÖ»†ÖôŒ»Šbžb×Öb×óÖê~bºa‡»zÖb•Nê~d>ôŒˆ»ŠóÖb«bÂj/Ï/Íÿÿ›PŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCypressDoc.pressCattell15-Jun-83 9:47:27 PDT: