Packages

  • package root

    Documentation/API for the Molecule library - a meta DSL for the Datomic database.

    Manual | scalamolecule.org | Github | Forum

    Definition Classes
    root
  • package molecule

    Molecule library - a Scala meta-DSL for the Datomic database.

    Molecule library - a Scala meta-DSL for the Datomic database.

    See api package for various api imports to start using Molecule.

    Sub-packages

    api Molecule API.
    ast Internal Molecule ASTs.
    boilerplate Internal interfaces for auto-generated DSL boilerplate code.
    composition    Builder methods to compose molecules.
    exceptions Exceptions thrown by Molecule.
    expression Attribute expressions and operations.
    facade Molecule facades to Datomic.
    factory Implicit macro methods `m` to instantiate molecules from custom DSL molecule constructs.
    input Input molecules awaiting input.
    macros Internal macros generating molecule code from custom DSL molecule constructs.
    generic Interfaces to generic information about datoms and Datomic database.
    ops Internal operational helpers for transforming DSL to molecule.
    schema Schema definition DSL.
    transform Internal transformers from DSL to Model/Query/Transaction.
    util Internal Java database functions for Datomic.

    Definition Classes
    root
  • package expression

    Attribute expressions and operations.

    Attribute expressions and operations.

    Refine attribute matches with various attribute expressions:

    Person.age(42)                           // equality
    Person.name.contains("John")             // fulltext search
    Person.age.!=(42)                        // negation (or `not`)
    Person.age.<(42)                         // comparison (< > <= >=)
    Person.name("John" or "Jonas")           // OR-logic
    Person.age()                             // apply empty value to retract value(s) in updates
    Person.hobbies.assert("golf")               // add value(s) to card-many attributes
    Person.hobbies.retract("golf")            // retract value(s) of card-many attributes
    Person.hobbies.replace("golf", "diving") // replace value(s) of card-many attributes
    Person.tags.k("en")                      // match values of map attributes by key
    Person.age(Nil)                          // match non-asserted datoms (null)
    Person.name(?)                           // initiate input molecules awaiting input at runtime
    Person.name(unify)                       // Unify attributes in self-joins

    Apply aggregate keywords to aggregate attribute value(s):

    // Aggregates on any attribute type
    Person.age(count).get.head         === 3   // count of asserted `age` attribute values
    Person.age(countDistinct).get.head === 3   // count of asserted distinct `age` attribute values
    Person.age(max).get.head           === 38  // maximum `age` value (using `compare`)
    Person.age(min).get.head           === 5   // maximum `age` value (using `compare`)
    Person.age(rand).get.head          === 25  // single random `age` value
    Person.age(sample).get.head        === 27  // single sample `age` value (when single value, same as random)
    
    // Aggregates on any attribute type, returning multiple values
    Person.age(distinct).get.head  === Vector(5, 7, 38)  // distinct `age` values
    Person.age(max(2)).get.head    === Vector(38, 7)     // 2 maximum `age` values
    Person.age(min(2)).get.head    === Vector(5, 7)      // 2 minimum `age` values
    Person.age(rand(2)).get.head   === Stream(5, ?)      // 2 random `age` values (values can re-occur)
    Person.age(sample(2)).get.head === Vector(7, 38)     // 2 sample `age` values
    
    // Aggregates on number attributes
    Person.age(sum).get.head      === 50               // sum of all `age` numbers
    Person.age(avg).get.head      === 16.66666667      // average of all `age` numbers
    Person.age(median).get.head   === 7                // median of all `age` numbers
    Person.age(stddev).get.head   === 15.107025591499  // standard deviation of all `age` numbers
    Person.age(variance).get.head === 228.2222222222   // variance of all `age` numbers
    Definition Classes
    molecule
    See also

    Manual: expressions | aggregates | input molecules

    Tests: expressions

  • AggregateKeywords
  • AggregateKeywordsSchema
  • AttrExpressions
  • LogicImplicits

trait AggregateKeywords extends AnyRef

Aggregate keywords to mark aggregate expressions on attributes.

// Aggregates on any attribute type
Person.age(count).get.head         === 3   // count of asserted `age` attribute values
Person.age(countDistinct).get.head === 3   // count of asserted distinct `age` attribute values
Person.age(max).get.head           === 38  // maximum `age` value (using `compare`)
Person.age(min).get.head           === 5   // maximum `age` value (using `compare`)
Person.age(rand).get.head          === 25  // single random `age` value
Person.age(sample).get.head        === 27  // single sample `age` value (when single value, same as random)

// Aggregates on any attribute type, returning multiple values
Person.age(distinct).get.head  === Vector(5, 7, 38)  // distinct `age` values
Person.age(max(2)).get.head    === Vector(38, 7)     // 2 maximum `age` values
Person.age(min(2)).get.head    === Vector(5, 7)      // 2 minimum `age` values
Person.age(rand(2)).get.head   === Stream(5, ?)      // 2 random `age` values (values can re-occur)
Person.age(sample(2)).get.head === Vector(7, 38)     // 2 sample `age` values

// Aggregates on number attributes
Person.age(sum).get.head      === 50               // sum of all `age` numbers
Person.age(avg).get.head      === 16.66666667      // average of all `age` numbers
Person.age(median).get.head   === 7                // median of all `age` numbers
Person.age(stddev).get.head   === 15.107025591499  // standard deviation of all `age` numbers
Person.age(variance).get.head === 228.2222222222   // variance of all `age` numbers
Source
AggregateKeywords.scala
See also

Manual | Tests

Linear Supertypes
AnyRef, Any
Type Hierarchy
Ordering
  1. Grouped
  2. Alphabetic
  3. By Inheritance
Inherited
  1. AggregateKeywords
  2. AnyRef
  3. Any
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. Protected

Type Members

  1. trait avg extends AnyRef

    Average of attribute values.

    Average of attribute values.

    Apply avg keyword to attribute to return average of attribute values of entities matching the molecule.

    Match.score.insert(1, 2, 4)
    Match.score(avg).get.head === 2.3333333333333335 // (1 + 2 + 4) / 3
    returns

    Double

  2. trait count extends AnyRef

    Count of attribute values.

    Count of attribute values.

    Apply count keyword to attribute to return count of attribute values of entities matching the molecule.

    Person.firstName.lastName.age insert List(
      ("Ben", "Hayday", 42),
      ("Liz", "Taylor", 34),
      ("Liz", "Swifty", 34),
      ("Liz", "Mooray", 25)
    )
    Person.firstName.age(count).get === List(
      ("Ben", 1),
      ("Liz", 3) // 34, 34, 25
    )
    returns

    Int

  3. trait countDistinct extends AnyRef

    Count of distinct attribute values.

    Count of distinct attribute values.

    Apply countDistinct keyword to attribute to return count of distinct attribute values of entities matching the molecule.

    Person.firstName.lastName.age insert List(
      ("Ben", "Hayday", 42),
      ("Liz", "Taylor", 34),
      ("Liz", "Swifty", 34),
      ("Liz", "Mooray", 25)
    )
    Person.firstName.age(countDistinct).get === List(
      ("Ben", 1),
      ("Liz", 2) // 34, 25
    )
    returns

    Int

  4. trait distinct extends AnyRef

    Distinct attribute values.

    Distinct attribute values.

    Apply distinct keyword to attribute to return Vector of distinct attribute values of entities matching the molecule.

    Person.firstName.lastName.age insert List(
      ("Ben", "Hayday", 42),
      ("Liz", "Taylor", 34),
      ("Liz", "Swifty", 34),
      ("Liz", "Mooray", 25)
    )
    Person.firstName.age(distinct) insert List(
      ("Ben", 42),
      ("Liz", Vector(34, 25)) // only single 34 returned
    )
    returns

    List[attribute-type]

  5. trait max extends AnyRef

    Maximum attribute value(s).

    Maximum attribute value(s).

    Apply max keyword to attribute to return the maximum attribute value of entities matching the molecule.

    Person.age.insert(25, 34, 37, 42, 70)
    Person.age(max).get.head === 70

    Apply max(n) to return Vector of the n biggest values.

    Person.age(max(3)).get.head === Vector(37, 42, 70)
    Note

    max/max(n) supports all value types (via comparators).
    max(n) Can at most return the number of values that match.

  6. trait maxs extends AnyRef
  7. trait median extends AnyRef

    Median of attribute values.

    Median of attribute values.

    Apply median keyword to attribute to return median of attribute values of entities matching the molecule.

    Match.score.insert(1, 2, 4)
    Match.score(median).get.head === 2

    OBS: When it comes to an even number of values, Datomic has a special implementation of median that is different from the one described on the Wiki entry on the median function.

    Datomic calculates the median of even number of values as the average of the two middle numbers rounded down to nearest whole number

    Match.score.insert(1, 2, 3, 4)
    Match.score(median).get.head === 2 // (2 + 3) / 2 = 2.5 rounded down to 2

    With decimal numbers this can go wrong:

    Match.score.insert(1.0, 2.5, 2.5, 3.0)
    Match.score(median).get.head === 2 // (2.5 + 2.5) / 2 = 2.5 rounded down to 2 (This is wrong and bug report has been filed)
    returns

    Value of Attribute type

  8. trait min extends AnyRef

    Minimum attribute value(s).

    Minimum attribute value(s).

    Apply min keyword to attribute to return the minimum attribute value of entities matching the molecule.

    Person.age.insert(25, 34, 37, 42, 70)
    Person.age(min).get.head === 25

    Apply min(n) to return Vector of the n smallest values.

    Person.age(min(3)).get.head === Vector(25, 34, 37)
    Note

    min/min(n) supports all value types (via comparators).
    min(n) Can at most return the number of values that match.

  9. trait mins extends AnyRef
  10. trait rand extends AnyRef

    Random attribute value(s).

    Random attribute value(s).

    Apply random keyword to attribute to return a single random attribute of entities matching the molecule.

    Person.age.insert(25, 34, 37, 42, 70)
    Person.age(random).get.head === 34 // or other..

    Apply random(n) to return Vector of n random values. Observe though that duplicate random values can re-occur.

    Person.age(random(3)).get.head === Vector(42, 25, 42) // or other..

    To get distinct values only, use the sample(n) keyword instead.

  11. trait rands extends AnyRef
  12. trait sample extends AnyRef

    Sample attribute value(s).

    Sample attribute value(s).

    Apply sample keyword to attribute to return a single sample (random) attribute value of entities matching the molecule.

    Person.age.insert(25, 34, 37, 42, 70)
    Person.age(sample).get.head === 42 // or other..

    Apply sample(n) to return Vector of up to n distinct sample values.

    Person.age(sample(3)).get.head === Vector(70, 25, 37) // or other..

    If values don't need to be distinct, random(n) can be used also.

    Note

    Can at most return the number of values that match.

  13. trait samples extends AnyRef
  14. trait stddev extends AnyRef

    Variance of attribute values.

    Variance of attribute values.

    Apply stddev keyword to attribute to return variance of attribute values of entities matching the molecule.

    Match.score.insert(1, 2, 4)
    Match.score(stddev).get.head === 1.247219128924647
    returns

    Double

  15. trait sum extends AnyRef

    Sum of attribute values.

    Sum of attribute values.

    Apply sum keyword to attribute to return sum of attribute values of entities matching the molecule.

    Match.score.insert(1, 2, 4)
    Match.score(sum).get.head === 7
    returns

    Value of Attribute type

  16. trait variance extends AnyRef

    Variance of attribute values.

    Variance of attribute values.

    Apply variance keyword to attribute to return variance of attribute values of entities matching the molecule.

    Match.score.insert(1, 2, 4)
    Match.score(variance).get.head === 1.5555555555555556
    returns

    Double

Value Members

  1. final def !=(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  2. final def ##: Int
    Definition Classes
    AnyRef → Any
  3. final def ==(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  4. final def asInstanceOf[T0]: T0
    Definition Classes
    Any
  5. def clone(): AnyRef
    Attributes
    protected[lang]
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.CloneNotSupportedException]) @native()
  6. final def eq(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  7. def equals(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef → Any
  8. def finalize(): Unit
    Attributes
    protected[lang]
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.Throwable])
  9. final def getClass(): Class[_ <: AnyRef]
    Definition Classes
    AnyRef → Any
    Annotations
    @native()
  10. def hashCode(): Int
    Definition Classes
    AnyRef → Any
    Annotations
    @native()
  11. final def isInstanceOf[T0]: Boolean
    Definition Classes
    Any
  12. final def ne(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  13. final def notify(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native()
  14. final def notifyAll(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native()
  15. final def synchronized[T0](arg0: => T0): T0
    Definition Classes
    AnyRef
  16. def toString(): String
    Definition Classes
    AnyRef → Any
  17. final def wait(): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.InterruptedException])
  18. final def wait(arg0: Long, arg1: Int): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.InterruptedException])
  19. final def wait(arg0: Long): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.InterruptedException]) @native()

Inherited from AnyRef

Inherited from Any

Aggregate keywords

Keywords applied to attributes that return aggregated value(s).

Number aggregation keywords

Keywords applied to number attributes that return aggregated value(s).

Ungrouped