| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/10/2008 09:54:03
|
eberson_oliveira
JavaGuru
![[Avatar]](/images/avatar/b0074757eb8e629f5a4c89a4b40b277e.jpg)
Membro desde: 16/01/2008 10:18:17
Mensagens: 206
Localização: Matão - SP
Offline
|
bom dia,
Estou precisando montar uma estrutura para resolver a seguinte situação:
O usuário poderá informar uma expressão matemática do tipo: ( a + b ) / c, onde a, b e c serão campos da base de dados. A minha estrutura precisa ser capaz de ler essa expressão (ou outra que o usuário informar) interpretar, validar e executar retornando o resultado do cálculo ao usuário ou algum erro caso ocorra.
Não sei se existe algo que execute esse tipo de operação.
Gostaria que me indicassem qual caminho devo tomar para resolver esse problema, baseado na experiência de cada um, e/ou se existe algo que eu possa usar como referência.
[]s
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/10/2008 09:58:14
|
Daniels
JavaGuru
Membro desde: 25/07/2008 14:19:39
Mensagens: 218
Offline
|
be happy!
http://www.guj.com.br/posts/preList/102119/551141.java#551141
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/10/2008 10:14:47
|
eberson_oliveira
JavaGuru
![[Avatar]](/images/avatar/b0074757eb8e629f5a4c89a4b40b277e.jpg)
Membro desde: 16/01/2008 10:18:17
Mensagens: 206
Localização: Matão - SP
Offline
|
obrigado daniels, foi bastante esclarecedor... no entanto fiquei com uma dúvida no meu caso o usuário vai informar algo do tipo:
onde campo1, 2 e 3 são string's que representam um campo no banco de dados... então depois de interpretado farei um calculo com algo parecido com isso:
será que esse exemplos suportam esse tipo de operação? caso não suportem, tem alguma idéia de como posso fazer?
cheguei a pensar em percorrer a string e retirar dela os parâmetros que me interessam e calcular ou retornar algum erro caso seja inválido; mas não sei se é a melhor opção.
[]s
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/10/2008 10:22:01
|
Daniels
JavaGuru
Membro desde: 25/07/2008 14:19:39
Mensagens: 218
Offline
|
Faz algo assim:
Ai tens a expressão inteira na string formula. Agora é só usar o GroovyShell.
Obs.: Não testei as conversões pra String ali, mas acho que funciona.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/10/2008 13:53:11
|
eberson_oliveira
JavaGuru
![[Avatar]](/images/avatar/b0074757eb8e629f5a4c89a4b40b277e.jpg)
Membro desde: 16/01/2008 10:18:17
Mensagens: 206
Localização: Matão - SP
Offline
|
O meu problema está justamente no fato de que o esta rotina vai ser feita para que eu não faca diretamente o acesso ao ResultSet para obter o valor de colunas eu vou passar apenas a expressão e, dentro da rotina vou identificar as variáveis recuperar os dados do banco e efetuar a operação neste momento poderei usar os exemplos que mandou... mas, agora, não sei como resolver a parte em que identifico as variáveis e recupero os dados do resultset...
não sei se fui claro...
tem alguma sugestão?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/10/2008 14:34:53
|
victorwss
JWizard
![[Avatar]](/images/avatar/4ab232445f9b21b65dfdf6ea5f27f704.png)
Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline
|
Esse tópico não é nem um pouco fácil. Dê uma estudada na forma como os compiladores trabalham.
Se você puder implementar um analisador para essa gramática, te ajuda:
Expr1 -> ["-"] Expr2
Expr2 -> Expr3 [("+" | "-") Expr2]
Expr3 -> Expr4 [("*" | "/") Expr3]
Expr4 -> "(" Expr1 ")" | Num | var
This message was edited 1 time. Last update was at 02/10/2008 14:35:06
|
Victor Williams Stafusa da Silva
Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.
Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.
Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.
É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).
Se você escreve "concerteza", "concerteza" você andou matando aulas de português. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/10/2008 14:50:29
|
Daniels
JavaGuru
Membro desde: 25/07/2008 14:19:39
Mensagens: 218
Offline
|
eberson_oliveira wrote:O meu problema está justamente no fato de que o esta rotina vai ser feita para que eu não faca diretamente o acesso ao ResultSet para obter o valor de colunas eu vou passar apenas a expressão e, dentro da rotina vou identificar as variáveis recuperar os dados do banco e efetuar a operação neste momento poderei usar os exemplos que mandou... mas, agora, não sei como resolver a parte em que identifico as variáveis e recupero os dados do resultset...
não sei se fui claro...
tem alguma sugestão?
Você não está conseguindo pegar os dados do banco. É isso?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/10/2008 15:53:33
|
rodrigo_gomes
GUJ Master
![[Avatar]](/images/avatar/d30960ce77e83d896503d43ba249caf7.jpg)
Membro desde: 25/11/2003 15:45:21
Mensagens: 1088
Localização: São Paulo
Offline
|
Olá,
use groovyshell. É bem simples de usar.
http://www.guj.com.br/posts/list/102119.java
[]´s
|
rodrigo de paiva gomes
http://twitter.com/rod_gomes |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/10/2008 16:02:15
|
eberson_oliveira
JavaGuru
![[Avatar]](/images/avatar/b0074757eb8e629f5a4c89a4b40b277e.jpg)
Membro desde: 16/01/2008 10:18:17
Mensagens: 206
Localização: Matão - SP
Offline
|
victorwss wrote:Esse tópico não é nem um pouco fácil. Dê uma estudada na forma como os compiladores trabalham.
Se você puder implementar um analisador para essa gramática, te ajuda:
Expr1 -> ["-"] Expr2
Expr2 -> Expr3 [("+" | "-") Expr2]
Expr3 -> Expr4 [("*" | "/") Expr3]
Expr4 -> "(" Expr1 ")" | Num | var
:?:
Desculpe.... mas não pude entender a gramatica citada... pode detalhar, por favor ou indicar um local onde possa consultar sobre isso?
[]s
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/10/2008 16:07:14
|
eberson_oliveira
JavaGuru
![[Avatar]](/images/avatar/b0074757eb8e629f5a4c89a4b40b277e.jpg)
Membro desde: 16/01/2008 10:18:17
Mensagens: 206
Localização: Matão - SP
Offline
|
Daniels wrote:
eberson_oliveira wrote:O meu problema está justamente no fato de que o esta rotina vai ser feita para que eu não faca diretamente o acesso ao ResultSet para obter o valor de colunas eu vou passar apenas a expressão e, dentro da rotina vou identificar as variáveis recuperar os dados do banco e efetuar a operação neste momento poderei usar os exemplos que mandou... mas, agora, não sei como resolver a parte em que identifico as variáveis e recupero os dados do resultset...
não sei se fui claro...
tem alguma sugestão?
Você não está conseguindo pegar os dados do banco. É isso?
entao... o problema não está em obter os valores do banco e sim em identificar na minha expressao (string) os valores que representam os nomes das colunas do banco de dados... o que quero fazer é descobrir na expressao quais sao os campos verificar se eles realmente existem e, caso existam, recuperar seus valores para poder efetuar a expressao
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/10/2008 16:09:30
|
eberson_oliveira
JavaGuru
![[Avatar]](/images/avatar/b0074757eb8e629f5a4c89a4b40b277e.jpg)
Membro desde: 16/01/2008 10:18:17
Mensagens: 206
Localização: Matão - SP
Offline
|
ola rodrigo,
pelo que pude ver ele é bastante simples... no entanto tenho a dificuldade de possuir na expressão valores que representam colunas do banco... no momento em que eu for ler a expressão deverei localizar os campos buscar seus valores para depois poder continuar com a execução expressão...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/10/2008 16:21:32
|
rodrigo_gomes
GUJ Master
![[Avatar]](/images/avatar/d30960ce77e83d896503d43ba249caf7.jpg)
Membro desde: 25/11/2003 15:45:21
Mensagens: 1088
Localização: São Paulo
Offline
|
Olá,
Você pode ter algo como:
Você pode adicionar a expressão que você quiser, e se não for nenhum problema para você, pode colocar todas as colunas da tabela para não ter que ficar procurando qual campo o usuário digitou. Assim, as que ele não usar simplesmente não vão interferir em nada.
Agora se sua tabela for monstruosa, e se isso for executado alguns centenas de vezes por minuto aí você pode ter problema.
|
rodrigo de paiva gomes
http://twitter.com/rod_gomes |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/10/2008 16:40:53
|
eberson_oliveira
JavaGuru
![[Avatar]](/images/avatar/b0074757eb8e629f5a4c89a4b40b277e.jpg)
Membro desde: 16/01/2008 10:18:17
Mensagens: 206
Localização: Matão - SP
Offline
|
Rodrigo,
A minha tabela é monstruosa... na realidade é um grupo de monstros...
São por volta de 400 tabelas onde os campos variam de 5 a 30... por isso fica inviável manter todos os nomes...
a expressão não é fixa... quero permitir que qualquer expressão seja informada contendo qualquer campo...
Por isso acho que vou precisar analisar a expressão antes de mandar executar...
O seu exemplo é bastante claro, no entanto eu não vou saber quais colunas foram informadas... portanto terei que descobrir quais colunas foram informadas e seus valores em tempo de execução...
[]
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/10/2008 17:02:54
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
São por volta de 400 tabelas onde os campos variam de 5 a 30...
...
a expressão não é fixa... quero permitir que qualquer expressão seja informada contendo qualquer campo...
E como fica o relacionamento entre as tabelas? Dá a impressão que é melhor você deixar entrar uma expressão qualquer em SQL.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/10/2008 19:22:14
|
eberson_oliveira
JavaGuru
![[Avatar]](/images/avatar/b0074757eb8e629f5a4c89a4b40b277e.jpg)
Membro desde: 16/01/2008 10:18:17
Mensagens: 206
Localização: Matão - SP
Offline
|
thingol,
a minha estrutura atual recebe um select e a partir dele monta um resultset... esta instrução select fica armazenada na estrutura... de forma que os relacionamentos ficarão a cargo de quem for fornecer o select... o que eu quero fazer é permitir que cálculos possam ser feitos através de colunas da base de dados com um simples comando, por exemplo:
assim poderei obter valores calculados sem precisar acessar a base de dados diretamente, nem usar resultset nem nada...
não sei se estou viajando... mas na minha cabeça essa rotina facilitaria muito o meu trabalho
|
|
|
 |
|
|