Revision 45331

View differences:

trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.swing/org.gvsig.fmap.dal.swing.impl/src/main/java/org/gvsig/fmap/dal/swing/impl/searchpanel/SearchConditionFieldController.java
83 83

  
84 84
    private static final Logger LOGGER = LoggerFactory.getLogger(SearchConditionFieldController.class);
85 85
    private static final Class LOAD_MORE_ELEMENTS = SearchConditionFieldController.class;
86

  
86 87
    private static class Field extends LabeledValueImpl<String> {
87 88

  
88 89
        FeatureAttributeDescriptor attrdesc;
......
165 166
    private DropDown ddnLogicalOperators;
166 167
    private DropDown ddnRelationalOperators;
167 168
    private DropDown ddnNullBehavior;
168
    
169

  
169 170
    private LabeledValue[] relationalOperators;
170 171
    private LabeledValue[] logicalOperators;
171 172
    private LabeledValue[] nullBehaviors;
......
254 255
                this.ddnLogicalOperators = toolsSwingManager.createDropDown(lblLogicalOperators);
255 256
                this.ddnLogicalOperators.setVisibleDropdownArrow(false);
256 257
            }
257
            
258

  
258 259
            DefaultComboBoxModel modelRelationalOperators = new DefaultComboBoxModel();
259 260
            for (LabeledValue op : relationalOperators) {
260 261
                modelRelationalOperators.addElement(op);
......
263 264
            this.ddnRelationalOperators.addItemListener(new ItemListener() {
264 265
                @Override
265 266
                public void itemStateChanged(ItemEvent ie) {
266
                    if (ie.getStateChange() == ItemEvent.SELECTED) {
267
                      Object item = ((LabeledValue)ie.getItemSelectable().getSelectedObjects()[0]).getValue();
268
                    if (ExpressionBuilder.OPERATOR_IS_NULL.equals(item) || ExpressionBuilder.OPERATOR_IS_NOT_NULL.equals(item)) {
269
                        lblNull.setEnabled(false);
270
                        lblNull.setVisible(false);
271
                        cboValue.setEnabled(false);
272
                        cboValue.setVisible(false);
273
                    } else {
274
                        lblNull.setEnabled(true);
275
                        lblNull.setVisible(true);
276
                        cboValue.setEnabled(true);
277
                        cboValue.setVisible(true);
278
                    }
279
                    }
267
                    doUpdateControllerByRelationalOperator();
280 268
                }
281 269
            });
282
            
270

  
283 271
            if (this.ddnLogicalOperators != null) {
284 272
                DefaultComboBoxModel modelLogicalOperators = new DefaultComboBoxModel();
285 273
                for (LabeledValue op : logicalOperators) {
......
288 276
                this.ddnLogicalOperators.setModel(modelLogicalOperators);
289 277
                this.ddnLogicalOperators.setSelectedIndex(1);
290 278
            }
291
            
279

  
292 280
//            this.ddnNullOperators = new DropDownLabelIcon(lblNull);
293 281
            this.ddnNullBehavior = toolsSwingManager.createDropDownIcon(lblNull);
294 282
            this.ddnNullBehavior.setVisibleDropdownArrow(false);
......
360 348
                    doSelectMoreFields();
361 349
                }
362 350
            });
363

  
351
            doUpdateControllerByRelationalOperator();
364 352
//      clear();
365 353
        } catch (Exception ex) {
366 354
            throw new RuntimeException(ex);
367 355
        }
368 356
    }
369 357

  
358
    private void doUpdateControllerByRelationalOperator() {
359
        Object item = ((LabeledValue) ddnRelationalOperators.getSelectedItem()).getValue();
360
        if (ExpressionBuilder.OPERATOR_IS_NULL.equals(item) || ExpressionBuilder.OPERATOR_IS_NOT_NULL.equals(item)) {
361
            lblNull.setEnabled(false);
362
            cboValue.setEnabled(false);
363
            cboValue.setSelectedIndex(-1);
364
        } else {
365
            lblNull.setEnabled(true);
366
            cboValue.setEnabled(true);
367
        }
368

  
369
    }
370

  
370 371
    private FeatureType getFeatureType() {
371 372
        try {
372 373
            return this.store.getDefaultFeatureType();
......
474 475
        }
475 476
        this.cboValue.setSelectedIndex(-1);
476 477
        this.ddnNullBehavior.setSelectedIndex(0);
478
        doUpdateControllerByRelationalOperator();
477 479
    }
478 480

  
479 481
    private void doUpdateValuesList() {
......
525 527
                        @Override
526 528
                        public void visit(Object o) throws VisitCanceledException, BaseException {
527 529
                            Object value = ((Feature) o).get(field.getDescriptor().getName());
528
                            if (!values.contains(value)) {
530
                            if (value!=null && !values.contains(value)) {
529 531
                                values.add(value);
530 532
                            }
531 533
                            if (System.currentTimeMillis() > timeLimit) {
......
598 600
        ddnRelationalOperators.setEnabled(enabled);
599 601
        lblExtraFields.setEnabled(enabled);
600 602
        cboValue.setEnabled(enabled);
603
        doUpdateControllerByRelationalOperator();
601 604
    }
602 605

  
603 606
    public String getRelationalOperator() {
......
620 623
            return -1;
621 624
        }
622 625
        this.ddnRelationalOperators.setSelectedIndex(n);
626
        doUpdateControllerByRelationalOperator();
623 627
        return n;
624 628
    }
625 629

  
......
922 926
        ExpressionBuilder.Value filter = null;
923 927

  
924 928
        Object value = this.getValue();
925
        if (value == null) {
929
        if (value == null
930
                && this.getRelationalOperator() != ExpressionBuilder.OPERATOR_IS_NULL
931
                && this.getRelationalOperator() != ExpressionBuilder.OPERATOR_IS_NOT_NULL) {
926 932
            return null;
927 933
        }
928 934
        Field field = this.getCurrentField();
......
941 947
        ExpressionBuilder.Constant value_constant = null;
942 948

  
943 949
        switch (this.getRelationalOperator()) {
950
            case ExpressionBuilder.OPERATOR_IS_NULL:
951
                filter = getFilterForOperatorNull(parentDescriptor, descriptor, builder, field);
952
                return filter;
953
            case ExpressionBuilder.OPERATOR_IS_NOT_NULL:
954
                filter = getFilterForOperatorNotNull(parentDescriptor, descriptor, builder, field);
955
                return filter;
944 956
            case ExpressionBuilder.OPERATOR_EQ:
945 957
            case ExpressionBuilder.OPERATOR_NE:
946 958
            case ExpressionBuilder.OPERATOR_GT:
......
963 975
        }
964 976

  
965 977
        if (parentDescriptor == null) {
966
            if (this.getRelationalOperator() == ExpressionBuilder.OPERATOR_IS_NULL) {
967
                filter = builder.expression().is_null(builder.expression().column(this.store.getName(), descriptor.getName()));
968
            } else if (this.getRelationalOperator() == ExpressionBuilder.OPERATOR_IS_NOT_NULL) {
969
                filter = builder.expression().not_is_null(builder.expression().column(this.store.getName(), descriptor.getName()));
970
            } else {
971
                // Se busca en campos de la misma tabla.
972
                filter = builder.expression().binaryOperator(
973
                        this.getRelationalOperator(),
974
                        builder.expression().column(this.store.getName(), descriptor.getName()),
975
                        value_constant
976
                );
977
            }
978
            // Se busca en campos de la misma tabla.
979
            filter = builder.expression().binaryOperator(
980
                    this.getRelationalOperator(),
981
                    builder.expression().column(this.store.getName(), descriptor.getName()),
982
                    value_constant
983
            );
978 984

  
979
            ExpressionBuilder.Value null_value_constant = null;
980
            ExpressionBuilder.Function null_function = null;
981
            if (this.getRelationalOperator() != ExpressionBuilder.OPERATOR_IS_NULL && this.getRelationalOperator() != ExpressionBuilder.OPERATOR_IS_NOT_NULL) {
982
                if (this.getNullBehavior() == NULL_AS_TRUE) {
983
                    null_value_constant = builder.expression().column(this.store.getName(), descriptor.getName());
984
                    null_function = builder.expression().is_null(null_value_constant);
985
                    filter = builder.expression().or(null_function, filter);
986
                } else if (this.getNullBehavior() == NULL_AS_FALSE) {
987
                    null_value_constant = builder.expression().column(this.store.getName(), descriptor.getName());
988
                    null_function = builder.expression().not_is_null(null_value_constant);
989
                    filter = builder.expression().and(null_function, filter);
990
                }
991
            }
985
            ExpressionBuilder.Value nullValue = builder.expression().column(this.store.getName(), descriptor.getName());
986
            filter = addNullBehavior(builder, filter, nullValue);
992 987

  
993 988
        } else {
994 989
            // Se busca en campos de una tabla relacionada.
995 990
            switch (parentDescriptor.getRelationType()) {
996 991
                case DynField.RELATION_TYPE_COLLABORATION:
997 992
                case DynField.RELATION_TYPE_IDENTITY:
998
                    if (this.getRelationalOperator() ==ExpressionBuilder.OPERATOR_IS_NULL) {
999
                        filter = builder.expression().is_null(builder.foreing_value(
1000
                                parentDescriptor.getName(),
1001
                                descriptor.getName()
1002
                        ));
1003
                    } else if (this.getRelationalOperator() == ExpressionBuilder.OPERATOR_IS_NOT_NULL) {
1004
                        filter = builder.expression().not_is_null(builder.foreing_value(
1005
                                parentDescriptor.getName(),
1006
                                descriptor.getName()
1007
                        ));
1008
                    } else {
1009
                        filter = builder.expression().binaryOperator(
1010
                                this.getRelationalOperator(),
1011
                                builder.foreing_value(
1012
                                        parentDescriptor.getName(),
1013
                                        descriptor.getName()
1014
                                ),
1015
                                value_constant
1016
                        );
1017
                        ExpressionBuilder.Value null_value_constant = null;
1018
                        ExpressionBuilder.Function null_function = null;
1019
                        if (this.getNullBehavior() == NULL_AS_TRUE) {
1020
                            null_value_constant = builder.foreing_value(
993
                    filter = builder.expression().binaryOperator(
994
                            this.getRelationalOperator(),
995
                            builder.foreing_value(
1021 996
                                    parentDescriptor.getName(),
1022 997
                                    descriptor.getName()
1023
                            );
1024
                            null_function = builder.expression().is_null(null_value_constant);
1025
                            filter = builder.expression().or(null_function, filter);
1026
                        } else if (this.getNullBehavior() == NULL_AS_FALSE) {
1027
                            null_value_constant = builder.foreing_value(
1028
                                    parentDescriptor.getName(),
1029
                                    descriptor.getName()
1030
                            );
1031
                            null_function = builder.expression().not_is_null(null_value_constant);
1032
                            filter = builder.expression().and(null_function, filter);
1033
                        }
1034

  
1035
                    }
998
                            ),
999
                            value_constant
1000
                    );
1001
                    ExpressionBuilder.Value nullValue = builder.foreing_value(
1002
                            parentDescriptor.getName(),
1003
                            descriptor.getName()
1004
                    );
1005
                    filter = addNullBehavior(builder, filter, nullValue);
1036 1006
                    break;
1037 1007

  
1038 1008
                case DynField.RELATION_TYPE_AGGREGATE:
1039 1009
                case DynField.RELATION_TYPE_COMPOSITION:
1040 1010
                    ExpressionBuilder.Value op_composition = null;
1041
                    if (this.getRelationalOperator() == ExpressionBuilder.OPERATOR_IS_NULL) {
1042
                        op_composition = builder.expression().is_null(builder.expression().column(
1043
                                field.getFeatureStore().getName(),
1044
                                descriptor.getName()
1045
                        ));
1046
                    } else if (this.getRelationalOperator() == ExpressionBuilder.OPERATOR_IS_NOT_NULL) {
1047
                        op_composition = builder.expression().not_is_null(builder.expression().column(
1048
                                field.getFeatureStore().getName(),
1049
                                descriptor.getName()
1050
                        ));
1051
                    } else {
1052
                        op_composition = builder.expression().binaryOperator(
1053
                                this.getRelationalOperator(),
1054
                                builder.expression().column(
1055
                                        field.getFeatureStore().getName(),
1056
                                        descriptor.getName()
1057
                                ),
1058
                                value_constant
1059
                        );
1060
                        ExpressionBuilder.Value null_value_constant = null;
1061
                        ExpressionBuilder.Function null_function = null;
1062
                        if (this.getNullBehavior() == NULL_AS_TRUE) {
1063
                            null_value_constant = builder.expression().column(
1011
                    op_composition = builder.expression().binaryOperator(
1012
                            this.getRelationalOperator(),
1013
                            builder.expression().column(
1064 1014
                                    field.getFeatureStore().getName(),
1065 1015
                                    descriptor.getName()
1066
                            );
1067
                            null_function = builder.expression().is_null(null_value_constant);
1068
                            op_composition = builder.expression().or(null_function, op_composition);
1069
                        } else if (this.getNullBehavior() == NULL_AS_FALSE) {
1070
                            null_value_constant = builder.expression().column(
1071
                                    field.getFeatureStore().getName(),
1072
                                    descriptor.getName()
1073
                            );
1074
                            null_function = builder.expression().not_is_null(null_value_constant);
1075
                            op_composition = builder.expression().and(null_function, op_composition);
1076
                        }
1077
                    }
1016
                            ),
1017
                            value_constant
1018
                    );
1019
                    ExpressionBuilder.Value null_value = builder.expression().column(
1020
                            field.getFeatureStore().getName(),
1021
                            descriptor.getName()
1022
                    );
1023
                    op_composition = addNullBehavior(builder, filter, null_value);
1078 1024

  
1079 1025
                    filter = builder.exists(builder.select()
1080 1026
                            .column(parentDescriptor.getFeatureType().getPrimaryKey()[0].getName())
......
1100 1046
                    break;
1101 1047
            }
1102 1048
        }
1103
        
1049

  
1104 1050
        filter = builder.expression().group(filter);
1105 1051
        return filter;
1106 1052
    }
......
1188 1134
    public int getNullBehavior() {
1189 1135
        return (int) ((LabeledValue) this.ddnNullBehavior.getSelectedItem()).getValue();
1190 1136
    }
1191
    
1192
    
1137

  
1193 1138
    public int setNullBehavior(int nullBehaviorValue) {
1194
       int n = 0;
1139
        int n = 0;
1195 1140
        for (LabeledValue nullBehavior : nullBehaviors) {
1196 1141
            int toInt = (int) nullBehavior.getValue();
1197 1142
            if (nullBehaviorValue == toInt) {
......
1205 1150
        this.ddnNullBehavior.setSelectedIndex(n);
1206 1151
        return n;
1207 1152
    }
1153

  
1154
    private ExpressionBuilder.Value addNullBehavior(DALExpressionBuilder builder, ExpressionBuilder.Value filter, ExpressionBuilder.Value nullValue) {
1155
        if (this.getRelationalOperator() != ExpressionBuilder.OPERATOR_IS_NULL && this.getRelationalOperator() != ExpressionBuilder.OPERATOR_IS_NOT_NULL) {
1156
            if (this.getNullBehavior() == NULL_AS_TRUE) {
1157
                ExpressionBuilder.Function null_function = builder.expression().is_null(nullValue);
1158
                filter = builder.expression().or(null_function, filter);
1159
            } else if (this.getNullBehavior() == NULL_AS_FALSE) {
1160
                ExpressionBuilder.Function null_function = builder.expression().not_is_null(nullValue);
1161
                filter = builder.expression().and(null_function, filter);
1162
            }
1163
        }
1164
        return filter;
1165
    }
1166

  
1167
    private ExpressionBuilder.Value getFilterForOperatorNull(
1168
            FeatureAttributeDescriptor parentDescriptor,
1169
            FeatureAttributeDescriptor descriptor,
1170
            DALExpressionBuilder builder,
1171
            Field field) {
1172

  
1173
        ExpressionBuilder.Value filter = null;
1174
        if (parentDescriptor == null) {
1175
            filter = builder.expression().is_null(builder.expression().column(this.store.getName(), descriptor.getName()));
1176
        } else {
1177
            // Se busca en campos de una tabla relacionada.
1178
            switch (parentDescriptor.getRelationType()) {
1179
                case DynField.RELATION_TYPE_COLLABORATION:
1180
                case DynField.RELATION_TYPE_IDENTITY:
1181
                    filter = builder.expression().is_null(builder.foreing_value(
1182
                            parentDescriptor.getName(),
1183
                            descriptor.getName()
1184
                    ));
1185
                case DynField.RELATION_TYPE_AGGREGATE:
1186
                case DynField.RELATION_TYPE_COMPOSITION:
1187
                    ExpressionBuilder.Value op_composition = null;
1188
                    op_composition = builder.expression().is_null(builder.expression().column(
1189
                            field.getFeatureStore().getName(),
1190
                            descriptor.getName()
1191
                    ));
1192
                    filter = builder.exists(builder.select()
1193
                            .column(parentDescriptor.getFeatureType().getPrimaryKey()[0].getName())
1194
                            .from(field.getFeatureStore().getName())
1195
                            .limit(1)
1196
                            .where(
1197
                                    builder.expression().and(
1198
                                            builder.expression().eq(
1199
                                                    builder.expression().column(
1200
                                                            field.getFeatureStore().getName(),
1201
                                                            getForeingKeyName(field.getFeatureStore(), this.store)
1202
                                                    ),
1203
                                                    builder.expression().column(
1204
                                                            this.store.getName(),
1205
                                                            getPrimaryKeyName(this.store)
1206
                                                    )
1207
                                            ),
1208
                                            op_composition
1209
                                    )
1210
                            )
1211
                            .toValue()
1212
                    );
1213
            }
1214
        }
1215

  
1216
        filter = builder.expression().group(filter);
1217
        return filter;
1218
    }
1219

  
1220
    private ExpressionBuilder.Value getFilterForOperatorNotNull(
1221
            FeatureAttributeDescriptor parentDescriptor,
1222
            FeatureAttributeDescriptor descriptor,
1223
            DALExpressionBuilder builder,
1224
            Field field) {
1225

  
1226
        ExpressionBuilder.Value filter = null;
1227
        if (parentDescriptor == null) {
1228
            filter = builder.expression().not_is_null(builder.expression().column(this.store.getName(), descriptor.getName()));
1229
        } else {
1230
            // Se busca en campos de una tabla relacionada.
1231
            switch (parentDescriptor.getRelationType()) {
1232
                case DynField.RELATION_TYPE_COLLABORATION:
1233
                case DynField.RELATION_TYPE_IDENTITY:
1234
                    filter = builder.expression().not_is_null(builder.foreing_value(
1235
                            parentDescriptor.getName(),
1236
                            descriptor.getName()
1237
                    ));
1238
                case DynField.RELATION_TYPE_AGGREGATE:
1239
                case DynField.RELATION_TYPE_COMPOSITION:
1240
                    ExpressionBuilder.Value op_composition = null;
1241
                    op_composition = builder.expression().not_is_null(builder.expression().column(
1242
                            field.getFeatureStore().getName(),
1243
                            descriptor.getName()
1244
                    ));
1245

  
1246
                    filter = builder.exists(builder.select()
1247
                            .column(parentDescriptor.getFeatureType().getPrimaryKey()[0].getName())
1248
                            .from(field.getFeatureStore().getName())
1249
                            .limit(1)
1250
                            .where(
1251
                                    builder.expression().and(
1252
                                            builder.expression().eq(
1253
                                                    builder.expression().column(
1254
                                                            field.getFeatureStore().getName(),
1255
                                                            getForeingKeyName(field.getFeatureStore(), this.store)
1256
                                                    ),
1257
                                                    builder.expression().column(
1258
                                                            this.store.getName(),
1259
                                                            getPrimaryKeyName(this.store)
1260
                                                    )
1261
                                            ),
1262
                                            op_composition
1263
                                    )
1264
                            )
1265
                            .toValue()
1266
                    );
1267
            }
1268
        }
1269

  
1270
        filter = builder.expression().group(filter);
1271
        return filter;
1272
    }
1208 1273
}

Also available in: Unified diff