70b6b97a63ba7f8fc1575f08786d8aef32cd119a
[simantics/platform.git] / bundles / org.simantics.scl.db / scl / Simantics / DB.scl
1 import "JavaBuiltin" as Java
2 include "http://www.simantics.org/Layer0-1.1" as L0
3
4 infixl 5 (#)
5  
6 effect ReadGraph
7     "graph"
8     "org.simantics.db.ReadGraph"
9
10 effect WriteGraph
11     "graph"
12     "org.simantics.db.WriteGraph"
13     
14 importJava "org.simantics.db.Resource" where
15     "A resource is a node in a semantic graph."
16     data Resource
17     
18     "Returns the 64-bit unique identifier of the resource."
19     @JavaName getResourceId
20     resourceId :: Resource -> Long
21     
22 importJava "org.simantics.db.ReadGraph" where
23     data ReadGraphX
24     
25 instance Ord Resource where
26     compare a b = compare (resourceId a) (resourceId b)
27   
28 instance Show Resource where
29     show r = "#" + show (resourceId r)
30
31 instance Show Statement where
32     show s = "#" + show (resourceId ( subjectOf s)) + "#" + show (resourceId ( predicateOf s)) + "#" + show (resourceId ( objectOf s))
33
34 importJava "org.simantics.db.Statement" where
35     "A statement is an edge in a semantic graph."
36     data Statement
37     
38     @JavaName getSubject
39     subjectOf :: Statement -> Resource
40     @JavaName getPredicate
41     predicateOf :: Statement -> Resource
42     @JavaName getObject
43     objectOf :: Statement -> Resource
44     
45 importJava "org.simantics.db.ReadGraph" where
46     "Converts an absolute URI to a resource or returns `Nothing` if there is no such resource."
47     @JavaName getPossibleResource
48     possibleResource :: String -> <ReadGraph> (Maybe Resource)
49     
50     getDataType :: Resource -> <ReadGraph> Datatype
51
52     @JavaName getSupertypes
53     superTypesOf :: Resource -> <ReadGraph> Set.T Resource
54     
55     @private
56     @JavaName getURI
57     uriOfResource :: Resource -> <ReadGraph> String
58     
59     @JavaName getObjects
60     objects_ :: Resource -> Resource -> <ReadGraph> Collection Resource
61     
62     @JavaName getStatements
63     statements_ :: Resource -> Resource -> <ReadGraph> Collection Statement
64     
65     @JavaName hasStatement
66     existsStatement :: Resource -> Resource -> <ReadGraph> Boolean
67     
68     @JavaName hasStatement
69     existsStatement3 :: Resource -> Resource -> Resource -> <ReadGraph> Boolean
70
71     "Assumes that there is exactly one object with the given subject and predicate and returns it."
72     @JavaName getSingleObject
73     singleObject :: Resource -> Resource -> <ReadGraph> Resource
74
75     """
76     If there is exactly one object with the given `subject` and `predicate`,
77     `possibleObject subject predicate` returns it. Otherwise, it returns
78     `Nothing`.
79     """
80     @JavaName getPossibleObject
81     possibleObject :: Resource -> Resource -> <ReadGraph> Maybe Resource
82
83     "Assumes that there is exactly one statement with the given subject and predicate and returns it."
84     @JavaName getSingleStatement
85     singleStatement :: Resource -> Resource -> <ReadGraph> Statement
86
87     @JavaName getRelatedVariantValue
88     relatedVariantValue :: Resource -> Resource -> <ReadGraph> Variant
89
90     @JavaName getRelatedValue
91     relatedValue_ :: Resource -> Resource -> Binding a -> <ReadGraph> a
92     
93     @JavaName getRelatedValue
94     untypedRelatedValue :: Resource -> Resource -> <ReadGraph> a
95
96     @JavaName getRelatedValue2
97     relatedValue2 :: Resource -> Resource -> <ReadGraph> a
98
99     @JavaName getRelatedVariantValue2
100     relatedVariantValue2 :: Resource -> Resource -> <ReadGraph> Variant
101     
102     @JavaName getPossibleRelatedValue
103     possibleRelatedValue_ :: Resource -> Resource -> Binding a -> <ReadGraph> Maybe a
104     
105     @JavaName getPossibleRelatedValue
106     untypedPossibleRelatedValue :: Resource -> Resource -> <ReadGraph> Maybe a
107     
108     @private
109     @JavaName getValue
110     valueOf_ :: Resource -> Binding a -> <ReadGraph> a
111     
112     @private
113     @JavaName getVariantValue
114     variantValueOf_ :: Resource -> <ReadGraph> Variant
115     
116     @JavaName getValue
117     untypedValueOf :: Resource -> <ReadGraph> Dynamic
118     
119     @JavaName getPossibleValue
120     untypedPossibleValueOf :: Resource -> <ReadGraph> Maybe Dynamic
121     
122     @JavaName getInverse
123     inverseOf :: Resource -> <ReadGraph> Resource
124     
125     @JavaName getSingleType
126     singleTypeOf :: Resource -> Resource -> <ReadGraph> Resource
127     
128     @JavaName getPossibleType
129     possibleTypeOf :: Resource -> Resource -> <ReadGraph> Maybe Resource
130     
131     "`isInstanceOf r t` returns true, if `r` is an instance of `t`"
132     isInstanceOf :: Resource -> Resource -> <ReadGraph> Boolean
133     isSubrelationOf :: Resource -> Resource -> <ReadGraph> Boolean
134     isInheritedFrom :: Resource -> Resource -> <ReadGraph> Boolean
135     
136     getRootLibrary :: () -> <ReadGraph> Resource
137
138 importJava "org.simantics.db.layer0.util.ExtendedUris" where
139     "Converts an absolute URI to a resource"
140     @JavaName resolveAbsoluteUri    
141     resource :: String -> <ReadGraph> Resource
142     
143     "Converts a relative URI to a resource starting from the given resource"
144     @JavaName resolveRelativeUri
145     relativeResource :: Resource -> String -> <ReadGraph> Resource
146
147 "Reads the value of a literal that is an object with the given subject and predicate"
148 @inline
149 relatedValue :: Serializable a => Resource -> Resource -> <ReadGraph> a
150 relatedValue s p = relatedValue_ s p binding
151
152 @inline
153 possibleRelatedValue :: Serializable a => Resource -> Resource -> <ReadGraph> Maybe a
154 possibleRelatedValue s p = possibleRelatedValue_ s p binding
155
156 class Browsable a where
157     fromUri :: String -> <ReadGraph> a
158
159     "Returns the URI of the given value."
160     uriOf :: a -> <ReadGraph> String
161   
162     "Reads the name of the value."
163     nameOf :: a -> <ReadGraph> String
164     possibleNameOf :: a -> <ReadGraph> Maybe String
165     
166     valueOf :: Serializable v => a -> <ReadGraph> v
167     
168     variantValueOf :: a -> <ReadGraph> Variant 
169     
170     children :: a -> <ReadGraph> [a]
171     parent :: a -> <ReadGraph> a
172     possibleParent :: a -> <ReadGraph> Maybe a
173     
174     child :: a -> String -> <ReadGraph> a
175     possibleChild :: a -> String -> <ReadGraph> Maybe a
176     
177 instance Browsable Resource where
178     fromUri = resource
179     uriOf = uriOfResource
180     nameOf r = relatedValue r L0.HasName
181     possibleNameOf r = possibleRelatedValue r L0.HasName
182     @inline
183     valueOf r = valueOf_ r binding
184     variantValueOf = variantValueOf_
185     
186     children r = r # L0.ConsistsOf
187     parent r = singleObject r L0.PartOf
188     possibleParent r = possibleObject r L0.PartOf
189     
190     possibleChild = possibleResourceChild
191     child r n = fromJust (possibleResourceChild r n)
192
193 importJava "org.simantics.db.WriteOnlyGraph" where
194     markUndoPoint :: () -> <WriteGraph> ()
195
196 importJava "org.simantics.db.WriteGraph" where
197     "Creates a new resource."
198     newResource :: () -> <WriteGraph> Resource
199     "Adds a statement to the semantic graph."
200     claim :: Resource -> Resource -> Resource -> <WriteGraph> ()
201     @JavaName claimLiteral
202     claimRelatedValue_ :: Resource -> Resource -> a -> Binding a -> <WriteGraph> ()
203     @JavaName claimLiteral
204     untypedClaimRelatedValue :: Resource -> Resource -> a -> <WriteGraph> ()
205     @JavaName claimValue
206     untypedClaimValue :: Resource -> a -> <WriteGraph> ()
207     @JavaName claimLiteral
208     claimRelatedValueWithType_ :: Resource -> Resource -> Resource -> a -> Binding a -> <WriteGraph> ()
209     "Removes a statement with the given subject, predicate and object"
210     deny :: Resource -> Resource -> Resource -> <WriteGraph> ()
211     @JavaName deny
212     denyByPredicate :: Resource -> Resource -> <WriteGraph> ()
213     @JavaName deny
214     denyAllStatements :: Resource -> <WriteGraph> ()
215     newClusterSet :: Resource -> <WriteGraph> ()
216     @JavaName denyValue
217     denyValue :: Resource -> <WriteGraph> ()
218
219 claimAssertion :: Resource -> Resource -> Resource -> <WriteGraph> ()
220 claimAssertion type_ predicate object = do
221     ass = newResource ()
222     claim ass L0.HasPredicate predicate
223     claim ass L0.HasObject object
224     claim type_ L0.Asserts ass
225
226 "Sets the value of the literal that is an object with the given subject and predicate."
227 @inline
228 claimRelatedValue :: Serializable a => Resource -> Resource -> a -> <WriteGraph> ()
229 claimRelatedValue s p v = claimRelatedValue_ s p v binding
230
231 @inline
232 claimRelatedValueWithType :: Serializable a => Resource -> Resource -> Resource -> a -> <WriteGraph> ()
233 claimRelatedValueWithType s p t v = claimRelatedValueWithType_ s p t v binding
234
235 importJava "org.simantics.layer0.utils.direct.GraphUtils" where
236     @JavaName getPossibleChild
237     possibleResourceChild :: Resource -> String -> <ReadGraph> (Maybe Resource)
238
239 @deprecated "Use function children instead."
240 resourceChildrenOf :: Resource -> <ReadGraph> [Resource]
241 resourceChildrenOf r = r # L0.ConsistsOf
242
243 importJava "org.simantics.db.common.utils.OrderedSetUtils" where
244     @JavaName add
245     addToOrderedSet :: Resource -> Resource -> <WriteGraph> Boolean
246     
247     @JavaName set
248     setOrderedSet :: Resource -> [Resource] -> <WriteGraph> Boolean
249     
250     @JavaName getSingleOwnerList
251     parentOrderedSet :: Resource -> <ReadGraph> Resource
252     
253     @JavaName toList
254     elementsOfOrderedSet :: Resource -> <ReadGraph> [Resource]
255     
256 importJava "org.simantics.db.common.utils.ListUtils" where
257     @JavaName toList
258     elementsOfList :: Resource -> <ReadGraph> [Resource]
259
260 importJava "org.simantics.db.common.utils.CommonDBUtils" where
261     isParent :: Resource -> Resource -> <ReadGraph> Boolean
262     possibleRelatedString :: Resource -> Resource -> <ReadGraph> Maybe String
263     possibleRelatedInteger :: Resource -> Resource -> <ReadGraph> Maybe Integer
264     objectsWithType :: Resource -> Resource -> Resource -> <ReadGraph> [Resource]
265     possibleObjectWithType :: Resource -> Resource -> Resource -> <ReadGraph> Maybe Resource
266
267 importJava "org.simantics.db.common.utils.NameUtils" where
268     findFreshName :: String -> Resource -> <ReadGraph> String
269     findFreshEscapedName :: String -> Resource -> <ReadGraph> String
270
271 "`subject # predicate` returns all objects with the given `subject` and `predicate`."
272 (#) :: Resource -> Resource -> <ReadGraph> [Resource]
273 subject # predicate = collectionToList $ objects_ subject predicate
274
275 "statements subject predicate` returns all statements with the given subject and predicate."
276 statements :: Resource -> Resource -> <ReadGraph> [Statement]
277 statements subject predicate = collectionToList $ statements_ subject predicate
278
279 importJava "org.simantics.scl.db.SCLFunctions" where
280     "Executes a read transaction and waits that it completes."
281     syncRead :: (() -> <Proc,ReadGraph> a) -> <Proc> a
282     "Executes a write transaction and waits that it completes."
283     syncWrite :: (() -> <Proc,ReadGraph,WriteGraph> a) -> <Proc> a
284     "Executes a delayed write transaction and waits that it completes."
285     delayedSyncWrite :: (() -> <Proc,WriteGraph> a) -> <Proc> a
286     
287     "Begins a read transaction and immediately returns."
288     asyncRead :: (() -> <Proc,ReadGraph> a) -> <Proc> ()
289     "Begins a write transaction and immediately returns."
290     asyncWrite :: (() -> <Proc,ReadGraph,WriteGraph> a) -> <Proc> ()
291     
292     virtualSyncWriteMem :: String -> (() -> <ReadGraph,WriteGraph> a) -> <WriteGraph> a
293     virtualSyncWriteWS :: String -> (() -> <ReadGraph,WriteGraph> a) -> <WriteGraph> a
294     
295     safeExec :: (() -> <Proc> a) -> <Proc> a
296     activateOnce :: Resource -> <Proc> ()
297     syncActivateOnce :: Resource -> <WriteGraph, Proc> ()
298     resourceFromId :: Long -> <ReadGraph> Resource
299     enableDependencies :: () -> <WriteGraph> ()
300     disableDependencies :: () -> <WriteGraph> ()
301     
302     unaryQuery :: (a -> <ReadGraph,e> b) -> a -> <ReadGraph> b
303     unaryQueryCached :: (a -> <ReadGraph,e> b) -> a -> <ReadGraph> b
304
305     "Makes a new read request with given procedure for calculating the result. The request is cached only if the current request is listened."
306     subquery :: (<ReadGraph,Proc> a) -> <ReadGraph,Proc> a
307     "Makes a new read request with given procedure for calculating the result. The request is always cached."
308     subqueryC :: (<ReadGraph,Proc> a) -> <ReadGraph,Proc> a
309
310 importJava "org.simantics.db.layer0.util.Layer0Utils" where
311     undo :: () -> <Proc> String
312     undoOperations :: Integer -> <Proc> String
313     redo :: () -> <Proc> String
314     queryDebugSupport :: String -> <Proc> String
315     queryListSupport :: String -> <Proc> String
316     addCommentMetadata :: String -> <WriteGraph> ()
317     sortByCluster :: [a] -> (a->Resource) -> <ReadGraph> [a]
318     makeSynchronous :: Boolean -> <ReadGraph> ()
319     listOntologies :: () -> <ReadGraph> [Resource]
320     emptyTrashBin :: () -> <Proc> ()
321     purgeDatabase :: () -> <Proc> ()
322
323     @private
324     @JavaName copyTo
325     copyTo_ :: Resource -> Resource -> <WriteGraph> Collection Resource
326     @JavaName getPossiblePredicateByName
327     possiblePredicateByName :: Resource -> String -> <ReadGraph> Maybe Resource
328
329 copyTo :: Resource -> Resource -> <WriteGraph> Resource
330 copyTo targetContainer source = do
331     (collectionToList $ copyTo_ targetContainer source)!0
332
333 importJava "org.simantics.db.common.utils.CommonDBUtils" where
334     selectClusterSet :: Resource -> <WriteGraph> () 
335
336 importJava "org.simantics.Simantics" where
337     @JavaName getProjectResource
338     currentProject :: () -> /*<Proc>*/ Resource
339
340 // Move to somewhere more generic module
341 importJava "java.util.Collection" where
342     data Collection a
343
344 importJava "java.util.ArrayList" where
345     @JavaName "<init>"
346     collectionToList :: Collection a -> [a]
347 /*@macro
348 collectionToList :: Collection a -> [a]
349 collectionToList x = Java.unsafeCoerce x
350 */ 
351
352 resourceToCollection :: a -> Collection a
353 resourceToCollection x = Java.unsafeCoerce x
354
355 newEntity :: [Resource -> <ReadGraph,WriteGraph> ()] -> <ReadGraph,WriteGraph> Resource
356 newEntity entitySpecs = do
357     entity = newResource ()
358     for entitySpecs (\spec -> spec entity)
359     entity
360
361 updateEntity :: Resource -> [Resource -> <ReadGraph,WriteGraph> ()] -> <ReadGraph,WriteGraph> Resource
362 updateEntity entity entitySpecs = do
363     for entitySpecs (\spec -> spec entity)
364     entity
365
366 hasStatement predicate object entity = 
367     claim entity predicate object
368 hasProperty relation value entity = 
369     claimRelatedValue entity relation value
370 hasPossibleProperty relation value entity =
371     match value with
372       Just v -> claimRelatedValue entity relation v
373       Nothing -> ()
374 hasTypedProperty relation value t entity = 
375     claimRelatedValueWithType entity relation t value        
376 hasName (n :: String) = hasProperty L0.HasName n
377 hasLabel (l :: String) = hasProperty L0.HasLabel l
378 hasType t = hasStatement L0.InstanceOf t
379 hasParent p = hasStatement L0.PartOf p
380
381 importJava "org.simantics.databoard.util.URIStringUtils" where
382     @JavaName splitURISCL
383     splitURI :: String -> [String]
384     @JavaName escape
385     escapeURI :: String -> String
386     @JavaName unescape
387     unescapeURI :: String -> String
388
389 @private
390 importJava "org.simantics.db.layer0.request.ActiveModels" where
391     @JavaName getPossibleActiveModel
392     activeModel :: Resource -> <ReadGraph> Maybe Resource
393
394 "Gives the current active model."
395 currentModel :: <ReadGraph> Resource
396 currentModel = match activeModel (currentProject ()) with
397     Just model -> model
398     Nothing -> fail "No active model."
399
400 startUndoPoint :: String -> <WriteGraph> ()
401 startUndoPoint string = do
402     markUndoPoint ()
403     addCommentMetadata (string)
404     ()
405
406 @inline
407 lift1Read :: (a -> <ReadGraph,Proc> b) -> (a -> <Proc> b)
408 lift1Read f x = syncRead (\_ -> f x)
409
410 @inline
411 lift2Read :: (a -> b -> <ReadGraph,Proc> c) -> (a -> b -> <Proc> c)
412 lift2Read f x y = syncRead (\_ -> f x y)
413
414 @inline
415 lift3Read :: (a -> b -> c -> <ReadGraph,Proc> d) -> (a -> b -> c -> <Proc> d)
416 lift3Read f x y z = syncRead (\_ -> f x y z)
417
418 @inline
419 lift1Write :: (a -> <WriteGraph,Proc> b) -> (a -> <Proc> b)
420 lift1Write f x = syncWrite (\_ -> f x)
421
422 @inline
423 lift2Write :: (a -> b -> <WriteGraph,Proc> c) -> (a -> b -> <Proc> c)
424 lift2Write f x y = syncWrite (\_ -> f x y)
425
426 @inline
427 lift3Write :: (a -> b -> c -> <WriteGraph,Proc> d) -> (a -> b -> c -> <Proc> d)
428 lift3Write f x y z = syncWrite (\_ -> f x y z)
429
430 """
431 Returns a child Browsable of the specified parent that has that is the child
432 of the specified parent with the specified name path.
433 """
434 childWithPath :: Browsable a => a -> [String] -> <ReadGraph> a
435 childWithPath parent path = 
436     foldl (\r name -> match possibleChild r name with
437               Just c -> c
438               Nothing -> fail ("Didn't find " + name + ".") 
439           ) 
440           parent path
441
442 """
443 Like `childWithPath` but returns Maybe a which will be `Nothing` if no child
444 was found.
445 """
446 possibleChildWithPath :: Browsable a => a -> [String] -> <ReadGraph> Maybe a
447 possibleChildWithPath parent path = 
448     foldl (\r name -> match r with
449               Just c -> possibleChild c name
450               Nothing -> Nothing 
451           ) 
452           (Just parent) path