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.