blob: 38b137e594f5662e63c846b788a1cd6b3cc543f9 [file] [log] [blame]
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="lang:clipboard.copy" content="Copy to clipboard">
<meta name="lang:clipboard.copied" content="Copied to clipboard">
<meta name="lang:search.language" content="en">
<meta name="lang:search.pipeline.stopwords" content="True">
<meta name="lang:search.pipeline.trimmer" content="True">
<meta name="lang:search.result.none" content="No matching documents">
<meta name="lang:search.result.one" content="1 matching document">
<meta name="lang:search.result.other" content="# matching documents">
<meta name="lang:search.tokenizer" content="[\s\-]+">
<link rel="shortcut icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.0.4, mkdocs-material-4.4.2">
<title>Examples (XMI) - Eclipse Hawk</title>
<link rel="stylesheet" href="../../assets/stylesheets/application.30686662.css">
<link rel="stylesheet" href="../../assets/stylesheets/application-palette.a8b3c06d.css">
<meta name="theme-color" content="#7e57c2">
<script src="../../assets/javascripts/modernizr.74668098.js"></script>
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono&display=fallback">
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
<link rel="stylesheet" href="../../assets/fonts/material-icons.css">
<link rel="manifest" href="../../assets/images/site.webmanifest">
<link rel="stylesheet" href="../../stylesheets/extra.css">
<!-- FAVICON -->
<link rel="apple-touch-icon" sizes="180x180" href="../../assets/images/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="../../assets/images/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="../../assets/images/favicon-16x16.png">
<link rel="mask-icon" href="../../assets/images/safari-pinned-tab.svg" color="#5bbad5">
<link rel="shortcut icon" href="../../assets/images/favicon.ico">
<meta name="msapplication-TileColor" content="#b91d47">
<meta name="msapplication-config" content="../../assets/images/browserconfig.xml">
<meta name="theme-color" content="#ffffff">
</head>
<body dir="ltr" data-md-color-primary="deep-purple" data-md-color-accent="deep-purple">
<svg class="md-svg">
<defs>
</defs>
</svg>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" data-md-component="overlay" for="__drawer"></label>
<a href="#example-queries-on-xmi-models" tabindex="1" class="md-skip">
Skip to content
</a>
<header class="md-header" data-md-component="header">
<nav class="md-header-nav md-grid">
<div class="md-flex">
<div class="md-flex__cell md-flex__cell--shrink">
<a href="../.." title="Eclipse Hawk" class="md-header-nav__button md-logo">
<img src="../../assets/images/hawk-logo-white.svg" width="24" height="24">
</a>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
</div>
<div class="md-flex__cell md-flex__cell--stretch">
<div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
<span class="md-header-nav__topic">
Eclipse Hawk
</span>
<span class="md-header-nav__topic">
Examples (XMI)
</span>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--search md-header-nav__button" for="__search"></label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
<label class="md-icon md-search__icon" for="__search"></label>
<button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
&#xE5CD;
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="result">
<div class="md-search-result__meta">
Type to start searching
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<div class="md-header-nav__source">
<a href="https://git.eclipse.org/c/hawk/hawk.git/" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
Git repository @ Eclipse
</div>
</a>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container">
<main class="md-main" role="main">
<div class="md-main__inner md-grid" data-md-component="container">
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" data-md-level="0">
<label class="md-nav__title md-nav__title--site" for="__drawer">
<a href="../.." title="Eclipse Hawk" class="md-nav__button md-logo">
<img src="../../assets/images/hawk-logo-white.svg" width="48" height="48">
</a>
Eclipse Hawk
</label>
<div class="md-nav__source">
<a href="https://git.eclipse.org/c/hawk/hawk.git/" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
Git repository @ Eclipse
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." title="Home" class="md-nav__link">
Home
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2" checked>
<label class="md-nav__link" for="nav-2">
Basic use
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-2">
Basic use
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../installation/" title="Installation" class="md-nav__link">
Installation
</a>
</li>
<li class="md-nav__item">
<a href="../core-concepts/" title="Core concepts" class="md-nav__link">
Core concepts
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Examples (XMI)
</label>
<a href="./" title="Examples (XMI)" class="md-nav__link md-nav__link--active">
Examples (XMI)
</a>
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#all-instances-of-a-type" class="md-nav__link">
All instances of a type
</a>
</li>
<li class="md-nav__item">
<a href="#reference-slots-in-a-type" class="md-nav__link">
Reference slots in a type
</a>
</li>
<li class="md-nav__item">
<a href="#reference-traversal" class="md-nav__link">
Reference traversal
</a>
</li>
<li class="md-nav__item">
<a href="#reverse-reference-traversal" class="md-nav__link">
Reverse reference traversal
</a>
</li>
<li class="md-nav__item">
<a href="#range-queries-with-indexed-or-derived-integer-attributes" class="md-nav__link">
Range queries with indexed or derived integer attributes
</a>
</li>
<li class="md-nav__item">
<a href="#advanced-example-loops-variables-and-custom-operations" class="md-nav__link">
Advanced example: loops, variables and custom operations
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../examples-modelio/" title="Examples (Modelio)" class="md-nav__link">
Examples (Modelio)
</a>
</li>
<li class="md-nav__item">
<a href="../papyrus/" title="Papyrus UML support" class="md-nav__link">
Papyrus UML support
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
<label class="md-nav__link" for="nav-3">
Advanced use
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-3">
Advanced use
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../advanced-use/graph-as-emf/" title="Graph as EMF model" class="md-nav__link">
Graph as EMF model
</a>
</li>
<li class="md-nav__item">
<a href="../../advanced-use/advanced-props/" title="Advanced properties" class="md-nav__link">
Advanced properties
</a>
</li>
<li class="md-nav__item">
<a href="../../advanced-use/meta-queries/" title="Meta-level queries" class="md-nav__link">
Meta-level queries
</a>
</li>
<li class="md-nav__item">
<a href="../../advanced-use/temporal-queries/" title="Temporal queries" class="md-nav__link">
Temporal queries
</a>
</li>
<li class="md-nav__item">
<a href="../../advanced-use/oomph/" title="Oomph and Hawk" class="md-nav__link">
Oomph and Hawk
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
<label class="md-nav__link" for="nav-4">
Server
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-4">
Server
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../server/architecture/" title="Architecture" class="md-nav__link">
Architecture
</a>
</li>
<li class="md-nav__item">
<a href="../../server/api/" title="Thrift API" class="md-nav__link">
Thrift API
</a>
</li>
<li class="md-nav__item">
<a href="../../server/api-security/" title="Thrift API security" class="md-nav__link">
Thrift API security
</a>
</li>
<li class="md-nav__item">
<a href="../../server/deployment/" title="Deployment" class="md-nav__link">
Deployment
</a>
</li>
<li class="md-nav__item">
<a href="../../server/cli/" title="Console client" class="md-nav__link">
Console client
</a>
</li>
<li class="md-nav__item">
<a href="../../server/eclipse/" title="Eclipse client" class="md-nav__link">
Eclipse client
</a>
</li>
<li class="md-nav__item">
<a href="../../server/file-config/" title="File-based configuration" class="md-nav__link">
File-based configuration
</a>
</li>
<li class="md-nav__item">
<a href="../../server/logging/" title="Logging" class="md-nav__link">
Logging
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
<label class="md-nav__link" for="nav-5">
Developers
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-5">
Developers
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../developers/run-from-source/" title="Run GUI from source" class="md-nav__link">
Run GUI from source
</a>
</li>
<li class="md-nav__item">
<a href="../../developers/server-from-source/" title="Run Server from source" class="md-nav__link">
Run Server from source
</a>
</li>
<li class="md-nav__item">
<a href="../../developers/plain-maven/" title="Build with plain Maven" class="md-nav__link">
Build with plain Maven
</a>
</li>
<li class="md-nav__item">
<a href="../../developers/website/" title="Work on the website" class="md-nav__link">
Work on the website
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
<label class="md-nav__link" for="nav-6">
Community
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-6">
Community
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="https://www.eclipse.org/forums/index.php/f/442/" title="Forum" class="md-nav__link">
Forum
</a>
</li>
<li class="md-nav__item">
<a href="https://gitlab.eclipse.org/eclipse/hawk/hawk/-/issues/new" title="File a bug" class="md-nav__link">
File a bug
</a>
</li>
<li class="md-nav__item">
<a href="https://gitlab.eclipse.org/eclipse/hawk/hawk/-/issues" title="Open bugs" class="md-nav__link">
Open bugs
</a>
</li>
<li class="md-nav__item">
<a href="https://ci.eclipse.org/hawk/" title="Builds" class="md-nav__link">
Builds
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../additional-resources/" title="Additional resources" class="md-nav__link">
Additional resources
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#all-instances-of-a-type" class="md-nav__link">
All instances of a type
</a>
</li>
<li class="md-nav__item">
<a href="#reference-slots-in-a-type" class="md-nav__link">
Reference slots in a type
</a>
</li>
<li class="md-nav__item">
<a href="#reference-traversal" class="md-nav__link">
Reference traversal
</a>
</li>
<li class="md-nav__item">
<a href="#reverse-reference-traversal" class="md-nav__link">
Reverse reference traversal
</a>
</li>
<li class="md-nav__item">
<a href="#range-queries-with-indexed-or-derived-integer-attributes" class="md-nav__link">
Range queries with indexed or derived integer attributes
</a>
</li>
<li class="md-nav__item">
<a href="#advanced-example-loops-variables-and-custom-operations" class="md-nav__link">
Advanced example: loops, variables and custom operations
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<h1 id="example-queries-on-xmi-models">Example queries on XMI models<a class="headerlink" href="#example-queries-on-xmi-models" title="Permanent link">&para;</a></h1>
<p>These are some sample queries that can be done on any set of indexed XMI-based UML models, assuming that <code>Class::name</code> has been added as an indexed attribute and <code>Class::ownedOperationCount</code> has been defined as a derived attribute (as showed in [[Basic concepts and usage]]). All the queries are written in the <a href="http://www.eclipse.org/epsilon/doc/eol/">Epsilon Object Language</a>.</p>
<p>In order to index XMI-based UML models, you only need to enable the <code>UMLMetaModelResourceFactory</code> and <code>UMLModelResourceFactory</code> plugins when you create a new Hawk instance, and ensure your files have the <code>.uml</code> extension. If you are using any predefined UML data types, you may also want to add a <code>PredefinedUMLLibraries</code> location inside "Indexed Locations": that will integrate those predefined objects into the Hawk graph, allowing you to reference them on queries.</p>
<p>The rest of this article will run on <a href="https://raw.githubusercontent.com/mondo-project/mondo-hawk/gh-pages/examples/models/zoo/zoo.xmi">this toy XMI-based UML file</a>, which was exported from <a href="https://github.com/mondo-project/mondo-hawk/raw/gh-pages/examples/models/zoo/Zoo.modelio.zip">this Modelio 3.2.1 project</a>:</p>
<p><img alt="Example UML model" src="../img/zoo-classes.png" /></p>
<p>To avoid ambiguity in type names, the default namespaces list in the query dialog should include the UML metamodel URI (<code>http://www.eclipse.org/uml2/5.0.0/UML</code> for the above <code>UML.ecore</code> file).</p>
<h2 id="all-instances-of-a-type">All instances of a type<a class="headerlink" href="#all-instances-of-a-type" title="Permanent link">&para;</a></h2>
<div class="codehilite"><pre><span></span><code>return Class.all.size;
</code></pre></div>
<p>Returns the total number of classes within the specified scope. If you leave "Context Files" empty, it'll count all the classes in all the projects. If you put "*OSS.modelio.zip" in "Context Files", it'll count only the classes within the OSS project. This is faster than going through the model because we can go to the Class node and then simply count all the incoming edges with label "ofType".</p>
<p><img alt="Query result" src="../img/query01_all-instances.png" /></p>
<h2 id="reference-slots-in-a-type">Reference slots in a type<a class="headerlink" href="#reference-slots-in-a-type" title="Permanent link">&para;</a></h2>
<div class="codehilite"><pre><span></span><code>return Model.types.select(t|t.name=&#39;Class&#39;).references;
</code></pre></div>
<p>Gives you all the reference slots in the UML "Class" type. This is an example of the queries that can be performed at the "meta" level: more details are available in [[Meta level queries in Hawk]]. The query dialog with the result would look like this:</p>
<p><img alt="Query result" src="../img/query02_refslots.png" /></p>
<h2 id="reference-traversal">Reference traversal<a class="headerlink" href="#reference-traversal" title="Permanent link">&para;</a></h2>
<div class="codehilite"><pre><span></span><code>return Class.all
.select(c|c.qualifiedName=&#39;zoo::Zebra&#39;)
.superClass.flatten.name;
</code></pre></div>
<p>Gives you the names of all the superclasses of class <code>Zebra</code> within model <code>zoo</code>.</p>
<p><img alt="Query result" src="../img/query03_reftraversal.png" /></p>
<h2 id="reverse-reference-traversal">Reverse reference traversal<a class="headerlink" href="#reverse-reference-traversal" title="Permanent link">&para;</a></h2>
<div class="codehilite"><pre><span></span><code>return Class.all
.select(c|c.qualifiedName=&#39;zoo::Animal&#39;)
.revRefNav_superClass.flatten.name;
</code></pre></div>
<p>Gives the names of all the <em>sub</em>classes of <code>Animal</code> (follows "superClass" in reverse). The UML metamodel doesn't have "subclass" links, but we can use Hawk's automatic support for reverse traversal of references. In general, if <code>x.e</code> is a reference, we can follow it in reverse with <code>x.revRefNav_e</code>. We can also access containers using <code>x.eContainer</code>.</p>
<p><img alt="Query result" src="../img/query04_reversetraversal.png" /></p>
<h2 id="range-queries-with-indexed-or-derived-integer-attributes">Range queries with indexed or derived integer attributes<a class="headerlink" href="#range-queries-with-indexed-or-derived-integer-attributes" title="Permanent link">&para;</a></h2>
<div class="codehilite"><pre><span></span><code>return Class.all.select(c|c.ownedOperationCount &gt; 0).name;
</code></pre></div>
<p>Finds the names of the classes with at least one operation of their own.</p>
<p><img alt="Query result" src="../img/query05_rangequeries.png" /></p>
<h2 id="advanced-example-loops-variables-and-custom-operations">Advanced example: loops, variables and custom operations<a class="headerlink" href="#advanced-example-loops-variables-and-custom-operations" title="Permanent link">&para;</a></h2>
<div class="codehilite"><pre><span></span><code>var counts = Sequence {};
var i = 0;
var n = count(0);
while (n &gt; 0) {
counts.add(Sequence {&quot;&gt;&quot; + i, n});
i = i + 1;
n = count(i);
}
return counts;
operation count(n) {
return Class.all.select(c|c.ownedOperationCount &gt; n).size;
}
</code></pre></div>
<p><img alt="Query result" src="../img/query06_advanced.png" /></p>
<p>This query produces a sequence of <code>&gt;x, y</code> pairs which indicate that <code>y</code> classes have more than <code>x</code> operations of their own.</p>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="../core-concepts/" title="Core concepts" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
Core concepts
</span>
</div>
</a>
<a href="../examples-modelio/" title="Examples (Modelio)" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Next
</span>
Examples (Modelio)
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright © Eclipse Foundation, Inc. All Rights Reserved.
</div>
powered by
<a href="https://www.mkdocs.org">MkDocs</a>
and
<a href="https://squidfunk.github.io/mkdocs-material/">Material for MkDocs</a>
</div>
<div class="md-footer-copyright hawk-eclipse-links">
<ul>
<li><a href="https://www.eclipse.org/legal/privacy.php">Privacy Policy</a></li>
<li><a href="https://www.eclipse.org/legal/termsofuse.php">Terms of Use</a></li>
<li><a href="https://www.eclipse.org/legal/copyright.php">Copyright Agent</a></li>
</ul>
</div>
</div>
</div>
</footer>
</div>
<script src="../../assets/javascripts/application.c648116f.js"></script>
<script>app.initialize({version:"1.0.4",url:{base:"../.."}})</script>
</body>
</html>