Versão ALPHA! Este artigo está em versão 'Alpha' e, portanto, não foi ainda revisado corretamente

Implementação

Introdução

Para implementar de fato o filtro precisaremos implementar o método newPager() além do pagePorAlunoKey(). Devemos começar pelo método pagePorAlunoKey(), seguindo as instruções abaixo.

Passo a passo

O método pagePorAlunoKey() atualmente encontra-se com a seguinte estrutura:

public PageList<Disciplina> pagePorAlunoKey(AlunoKey alunoKey, RequestWrapper wrapper) {
  return null;
}

O primeiro passo é declarar um Page no método que obtemos através do RequestWrapper que passamos como parâmetro:

public PageList<Disciplina> pagePorAlunoKey(AlunoKey alunoKey, RequestWrapper wrapper) {
  Page page = wrapper.getPage();

  return null;
}

Na sequencia declaramos um List de Disciplina que será construído com o auxílio do método newPager() que iremos criar em seguida:

public PageList<Disciplina> pagePorAlunoKey(AlunoKey alunoKey, RequestWrapper wrapper) {
  Page page = wrapper.getPage();

  List<Disciplina> rows = newPager("*", AlunoKey, wrapper)
	  .listPage(page);

  return null;
}

Observe que o método newPager() ainda não existe e o Eclipse irá notificar sobre o erro, então pressione CTRL + . para focar na linha em que ocorreu o erro de compilação, em seguida pressione CTRL + 1 para criar o método.

Deixe por enquanto o método newPager() com a seguinte estrutra:

private NativeSql newPager(String what, AlunoKey alunoKey, RequestWrapper wrapper) {

  return newSelect(what)

      .add("where DISCIPLINA.ALUNO_ID = ?").param(alunoKey.getId());
}

Note que o Eclipse nos informará de outro erro compilação, pois o método newSelect() já existe mas não possui os parâmetros declarados que queremos passar. Então pressione CTRL + 1 para consertar o erro e selecione a opção Change method newSelect(); Add parameter String.

No método newSelect() altere somente a linha onde é chamado o comando select:

private NativeSql newSelect(String what) {
  return sqlProvider.get()

      .add("select %s", what)
      .add("from FACULDADE.DISCPLINA")
        
      .add("join FACULDADE.ALUNO")
      .add("on DISCPLINA.ALUNO_ID = ALUNO.ID")
        
      .andLoadWith(new DisciplinaLoader());
}

Ou seja, onde estava .add("select *") altere para .add("select %s", what). Como alteração é comum esquecer, então certifique-se de ter feito essa alteração para não ter problemas de sintaxe da linguagem SQL quando foi rodar o teste.

Voltamos agora para a implementação do método pagePorAlunoKey(), que devemos agora declarar um Pager:

public PageList<Disciplina> pagePorAlunoKey(AlunoKey alunoKey, RequestWrapper wrapper) {
  Page page = wrapper.getPage();

  List<Disciplina> rows = newPager("*", alunoKey, wrapper)
      .listPage(page);

  Pager pager = newPager("count(*)", alunoKey, wrapper)
	  .andLoadWith(new PagerLoader(wrapper))
	  .single();

  return null;
}

Para finalizar a implementação é necessário alterar o retorno do método para que retorne um PageList de Disciplina:

public PageList<Disciplina> pagePorAlunoKey(AlunoKey alunoKey, RequestWrapper wrapper) {
  Page page = wrapper.getPage();

  List<Disciplina> rows = newPager("*", alunoKey, wrapper)
	  .listPage(page);

  Pager pager = newPager("count(*)", alunoKey, wrapper)
	  .andLoadWith(new PagerLoader(wrapper))
	  .single();

  return new PageList<Disciplina>(rows, pager);
}

Implementação do filtro

Com o método pagePorAlunoKey() implementado podemos agora focar na definição do filtro. Como foi comentando na introdução o filtro ficará no método newPager().

O primeiro passo é extrair o parâmetro que definimos no teste dentro de FakeRequestWrapper. Para relembrar:

FakeRequestWrapper wrapper = new FakeRequestWrapper();
wrapper.put("nome", "João");                                     

Utilizamos o método param() de RequestWrapper para obter um parâmetro enviado na requisição, veja abaixo:

private NativeSql newPager(String what, AlunoKey alunoKey, RequestWrapper wrapper) {
  String nome = wrapper.param("nome");

  return newSelect(what)

      .add("where DISCIPLINA.ALUNO_ID = ?").param(AlunoKey.getId());
}

Observe a ligação do nome do parâmetro que passamos no método param() com o que definimos usando FakeRequestWrapper no nosso teste.

Agora devemos adicionar depois da cláusula where o complemento da nossa consulta que definirá nosso filtro:

private NativeSql newPager(String what, AlunoKey alunoKey, RequestWrapper wrapper) {
  String nome = wrapper.param("nome");

  return newSelect(what)

      .add("where DISCIPLINA.ALUNO_ID = ?").param(AlunoKey.getId())

      .addIf("and ALUNO.NOME like concat('%', ?, '%')").paramNotNull(nome)

      .add("order by")
      .add("ALUNO.NOME");
}

No complemento que adicionamos na consulta utizamos like junto com a função concat do MySQL, que faz concatenação de strings.

Agora o filtro está com a implementação completa e pronto para ser testado.

O método addIf()

A diferença básica entre o método add()e addIf():

Com o método add(), o conteúdo da consulta SQL passado para esse método será sempre incluso. Já com o método addIf() o conteúdo da consulta somente será incluso caso o parâmetro vindo da requisição não seja null. Quando o método param() é chamado ele procura o parâmetro nome, caso o parâmetro não esteja presente, é atribuído null a variável para qual definimos que iria receber esse valor.

Na maioria das situações iremos implementar mais de um fitro, por exemplo poderíamos ter além do filtro por nome do aluno outro filtro por número do RA (Registro Acadêmico) do aluno. Isso nos remete a pensar que teremos que implementar um método distindo para implementar cada filtros para serem usados com pagePorAlunoKey_nome(), pagePorAlunoKey_Ra() e assim por diante. Mas utilizando o método addIf() para construir nossa consulta podemos trabalhar com vários filtros dentro no método newPager() e cada filtro será chamado individualmente caso o parâmetro conste na requisição. Acompanhe o código abaixo:

private NativeSql newPager(String what, AlunoKey alunoKey, RequestWrapper wrapper) {
  String nome = wrapper.param("nome");
  String ra = wrapper.param("ra");

  return newSelect(what)
  
      .add("where DISCIPLINA.ALUNO_ID = ?").param(AlunoKey.getId())

      .addIf("and ALUNO.NOME like concat('%', ?, '%')").paramNotNull(nome)
      .addIf("and ALUNO.RA like concat('%', ?, '%')").paramNotNull(ra);			
}

Para cada requisição HTTP que chegará até o filtro, virá com parâmetro nome ou ra, ou também com ambos. Imaginemos que a página onde o usuário utilizará o filtro contenha os seguintes inputs:

Nome do aluno: <input type="text" name="nome"><br>
RA do aluno:   <input type="text" name="ra"><br>

Se o usuário for querer filtrar a consulta que contenha o nome de determinado aluno, o método newPager() construirá a consulta sem o filtro por RA já que o mesmo não foi invocado na requisição, em tempo de execução, seria equivalente ao código abaixo:

private NativeSql newPager(String what, AlunoKey alunoKey, RequestWrapper wrapper) {
  String nome = wrapper.param("nome");

  return newSelect(what)

      .add("where DISCIPLINA.ALUNO_ID = ?").param(AlunoKey.getId())

      .addIf("and ALUNO.NOME like concat('%', ?, '%')").paramNotNull(nome);
}

O mesmo acontecerá quando o filtro por RA for utilizado, não existirá valor para o parâmetro nome.

private NativeSql newPager(String what, AlunoKey alunoKey, RequestWrapper wrapper) {
  String ra = wrapper.param("ra");

  return newSelect(what)

      .add("where DISCIPLINA.ALUNO_ID = ?").param(AlunoKey.getId())

      .addIf("and ALUNO.RA like concat('%', ?, '%')").paramNotNull(ra);			
}

Como é possível notar, quando um determinado parâmetro não puder ser obtido e consequentemente será atribuído null ao seu valor, seria equivalente como a consulta SQL desse filtro não existisse.


 
 

objectos, Fábrica de Software LTDA

  • R. Demóstenes, 627. cj 123
  • 04614-013 - Campo Belo
  • São Paulo - SP - Brasil
  • +55 11 5093-8640
  • +55 11 2359-8699
  • contato@objectos.com.br