2013-02-28 41 views
1

我在嘗試檢查OCL中的重複時面臨挑戰。在OCL中查找嵌套副本

下面是類圖的簡化:

         +-----------+ 
             |ChapterName| 
             +-----------+ 
             ^0..* chapterNames 
              | 
             ^
              V 
       +-------+ books 0..* +----+ 
       |Catalog|<>------------>|Book| 
       +-------+    +----+ 
     catalogs 0..*^     ^0..* books 
        |      | 
        +----+ customers 0..* +--------+ 
        |Shop|<>-------------->|Customer| 
        +----+     +--------+ 

用於每個類別的屬性的聲明如下:

  • CHAPTERNAME
    • 名稱
  • 目錄
    • 類別

問題: 我想檢查是如果客戶有重複的人名章任何書籍,這也屬於目錄中的一個特定的類別。

我還沒有設法繞過邏輯。到目前爲止,我所擁有的是:

context Shop 
self.customers.books->select(cubks | cubks = 
    self.catalogs.books->select(cabks | cabks = cubks)->first()) 

...哪個應該從客戶的目錄中找到書籍。

問題:如何添加更多約束條件來解決上述問題?

另外。我在Eclipse中使用Eclipse,EMF和OCL控制檯。

回答

1
context Shop::checkForDuplicates(catalog:Catalog) 
post: result = 
    self.customer.books->flatten()->select(book| 
     catalog.books->contains(book) 
    )->forEach(book| 
     chapterNames->asSet()->size()=chapterNames->size() 
    ) 

customerSet; booksBagSet(取決於是否允許重複的書籍,我假設它是Bag,儘管它並不重要)。然後customer.books是一袋書(每個顧客一袋),並且customer.books->flatten()是一袋所有顧客擁有的書籍。

catalog.booksBagSet(無所謂)。 select操作僅返回給定catalog中包含的那些書籍(因爲我們從之前構建的包中選擇,屬於某個Customer)。

book.chapterNamesSequence(我假定關聯訂購),在這本書的章節的名稱。 forAll返回true iff對於集合中的每個元素(即對於給定目錄中的每個圖書由客戶擁有),則主體評估爲true

現在的技巧是依賴於操作Sequence::asSet(),該操作返回序列中刪除重複項的所有元素。然後,袋子的尺寸等於設置的尺寸,如果沒有元素被移除(即,如果每個元素都是唯一的)。