Predicate-Based Queries
This page relates to Scala
Support for predicate based queries on the GigaSpace
proxy has been in added. This support is based on the new macros feature introduced in Scala 2.10. Each predicate based query is transformed during compilation into an equivalent SQLQuery.
Usage
To use predicate based queries, import import org.openspaces.scala.core.ScalaGigaSpacesImplicits._
into scope. Then call the predicate
method on the GigaSpace
instance as demonstrated:
/* Import GigaSpace implicits into scope */
import org.openspaces.scala.core.ScalaGigaSpacesImplicits._
/* implicit conversion on gigaspace returns a wrapper class with predicate based query methods */
val predicateGigaSpace = gigaSpace.predicate
Supported Queries
Example data class
For the purpose of demonstration, we will use the following example data class
case class Person @SpaceClassConstructor() (
@BeanProperty
@SpaceId
id: String = null,
@BeanProperty
name: String = null,
@BeanProperty
@SpaceProperty(nullValue = "-1")
@SpaceIndex(`type` = SpaceIndexType.ORDERED)
height: Int = -1,
@BeanProperty
birthday: Date = null,
@BeanProperty
son: Person = null
)
Translations
Predicate Query | Translated SQL Query |
---|---|
== predicateGigaSpace read { person: Person => person.name == "john"} |
= gigaSpace read new SQLQuery(classOf[Person], "name = ?", "john") |
!= predicateGigaSpace read { person: Person => person.name != "john"} |
<> gigaSpace read new SQLQuery(classOf[Person], "name <> ?", "john") |
>
predicateGigaSpace read { person: Person => person.height > 10} |
> gigaSpace read new SQLQuery(classOf[Person], "height > ?", 10: Integer) |
>= predicateGigaSpace read { person: Person => person.height >= 10} |
>= gigaSpace read new SQLQuery(classOf[Person], "height >= ?", 10: Integer) |
<
predicateGigaSpace read { person: Person => person.height < 10} |
< gigaSpace read new SQLQuery(classOf[Person], "height < ?", 10: Integer) |
<= predicateGigaSpace read { person: Person => person.height <= 10} |
<=
gigaSpace read new SQLQuery(classOf[Person], "height <= ?", 10: Integer) |
&& predicateGigaSpace read { person: Person => person.height > 10 && person.height < 100 } |
AND
gigaSpace read new SQLQuery(classOf[Person], "( height > ? ) AND ( height < ? )", 10: Integer, 100: Integer) |
` | |
eq null predicateGigaSpace read { person: Person => person.name eq null} |
is null
gigaSpace read new SQLQuery(classOf[Person], "name is null", QueryResultType.OBJECT ) |
ne null predicateGigaSpace read { person: Person => person.name ne null} |
is NOT null
gigaSpace read new SQLQuery(classOf[Person], "name is NOT null", QueryResultType.OBJECT) |
like // Implicit conversion on java.lang.String predicateGigaSpace read { person: Person => person.name like "j%"} |
like
gigaSpace read new SQLQuery(classOf[Person], "name like "j%'", QueryResultType.OBJECT) |
notLike predicateGigaSpace read { person: Person => person.name notLike "j%"} |
NOT like
gigaSpace read new SQLQuery(classOf[Person], "name NOT like "j%'", QueryResultType.OBJECT) |
rlike predicateGigaSpace read { person: Person => person.name rlike "j.*"} |
rlike
gigaSpace read new SQLQuery(classOf[Person], "name rlike "j.*'", QueryResultType.OBJECT) |
Nested Queries predicateGigaSpace read { person: Person => person.son.name == "dave"} |
gigaSpace read new SQLQuery(classOf[Person], "son.name = ?", "dave") |
Date // implicit conversion on java.util.Date predicateGigaSpace read { person: Person => person.birthday < janesBirthday} |
gigaSpace read new SQLQuery(classOf[Person], "birthday < ?", janesBirthday) |
Date predicateGigaSpace read { person: Person => person.birthday <= janesBirthday} |
gigaSpace read new SQLQuery(classOf[Person], "birthday <= ?", janesBirthday) |
Date predicateGigaSpace read { person: Person => person.birthday > janesBirthday} |
gigaSpace read new SQLQuery(classOf[Person], "birthday > ?", janesBirthday) |
Date predicateGigaSpace read { person: Person => person.birthday >= janesBirthday} |
gigaSpace read new SQLQuery(classOf[Person], "birthday >= ?", janesBirthday) |
select // select is imported into scope predicateGigaSpace read { person: Person => select(person.name, person.birthday) person.id == someId} |
setProjections gigaSpace read new SQLQuery(classOf[Person], "id = ?", someId ).setProjections("name, birthday") |
orderBy
// orderBy is imported into scope predicateGigaSpace read { person: Person => orderBy(person.birthday) person.nickName eq null} |
ORDER BY
gigaSpace read new SQLQuery(classOf[Person], "nickName is null ORDER BY birthday", QueryResultType.OBJECT) |
orderBy().ascending
predicateGigaSpace read { person: Person => orderBy(person.birthday)==.ascending person.nickName eq null} |
ORDER BY ... ASC
gigaSpace read new SQLQuery(classOf[Person], "nickName is null ORDER BY birthday ASC", QueryResultType.OBJECT) |
orderBy().descending
predicateGigaSpace read { person: Person => orderBy(person.birthday).descending person.nickName eq null} |
ORDER BY ... DESC
gigaSpace read new SQLQuery(classOf[Person], "nickName is null ORDER BY birthday DESC", QueryResultType.OBJECT) |
groupBy
// groupBy is imported into scope predicateGigaSpace read { person: Person => groupBy(person.birthday) person.nickName eq null} |
GROUP BY
gigaSpace read new SQLQuery(classOf[Person], "nickName is null GROUP BY birthday", QueryResultType.OBJECT) |