quinta-feira, 25 de agosto de 2011

Selecionando Registros

Pesquisar registro utilizando valores dos campos chave

Métodos são definidos para as coleções de banco de dados que retornam um registro ou registros com valores especificados de campos-chave.
O método get() toma um registro alvo como argumento e retorna um registro com os mesmos valores de campos-chave. Um registro (ou modelo) destacado é frequentemente utilizado como o registro de destino, os registros destacados e modelo. Valores de campos não-chave são ignoradas,e não precisa ser especificado no registro de destino.
Note que este método pode ter um vetor de valores como argumento, correspondentes aos valores dos campos-chave. Este é obsoleta, como os campos-chave de registros em bancos de dados externos ou conjuntos de dados externos não são, necessariamente, armazenado no início do registro.
No exemplo a seguir, a chave primária da tabela hotel é dada pelo campo nome, que tem uma string como valor:

MagikSF> hotel_tab << v.collection(:hotel)
a ds_collection(hotel)
MagikSF> r << hotel_tab.new_template_record()
record_template(hotel) 
MagikSF> r.name << "Acorn Guest House"
"Acorn Guest House" 
MagikSF> hotel_rec << hotel_tab.get(r)
hotel51:(Acorn Guest House) 
MagikSF> print(hotel_rec)
hotel51:
:name       "Acorn Guest House" 
:address1   "154 Chesterton Road" 
:address2   "Cambridge" 
:type       hotel_type(Guest House) 
:comments   unset 
:location   point:(gis_id(5233539,824113348,19026)) 
:annotation unset 
O método at() recebe uma lista de valores de campo chave como argumentose retorna o objeto de registro com os valores de campo chave, que não exige um registro de modelo para manter os valores-chave. No exemplo anterior, você poderia usar:
hotel_rec << hotel_tab.at("Acorn Guest House")

para recuperar o mesmo registro. Observe que at() com uma lista de valorespode ser usado com um banco de dados externo ou conjunto de dados externo, seja qual for a ordem dos campos armazenados.
O método all_at() recebe uma lista de valores de campo chave para especificar uma parte de uma chave primária, e retorna um conjunto seleto deregistros com chaves primárias correspondentes.

Usando predicados

Um predicado (Magik predicado é uma classe ou uma subclasse) é um objeto que pode testar um registro de banco de dados.
O método select() é definido para as classes de banco de dados de coleta e também para conjuntos RWO, o método utiliza um predicado como argumento e retorna uma coleção (classe select_collection) como resultado. A coleção resultante responde a todos os métodos de coleta de costume, mas não é armazenada explicitamente; seus elementos são derivados de sua coleção de destino e predicado quando necessário. Por exemplo:

MagikSF> v << ldp.dataset(:gis)
gis_ds_view(Gis)
MagikSF> roadworks << v.collection(:road_works)
a ds_collection(road_works) 
MagikSF> roadworks.size
12
MagikSF> pred1 << predicate.new(:status, :eq, "Current")
predicate:(status = "Current") 
MagikSF> result1 << roadworks.select(pred)
select_collection(on road_works) 
MagikSF> result1.size
3 

Predicado simples
O exemplo anterior mostra um predicado simples, criado com o operador :eq como um argumento para o método new (). Alternativamente, você pode usar o método eq () com dois argumentos, por exemplo:

pred1 << predicate.eq(:status, "Current")

Métodos similares são definidos em predicado para operadores, tais como :lt, :le, :gt and :ge.

Predicado parcial
Você pode usar um predicado de classe ou predicate_wild ou predicate_like para fazer comparações parciais em um campo, ou, alternativamente, usar métodos like() ou wild() no predicado.

  • predicate_wild e wild() usa * para corresponder a qualquer número de caracteres e “?” para corresponder a um único caractere. “\” É usado como um escape, para que “\*” corresponde a “*”.
  • predicate_like e like() usa as convenções de SQL para % para combinar com qualquer número de caracteres e _to coincidir com uma caractere

Por exemplo, qualquer um destes…

pred2 << predicate.like(:code_name, "rw1%")
pred2 << predicate.new(:code_name, :like, "rw1%")

…resulta em um predicado que seleciona todos os registros com o campo CODE_NAME iniciado por rw1

Predicado composto
Você pode combinar predicados usando as classes predicate_or ou predicate_and, ou alternativamente usando os métodos or() ou and() nos predicados. Estes métodos recebem dois predicados como argumentos.

Por exemplo, qualquer um destes…

pred3 << predicate_or.new(pred1, pred2)
pred3 << pred1.or(pred2)

…resulta em um predicado composto.

Predicados espaciais
Predicados espaciais são definidos para testar os campo geometricos de registros do banco de dados; para maiores informações verifique a seção 7 (Geometry) da documentação.

Predicados para juntar objetos
Predicados podem ser definidos como teste de objetos unidos do objeto corrente. Os métodos a seguir são usados quando um conjunto de objetos pode ser unido ao objeto de destino:

  • predicate.all() pega um campo unido como argumento de predicado; retorna o predicado que testou os registros unidos e retorna true se todos os campos unidos retornarem true para o predicado.
  • predicate.any() pega um campounido como argumento de predicado, retorna o predicado que testou os registros unidos e retorna true se qualquer campo unido retornar true para o predicado.
  • predicate.count() testa quantos registros unidos retornaram true para o predicado.

Por Exemplo, se parents é uma tabela de objetos pais com campos filhos unidos, e o objeto filho tem um campo gender.

  • Quantidade de pais cujos filhos são todos do sexo feminino:

pr_female << predicate.eq(:gender,"female")
pr_all << predicate.all(:children, pr_female)
parents.select(pr_all).size

  • Quantidade de pais com pelo menos um filho do sexo feminino:

pr_any << predicate.any(:children, pr_female)
parents.select(pr_any).size

  • Quantidade de pais com pelo menos dois filhos do sexo feminino:

pr_count << predicate_count.new(:children, pr_female, :|>|, 2)
parents.select(pr_count).size

O método predicate.navigate() é usado para juntar campos quando um único objeto está junto ao objeto pai.

Predicado personalizado
O método predicate.using () e predicate.on_field_using () tem um procedimento personalizado para testar um objeto ou um campo, este procedimento deve ter um único argumento e retornar verdadeiro ou falso. Note que os predicados personalizadoa não podem ser otimizados.

Nenhum comentário :

Postar um comentário

Related Posts Plugin for WordPress, Blogger...