Pregunta

Me parece que no puede encontrar un puntero en la dirección correcta, ni siquiera estoy seguro de lo que son los términos que debería estar investigando, pero muchas horas de googlear parece que estar girando en círculos, así que espero que la colmena colectiva de la inteligencia de desbordamiento de pila puede ayudar.

El problema es el siguiente, necesito una forma de filtrar los datos en lo que sólo puedo llamar a un árbol lógico compuesto. Actualmente el sistema implementa un sistema simple y filtrado. Por ejemplo, digamos que tenemos un conjunto de datos de las personas. Se agrega un montón de filtros tales que muestran todas las personas que (Sexo = Mujer) Y (edad> 23) y (Edad <30) y (estado = Individual). Es bastante fácil, iterar a través de cada elemento, agregar a una colección de artículos válidos sólo si cada condición es verdadera.

El problema que estoy encontrando es ¿Cómo manejo el usuario sea capaz de construir consultas complejas involucradas y de y o de? Estoy pensando en algo así como un árbol donde cada nodo representa la expresión y la evaluación de sus hijos a verdadero o falso. Un ejemplo sería simplista - filtre a ((sexo masculino y la edad == == 25) o (Sexo Femenino == == y el estado individual)) y el CI> 120. Lo siento, no puedo pensar en un mejor ejemplo a el momento. Pero, ¿cómo haría usted para representar este tipo de árbol de expresión, y evaluar los elementos de una colección en contra de estos filtros. ¿Cuáles son algunas referencias que ayudarían? Diablos, ¿cuáles son algunas maldita Google búsqueda que podría conducir en una dirección positiva?!

Gracias a cualquier persona que pueda proporcionar cualquier ayuda.

A continuación se muestra un ejemplo de una consulta compuesto en forma de árbol utilizando un conjunto de datos de las personas

  • Consulta - Muéstrame todas las personas donde el sexo es hombre y los ojos son de color verde o el sexo es femenino, los ojos son de color azul, o el estado es única. En forma Paren (Sex == Male && Eyes == verde) || (Sexo Femenino == && (Ojos Azul == == || Estado Individual))

Así árbol En forma im pensamiento

o-Root Node
  - And - Sex = Male
     - And - Eyes = Blue
  - Or - Sex = Female
     - And Eyes = Blue
     - Or Status = Single

Creo que la solución es para representar cada nodo tal en una estructura de datos como

Node
{
   OpType - AND or OR
   ExpressionField - The field to evaluate
   ExpressionOp -   =, !=, >, >=, <, <=
   ExpressionValue - the value to compare the field's value against

   Function Evaluate() - returns a bool
}

Así que para un nodo dado, evaluar los chilren, si usted es un nodo AND, a continuación, devolver true si la expresión da como resultado cierto y todos sus y niños como resultado true o cualquiera o niño se evalúa como verdadera y Recurse arriba.

parece satisfacer todas las condiciones conceptual que pueda lanzar en él, pero lo haremos ya que una vez que ponerlo en práctica. Voy a publicar el código real hasta más tarde, cuando su funcionamiento y fotos para ayudar a describir mejor este problema para los demás.

¿Fue útil?

Solución

Su análisis de la expresión ((sexo masculino y la edad == == 25) o (Sexo Femenino == == y el estado individual)) y el CI> 120 parece extraño. Me gustaría analizar como:

* And
    * Or
        * And
            * ==
                * Sex
                * Male
            * ==
                * Eyes
                * Blue
        * And
            * ==
                * Sex
                * Female
            * ==
                * Status
                * Single
    * >
        * IQ
        * 120

El tipo de árbol sería:

Node
{
    bool evaluate ()
}

AndNode : Node
{
    Node left
    Node right

    bool evaluate ()
    {
        return left.evaluate () && right.evaluate ()
    }
}

// OrNode is similar

EqualsNode : Node
{
    Field field
    Value value

    bool evaluate ()
    {
        return field.value () == value
    }
}

// Likewise for <, >, etc

Otros consejos

Este tipo de consultas se presentan a menudo como una matriz ORed de cláusulas ANDed. Es decir, un formato de tabla en la que se lee a través de múltiples condiciones ANDed juntos, y luego busque debajo OR ellos. Esto nos lleva a alguna repetición de las condiciones, pero es fácil para los usuarios leer, escribir y entender. Su ((Sex == Male AND Age == 25) OR (Sex == Female AND Status == Single)) AND IQ > 120 muestra se vería

Sex == Male   & Age == 25        & IQ > 120 
Sex == Female & Status == Single & IQ > 120 

Es posible que desee Google para términos como 'cálculo de predicados' y 'forma normal conjuntiva'.

Tengo que decir que esta es la razón por motores de bases de datos se construyen. Puede hacer todo lo que necesita con la lógica de conjunto e incluso se puede llegar al resultado que busca, pero tesis son problemas que resuelve estándar y bases de datos SQL. También puede mirar en LINQ para una solución de código.

Parece que es necesario crear una interfaz de usuario que permite la creación de un simple árbol de análisis sintáctico. Cuando las prensas de IR a continuación, puede recorrer el árbol y crear un árbol de expresión LINQ de esa estructura de interfaz de usuario. Ejecutar la consulta LINQ y luego procesar los resultados según sea necesario. Por lo tanto, le recomiendo que lea sobre LINQ árboles de expresión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top