Executar Expressões Matemáticas  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
eberson_oliveira
JavaGuru
[Avatar]

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
[Email] [MSN]
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
eberson_oliveira
JavaGuru
[Avatar]

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

[Email] [MSN]
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.
eberson_oliveira
JavaGuru
[Avatar]

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?
[Email] [MSN]
victorwss
JWizard
[Avatar]

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.
[MSN]
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?
rodrigo_gomes
GUJ Master
[Avatar]

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
[WWW] [MSN] [ICQ]
eberson_oliveira
JavaGuru
[Avatar]

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
[Email] [MSN]
eberson_oliveira
JavaGuru
[Avatar]

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
[Email] [MSN]
eberson_oliveira
JavaGuru
[Avatar]

Membro desde: 16/01/2008 10:18:17
Mensagens: 206
Localização: Matão - SP
Offline

rodrigo_gomes wrote:Olá,

use groovyshell. É bem simples de usar.
http://www.guj.com.br/posts/list/102119.java

[]´s


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...
[Email] [MSN]
rodrigo_gomes
GUJ Master
[Avatar]

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
[WWW] [MSN] [ICQ]
eberson_oliveira
JavaGuru
[Avatar]

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...

[]
[Email] [MSN]
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.
[WWW]
eberson_oliveira
JavaGuru
[Avatar]

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
[Email] [MSN]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team