OGR

swq.h

00001 /******************************************************************************
00002  *
00003  * Component: OGDI Driver Support Library
00004  * Purpose: Generic SQL WHERE Expression Evaluator Declarations.
00005  * Author: Frank Warmerdam <warmerdam@pobox.com>
00006  * 
00007  ******************************************************************************
00008  * Copyright (C) 2001 Information Interoperability Institute (3i)
00009  * Permission to use, copy, modify and distribute this software and
00010  * its documentation for any purpose and without fee is hereby granted,
00011  * provided that the above copyright notice appear in all copies, that
00012  * both the copyright notice and this permission notice appear in
00013  * supporting documentation, and that the name of 3i not be used 
00014  * in advertising or publicity pertaining to distribution of the software 
00015  * without specific, written prior permission.  3i makes no
00016  * representations about the suitability of this software for any purpose.
00017  * It is provided "as is" without express or implied warranty.
00018  ****************************************************************************/
00019 
00020 #ifndef _SWQ_H_INCLUDED_
00021 #define _SWQ_H_INCLUDED_
00022 
00023 typedef enum {
00024     SWQ_OR,
00025     SWQ_AND,
00026     SWQ_NOT,
00027     SWQ_EQ,
00028     SWQ_NE,
00029     SWQ_GE,
00030     SWQ_LE,
00031     SWQ_LT,
00032     SWQ_GT,
00033     SWQ_LIKE,
00034     SWQ_NOTLIKE,
00035     SWQ_ISNULL,
00036     SWQ_ISNOTNULL,
00037     SWQ_IN,
00038     SWQ_NOTIN,
00039     SWQ_UNKNOWN
00040 } swq_op;
00041 
00042 typedef enum {
00043     SWQ_INTEGER,
00044     SWQ_FLOAT,
00045     SWQ_STRING, 
00046     SWQ_BOOLEAN,
00047     SWQ_DATE,
00048     SWQ_TIME,
00049     SWQ_TIMESTAMP,
00050     SWQ_OTHER
00051 } swq_field_type;
00052 
00053 typedef struct {
00054     swq_op      operation;
00055 
00056     /* only for logical expression on subexpression */
00057     struct swq_node_s  *first_sub_expr;
00058     struct swq_node_s  *second_sub_expr;
00059 
00060     /* only for binary field operations */
00061     int         field_index;
00062     int         table_index;
00063     swq_field_type field_type;
00064     char        *string_value;
00065     int         int_value;
00066     double      float_value;
00067 } swq_field_op;
00068 
00069 typedef swq_field_op swq_expr;
00070 
00071 typedef int (*swq_op_evaluator)(swq_field_op *op, void *record_handle);
00072 
00073 typedef struct {
00074     char       *data_source;
00075     char       *table_name;
00076     char       *table_alias;
00077 } swq_table_def;
00078 
00079 typedef struct {
00080     int count;
00081     char **names;
00082     swq_field_type *types;
00083     int *table_ids;
00084     int *ids;
00085 
00086     int table_count;
00087     swq_table_def *table_defs;
00088 } swq_field_list;
00089 
00090 /* Compile an SQL WHERE clause into an internal form.  The field_list is
00091 ** the list of fields in the target 'table', used to render where into 
00092 ** field numbers instead of names. 
00093 */
00094 const char *swq_expr_compile( const char *where_clause, 
00095                               int field_count,
00096                               char **field_list,
00097                               swq_field_type *field_types,
00098                               swq_expr **expr );
00099 
00100 const char *swq_expr_compile2( const char *where_clause, 
00101                                swq_field_list *field_list, 
00102                                swq_expr **expr );
00103 
00104 /*
00105 ** Evaluate an expression for a particular record using an application
00106 ** provided field operation evaluator, and abstract record handle. 
00107 */
00108 int swq_expr_evaluate( swq_expr *expr, swq_op_evaluator fn_evaluator,
00109                        void *record_handle );
00110 
00111 void swq_expr_free( swq_expr * );
00112 
00113 int swq_test_like( const char *input, const char *pattern );
00114 
00115 
00116 /****************************************************************************/
00117 
00118 #define SWQP_ALLOW_UNDEFINED_COL_FUNCS 0x01
00119 
00120 #define SWQM_SUMMARY_RECORD  1
00121 #define SWQM_RECORDSET       2
00122 #define SWQM_DISTINCT_LIST   3
00123 
00124 typedef enum {
00125     SWQCF_NONE,
00126     SWQCF_AVG,
00127     SWQCF_MIN,
00128     SWQCF_MAX,
00129     SWQCF_COUNT,
00130     SWQCF_SUM,
00131     SWQCF_CUSTOM
00132 } swq_col_func;
00133 
00134 typedef struct {
00135     swq_col_func col_func;
00136     char         *col_func_name;
00137     char         *field_name;
00138         char         *field_alias;
00139     int          table_index;
00140     int          field_index;
00141     swq_field_type field_type;
00142     swq_field_type target_type;
00143     int          field_length;
00144     int          field_precision;
00145     int          distinct_flag;
00146 } swq_col_def;
00147 
00148 typedef struct {
00149     int         count;
00150     
00151     char        **distinct_list;
00152     double      sum;
00153     double      min;
00154     double      max;
00155 } swq_summary;
00156 
00157 typedef struct {
00158     char *field_name;
00159     int   table_index;
00160     int   field_index;
00161     int   ascending_flag;
00162 } swq_order_def;
00163 
00164 typedef struct {
00165     int        secondary_table;
00166 
00167     char      *primary_field_name;
00168     int        primary_field;
00169 
00170     swq_op     op;
00171 
00172     char      *secondary_field_name;
00173     int        secondary_field;
00174 } swq_join_def;
00175 
00176 typedef struct {
00177     int         query_mode;
00178 
00179     char        *raw_select;
00180 
00181     int         result_columns;
00182     swq_col_def *column_defs;
00183     swq_summary *column_summary;
00184 
00185     int         table_count;
00186     swq_table_def *table_defs;
00187 
00188     int         join_count;
00189     swq_join_def *join_defs;
00190 
00191     char        *whole_where_clause;
00192     swq_expr    *where_expr;
00193 
00194     int         order_specs;
00195     swq_order_def *order_defs;    
00196 } swq_select;
00197 
00198 const char *swq_select_preparse( const char *select_statement, 
00199                                  swq_select **select_info );
00200 const char *swq_select_expand_wildcard( swq_select *select_info,
00201                                         swq_field_list *field_list );
00202 const char *swq_select_parse( swq_select *select_info,
00203                               swq_field_list *field_list,
00204                               int parse_flags );
00205 void swq_select_free( swq_select *select_info );
00206 
00207 const char *swq_reform_command( swq_select *select_info );
00208 void swq_free( void * );
00209 void *swq_malloc( int );
00210 
00211 const char *swq_select_finish_summarize( swq_select *select_info );
00212 const char *swq_select_summarize( swq_select *select_info, 
00213                                   int dest_column, 
00214                                   const char *value );
00215 
00216 
00217 #endif /* def _SWQ_H_INCLUDED_ */

Generated for GDAL by doxygen 1.7.3.