Referência para Consultas do eXtreme Scale

WebSphere eXtreme Scale tem sua própria linguagem por meio da qual o usuário pode consultar dados.

Cláusula FROM de Consulta do ObjectGrid

A cláusula FROM especifica as coleções de objetos aos quais a consulta deve ser aplicada. Cada coleta é identificada ou por um nome de esquema abstrato e uma variável de identificação, chamada uma variável de intervalo, ou por uma declaração de membro de coleta que identifica um relacionamento com valor único e com vários valores e uma variável de identificação.

Conceitualmente, a semântica da consulta serve para primeiro formar uma coleta temporária de tuplas, referidas como R. As tuplas são compostas de elementos das coletas que são identificadas na cláusula FROM. Cada tupla contém um elemento de cada uma das coleções na cláusula FROM. Todas as combinações possíveis são formadas sujeitas às restrições impostas pelas declarações de membros da coleta. Se algum nome de esquema identificar uma coleta para a qual não existem registros no armazenamento persistente, a coleta temporária R será vazia.

Exemplos utilizando FROM

O objeto DeptBean contém os registros 10, 20 e 30. O objeto EmpBean contém os registros 1, 2 e 3 que são relacionados ao departamento 10 e os registros 4 e 5 que são relacionados ao departamento 20. O departamento 30 não possui funcionários.

FROM DeptBean d, EmpBean e

Essa cláusula forma uma coleta temporária R que contém 15 tuplas.

FROM DeptBean d, DeptBean d1

Essa cláusula forma uma coleta temporária R que contém 9 tuplas.

FROM DeptBean d, IN (d.emps) AS e

Essa cláusula forma uma coleta temporária R que contém 5 tuplas. O departamento 30 não está na coleta temporária R porque não contém funcionários. O departamento 10 estará contido na coleta temporária R três vezes e o departamento 20 estará contido em R duas vezes.

Em vez de utilizar IN(d.emps) como e, será possível utilizar um predicado JOIN:

FROM DeptBean d JOIN d.emps as e

Depois de formar a coleta temporária, as condições de procura da cláusula WHERE serão aplicadas à coleta temporária R e isso produzirá uma nova coleta temporária R1. As cláusulas ORDER BY e SELECT são aplicadas a R1 para resultar no conjunto de resultados final.

Uma variável de identificação é uma variável declarada na cláusula FROM utilizando o operador IN ou o operador AS opcional.

FROM DeptBean AS d, IN (d.emps) AS e

é equivalente a:

FROM DeptBean d, IN (d.emps) e

Uma variável de identificação que é declarada para ser um nome de esquema abstrato é chamada uma variável de faixa. Na consulta anterior, "d" é uma variável de intervalo. Uma variável de identificação que é declarada para ser uma expressão de caminho com diversos valores é chamada uma declaração de membro de coleta. Os valores "d" e "e" no exemplo anterior são declarações do membro de coleta.

A seguir, está um exemplo de utilização de uma expressão de caminho com valor único na cláusula FROM:

FROM EmpBean e, IN(e.dept.mgr) as m

Cláusula SELECT de Consulta do ObjectGrid

A sintaxe da cláusula SELECT é ilustrada no seguinte exemplo:

SELECT { ALL | DISTINCT } [ seleção , ]* seleção

selection  ::= {single_valued_path_expression |
                identification_variable |
                OBJECT ( identification_variable) |
	       aggregate_functions } [[ AS ] id ]

A cláusula SELECT consiste em um ou mais dos seguintes elementos: uma única variável de identificação, definida na cláusula FROM, ou uma expressão de caminho com valor único que é avaliada para referências ou valores do objeto e uma função agregada. É possível utilizar a palavra-chave DISTINCT para eliminar as referências duplicadas.

Uma subseleção-escalar é uma subseleção que retorna um único valor.

Exemplos utilizando SELECT

Localizar todos os funcionários que ganham mais que João:

SELECT OBJECT(e) FROM EmpBean ej, EmpBean eWHERE ej.name = 'John' and e.salary > ej.salary

Localizar todos os departamentos que têm um ou mais funcionários que ganham menos de 20000:

SELECT DISTINCT e.dept FROM EmpBean e where e.salary < 20000

Uma consulta que pode ter uma expressão de caminho que seja avaliada para um valor arbitrário:

SELECT e.dept.name FROM EmpBean e where e.salary < 20000

A consulta anterior retorna uma coleta de valores de nomes para os departamentos que possuem funcionários que ganham menos de 20000.

Uma consulta pode retornar um valor agregado:

SELECT avg(e.salary) FROM EmpBean e

Uma consulta que recupera os nomes e as referências do objeto para funcionário não remunerados a seguir:

SELECT e.name as name , object(e) as emp from EmpBean e where e.salary < 50000

Cláusula WHERE de Consulta do ObjectGrid

A cláusula WHERE contém condições de procura que são compostos dos elementos apresentados abaixo. Quando uma condição de procura é avaliada como TRUE, a tupla é incluída no conjunto de resultados.

Literais de Consulta do ObjectGrid

Um literal de cadeia é delimitado por aspas simples. Uma aspa simples que ocorre dentro de uma cadeia literal é representada por duas aspas simples, por exemplo: 'Tom''s'.

Um literal numérico pode ser qualquer um dos seguintes valores:

  • Um valor exato como 57, -957 ou +66
  • Qualquer valor suportado pelo tipo long Java
  • Um literal decimal como 57,5 ou -47,02
  • Um valor numérico aproximado como 7E3 ou -57.4E-2
  • Tipos float devem incluir o qualificador "F", por exemplo, 1.0F
  • Tipos long devem incluir o qualificador "L", por exemplo, 123L

Os literais booleanos são TRUE e FALSE.

Os literais temporais seguem a sintaxe de escape JDBC baseada no tipo de atributo:

  • java.util.Date: aaaa-mm-ss
  • java.sql.Date: aaaa-mm-ss
  • java.sql.Time: hh-mm-ss
  • java.sql.Timestamp: aaaa-mm-dd hh:mm:ss.f...
  • java.util.Calendar: aaaa-mm-dd hh:mm:ss.f...

Os literais de enumeração são expressos usando a sintaxe de literal de enumeração Java com um nome de classe de enumeração completo.

Parâmetros de Entrada de Consulta do ObjectGrid

É possível especificar parâmetros de entrada utilizando uma posição ordinal ou um nome de variável. A gravação de consultas que utilizam parâmetros de entrada é bastante incentivada, porque o uso de parâmetros de entrada aumenta o desempenho, permitindo que o ObjectGrid capture o plano da consulta entre ações em execução.

Um parâmetro de entrada pode ser um dos seguintes tipos: Byte, Short, Integer, Long, Float, Double, BigDecimal, BigInteger, String, Boolean, Char, java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp, java.util.Calendar, uma enumeração Java SE 5, uma Entity ou POJO Object ou uma cadeia de dados binários no formato Java byte[].

Um parâmetro de entrada não pode ter um valor NULL. Para procurar pela ocorrência de um valor NULL, utilize o predicado NULL.

Parâmetros Posicionais

Os parâmetros de entrada posicionais são definidos utilizando um ponto de interrogação seguido por um número positivo:

?[inteiro positivo].

Parâmetros de entrada posicionais são numerados iniciando em 1 e correspondem aos argumentos da consulta; portanto, uma consulta não deve conter um parâmetro de entrada que exceda o número de argumentos de entrada.

Exemplo: SELECT e FROM Employee e WHERE e.city = ?1 and e.salary >= ?2

Parâmetros Denominados

Os parâmetros de entrada denominados são definidos utilizando um nome de variável no formato: :[nome do parâmetro].

Exemplo: SELECT e FROM Employee e WHERE e.city = :city and e.salary >= :salary

Predicado BETWEEN de Consulta do ObjectGrid

O predicado BETWEEN determina se um valor dado está entre dois outros valores dados.

expressão [NOT] BETWEEN expressão-2 AND expressão-3

Exemplo 1

e.salary BETWEEN 50000 AND 60000

é equivalente a:

e.salary >= 50000 AND e.salary <= 60000

Exemplo 2

e.name NOT BETWEEN 'A' AND 'B'

é equivalente a:

e.name < 'A' OR e.name > 'B'

Predicado IN de Consulta do ObjectGrid

O predicado IN compara um valor a um conjunto de valores. É possível utilizar o predicado IN em um dos dois formatos:

expression [NOT] IN ( subselect )expression [NOT] IN ( value1, value2, .... )

O valor ValorN pode ser um valor literal ou um parâmetro de entrada. A expressão não pode ser avaliada para um tipo de referência.

Exemplo 1

e.salary IN ( 10000, 15000 )

é equivalente a

( e.salary = 10000 OR e.salary = 15000 )

Exemplo 2

e.salary IN ( select e1.salary from EmpBean e1 where e1.dept.deptno = 10)

é equivalente a

e.salary = ANY ( select e1.salary from EmpBean e1 where e1.dept.deptno = 10)

Exemplo 3

e.salary NOT IN ( select e1.salary from EmpBean e1 where e1.dept.deptno = 10)

é equivalente a

e.salary <> ALL ( select e1.salary from EmpBean e1 where e1.dept.deptno = 10)

Predicado LIKE de Consulta do ObjectGrid

O predicado LIKE pesquisa um valor de cadeia para um certo padrão.

expressão-de-cadeia [NOT] LIKE padrão [ ESCAPE caractere-de-escape ]

O valor padrão é uma cadeia literal ou marcador de parâmetro do tipo string no qual o sublinhado ( _ ) representa qualquer caractere único e o símbolo de percentual ( % ) representa qualquer sequência de caracteres, incluindo uma sequência vazia. Qualquer outro caractere significa ele próprio. O caractere de escape pode ser utilizado para pesquisar os caracteres _ e %. O caractere de escape pode ser especificado como um literal de cadeia ou um parâmetro de entrada.

Se a expressão-de-cadeia for nula, o resultado será desconhecido.

Se a expressão-de-cadeia e o padrão forem ambos vazios, o resultado será true.

Exemplo

'' LIKE '' is true
'' LIKE '%' is true
e.name LIKE '12%3' is true for '123' '12993' and false for '1234'
e.name LIKE 's_me' is true for 'some' and 'same', false for 'soome'
e.name LIKE '/_foo' escape '/' is true for '_foo', false for 'afoo'
e.name LIKE '//_foo' escape '/' is true for '/afoo' and for '/bfoo'
e.name LIKE '///_foo' escape '/' is true for '/_foo' but false for '/afoo'

Predicado NULL de Consulta do ObjectGrid

O predicado NULL testa a ocorrência de valores nulos.

{expressão-de-caminho-com-valor-único | parâmetro_de_entrada} IS [NOT] NULL

Exemplo

e.name IS NULL
e.dept.name IS NOT NULL
e.dept IS NOT NULL

Predicado de Coleta EMPTY de Consulta do ObjectGrid

Utilize o predicado de coleta EMPTY para testar uma coleta vazia.

Para testar se um relacionamento com vários valores é vazio, utilize a seguinte sintaxe:

expressão-de-caminho-com-valor-de-coleção IS [NOT] EMPTY

Exemplo

Predicado de coleta vazio para localizar todos os departamentos que não possuem funcionários:

SELECT OBJECT(d) FROM DeptBean d WHERE d.emps IS EMPTY

Predicado MEMBER OF de Consulta do ObjectGrid

A expressão a seguir testa se a referência de objeto especificada pela expressão de caminho com valor único ou parâmetro de entrada é um membro da coleta designada. Se a expressão de caminho com valor da coleta designar uma coleta vazia o valor da expressão MEMBER OF será FALSE.

{ expressão-de-caminho-com-valor-único | parâmetro_de_entrada } [ NOT ] MEMBER [ OF ] expressão-de-caminho-com-valor-de-coleção

Exemplo

Localizar funcionários que não são membros de um número de departamento dado:

SELECT OBJECT(e) FROM EmpBean e , DeptBean d 
WHERE e NOT MEMBER OF d.emps AND d.deptno = ?1
Localizar funcionários cujo gerente é um membro de um número de departamento dado:
SELECT OBJECT(e) FROM EmpBean e, DeptBean d 
WHERE e.dept.mgr MEMBER  OF d.emps  and d.deptno=?1

Predicado EXISTS de Consulta do ObjectGrid

O predicado EXISTS testa a presença ou ausência de uma condição especificada por uma subseleção.

EXISTS ( subseleção )

O resultado de EXISTS será true se a subseleção retornar pelo menos um valor; caso contrário, o resultado será false.

Para negar um predicado EXISTS, preceda-o com o operador lógico NOT.

Exemplo

Retornar departamentos que têm pelo menos um funcionário ganhando mais que 1000000:

SELECT OBJECT(d) FROM DeptBean d 
WHERE EXISTS ( SELECT  e  FROM IN (d.emps) e WHERE  e.salary > 1000000 )
Retornar departamentos que não têm funcionários
SELECT OBJECT(d) FROM DeptBean d 
WHERE NOT EXISTS  ( SELECT e FROM IN (d.emps) e)
É possível reescrever a consulta anterior como no exemplo a seguir:

SELECT OBJECT(d) FROM DeptBean d WHERE SIZE(d.emps)=0

Cláusula ORDER BY de Consulta do ObjectGrid

A cláusula ORDER BY especifica uma ordenação dos objetos na coleta de resultados. Este é um exemplo:

ORDER BY [ order_element ,]* order_element order_element ::={ path-expression }[ ASC | DESC ]

A expressão de caminho deve especificar um campo de valor único que é um tipo primitivo de byte, short, int, long, float, double, char, ou um tipo de wrapper de Byte, Short, Integer, Long, Float, Double, BigDecimal, String, Character, java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp e java.util.Calendar. O elemento de ordem ASC especifica que os resultados são exibidos em ordem crescente, que é o padrão. Um elemento de ordem DESC especifica que os resultados são exibidos em ordem decrescente.

Exemplo

Retornar objetos do departamento. Exibir os números de departamento em ordem decrescente:

SELECT OBJECT(d) FROM DeptBean d ORDER BY d.deptno DESC

Retornar objetos de funcionário, classificados por número de departamento e nome:

SELECT  OBJECT(e) FROM EmpBean e ORDER BY e.dept.deptno ASC,  e.name DESC

Funções de Agregação de Consulta do ObjectGrid

As funções de agregação operam em um conjunto de valores para retornar um valor escalar único. É possível utilizar essas funções nos métodos select e subselect. O exemplo a seguir ilustra uma agregação:

SELECT SUM (e.salary) FROM EmpBean e WHERE e.dept.deptno =20

Essa agregação calcula o salário total para o departamento 20.

As funções de agregação são: AVG, COUNT, MAX, MIN e SUM. A sintaxe de uma função de agregação é ilustrada no exemplo a seguir:

função-de-agregação ( [ ALL | DISTINCT ] expressão )

ou:

COUNT( [ ALL | DISTINCT ] variável de identificação )

A opção DISTINCT elimina valores duplicados antes de aplicar a função. A opção ALL é a opção padrão e não elimina valores duplicados. Os valores nulos são ignorados no cálculo da função agregada, exceto quando você utiliza a função COUNT(identification-variable), que retorna uma contagem de todos os elementos no conjunto.

Definindo o Tipo de Retorno

As funções MAX e MIN podem se aplicar a qualquer tipo de dados numéricos, de cadeia ou de data-hora e retornam o tipo de dados correspondente. As funções SUM e AVG pegam um tipo numérico como entrada. A função AVG retorna um tipo double. A função SUM retorna um tipo long se o tipo de entrada for um tipo integer, exceto quando a entrada for um tipo Java BigInteger, e, em seguida, a função retornar um tipo Java BigInteger. A função SUM retorna um tipo double se o tipo de entrada não for um tipo integer, exceto quando a entrada for um tipo Java BigDecimal, e, em seguida, a função retornar um tipo Java BigDecimal. A função COUNT pode tomar qualquer tipo de dados, exceto coletas, e retorna um tipo long.

Quando aplicadas a um conjunto vazio, as funções SUM, AVG, MAX e MIN podem retornar um valor nulo. A função COUNT retorna zero (0) quando aplicada a um conjunto vazio.

Utilizando cláusulas GROUP BY e HAVING

O conjunto de valores utilizado para a função agregada é determinado pela coleta que resulta da cláusula FROM e WHERE da consulta. É possível dividir o conjunto em grupos e aplicar a função de agregação a cada grupo. Para executar essa ação, utilize uma cláusula GROUP BY na consulta. A cláusula GROUP BY define os membros do agrupamento que compreendem uma lista de expressões de caminho. Cada expressão de caminho especifica um campo que é um tipo primitivo de byte, short, int, long, float, double, boolean, char ou um tipo de wrapper de Byte, Short, Integer, Long, Float, Double, BigDecimal, String, Boolean, Character, java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp e java.util.Calendar ou um Java SE 5 enum.

O exemplo a seguir ilustra a utilização da cláusula GROUP BY em uma consulta que calcula o salário médio para cada departamento:

SELECT e.dept.deptno, AVG ( e.salary) FROM EmpBean e GROUP BY e.dept.deptno

Na divisão de um conjunto em grupos, um valor NULL é considerado igual a outro valor NULL.

Os grupos podem ser filtrados utilizando uma cláusula HAVING, que testa as propriedades de grupo antes de envolver funções agregadas ou membros do agrupamento. Essa filtragem é similar a como a cláusula WHERE filtra tuplas (isto é, registros dos valores de coleta de retorno) da cláusula FROM. Um exemplo da cláusula HAVING é o seguinte:

SELECT e.dept.deptno,  AVG ( e.salary) FROM EmpBean e
GROUP BY e.dept.deptno
HAVING COUNT(e) > 3 AND e.dept.deptno > 5
Essa consulta retorna o salário médio para departamentos que possuem mais de três funcionários e o número de departamentos é maior que cinco.

É possível utilizar a cláusula HAVING sem uma cláusula GROUP BY. Nesse caso, todo o conjunto é tratado como um único grupo, ao qual a cláusula HAVING é aplicada.