Revision 45739 trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/impl/DefaultDataManager.java

View differences:

DefaultDataManager.java
22 22
import org.gvsig.expressionevaluator.Expression;
23 23
import org.gvsig.expressionevaluator.ExpressionBuilder;
24 24
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
25
import org.gvsig.expressionevaluator.ExpressionUtils;
25 26
import org.gvsig.expressionevaluator.MutableSymbolTable;
26 27
import org.gvsig.expressionevaluator.impl.DefaultDALExpressionBuilder;
28
import org.gvsig.expressionevaluator.impl.DefaultFeatureRuleExpression;
27 29
import org.gvsig.expressionevaluator.impl.symboltable.FeatureSymbolTableImpl;
28 30
import org.gvsig.fmap.dal.BaseStoresRepository;
29 31
import org.gvsig.fmap.dal.DALLocator;
......
62 64
import org.gvsig.fmap.dal.feature.Feature;
63 65
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
64 66
import org.gvsig.fmap.dal.feature.FeatureQuery;
67
import org.gvsig.fmap.dal.feature.FeatureRuleExpression;
65 68
import org.gvsig.fmap.dal.feature.FeatureSet;
66 69
import org.gvsig.fmap.dal.feature.FeatureSet.DisposableFeatureSetIterable;
67 70
import org.gvsig.fmap.dal.feature.FeatureStore;
......
99 102
import org.gvsig.json.Json;
100 103
import org.gvsig.tools.ToolsLocator;
101 104
import org.gvsig.tools.dataTypes.DataType;
105
import org.gvsig.tools.dataTypes.DataTypeUtils;
102 106
import org.gvsig.tools.dataTypes.DataTypesManager;
103 107
import org.gvsig.tools.dispose.DisposeUtils;
104 108
import org.gvsig.tools.dynobject.DynObject;
......
1138 1142
    }
1139 1143

  
1140 1144
    @Override
1145
    public FeatureSymbolTable createFeatureSymbolTable(String name) {
1146
        FeatureSymbolTable symbolTable = new FeatureSymbolTableImpl(name);
1147
        return symbolTable;
1148
    }
1149

  
1150
    @Override
1141 1151
    public FeatureAttributeEmulatorExpression createFeatureAttributeEmulatorExpression(FeatureType type, Expression expression) {
1142 1152
        FeatureAttributeEmulatorExpression emulator = new DefaultFeatureAttributeEmulatorExpression(type, expression);
1143 1153
        return emulator;
......
1330 1340
    }
1331 1341
    
1332 1342
    @Override
1333
    public DynObjectValueItem[] getAvailableValues(FeatureStore myStore, FeatureAttributeDescriptor descriptor) {
1343
    public DynObjectValueItem[] getAvailableValues(DynObject contextValues, FeatureStore myStore, FeatureAttributeDescriptor descriptor) {
1334 1344
        String keyName = myStore.getFullName() + ":columnName=" + descriptor.getName();
1335 1345
        if( this.availableValues==null ) {
1336 1346
            this.availableValues = new HashMap<>();
......
1359 1369
            );
1360 1370
            Expression labelExpression = foreingKey.getLabelExpression(null);
1361 1371
            String codeName = foreingKey.getCodeName();
1362
            FeatureSymbolTable featureSymbolTable = this.createFeatureSymbolTable();
1372
            FeatureSymbolTable featureSymbolTable = this.createFeatureSymbolTable("feature");
1363 1373
            MutableSymbolTable symbolTable = featureSymbolTable.createParent();
1364 1374
        
1365
            int count = (int) foreingStore.getFeatureCount();
1366
            values = new DynObjectValueItem[Math.min(count, MAX_AVAILABLE_VALUES)];
1375
            Expression filter = descriptor.getAvailableValuesFilter();
1376
            if( filter != null ) {
1377
                MutableSymbolTable filterFeatureSymbolTable = ExpressionUtils.createSymbolTable(
1378
                        "filter", contextValues
1379
                );
1380
                featureSymbolTable.addSymbolTable(filterFeatureSymbolTable);
1381
            }
1382

  
1383
            List<DynObjectValueItem> values_list = new ArrayList<>();
1367 1384
            int n = 0;
1368 1385
            for (Feature feature : set = foreingStore.getFeatureSet().iterable()) {
1369
                Object code = feature.get(codeName);
1370
                Object value;
1386
                Object value = feature.get(codeName);
1387
                Object label;
1371 1388
                if (labelExpression == null) {
1372
                    value = code;
1389
                    label = value;
1373 1390
                } else {
1374 1391
                    featureSymbolTable.setFeature(feature);
1375
                    value = labelExpression.execute(symbolTable);
1392
                    label = labelExpression.execute(symbolTable);
1376 1393
                }
1377
                values[n++] = new DynObjectValueItem(code, Objects.toString(value, Objects.toString(code, "##ERROR##")));
1394

  
1395
                if( filter != null ) {
1396
                    symbolTable.setVar("$value", value);
1397
                    symbolTable.setVar("$label", label);
1398
                    featureSymbolTable.setFeature(feature);
1399
                    Object include = filter.execute(featureSymbolTable);
1400
                    if( DataTypeUtils.isFalse(include, false) ) {
1401
                        continue;
1402
                    }
1403
                }
1404
  
1405
                values_list.add(new DynObjectValueItem(value, Objects.toString(label, Objects.toString(value, "##ERROR##"))));
1378 1406
                if( n>=MAX_AVAILABLE_VALUES ) {
1379 1407
                    break;
1380 1408
                }
1381 1409
            }
1382
            this.availableValues.put(keyName, values);
1410
            values = values_list.toArray(new DynObjectValueItem[values_list.size()]);
1411
            if( filter==null ) {
1412
                this.availableValues.put(keyName, values);
1413
            }
1383 1414
            return values;
1384 1415
        } catch (Exception ex) {
1385 1416
            LOGGER.warn("Can't get available values for field '"+myStore.getName()+"."+descriptor.getName()+"' from table '" + foreingKey.getTableName() + "'.", ex);
......
1496 1527
        }
1497 1528
        return features;
1498 1529
    }
1530

  
1531
    @Override
1532
    public FeatureRuleExpression createFeatureRuleExpression() {
1533
        FeatureRuleExpression rule = new DefaultFeatureRuleExpression();
1534
        return rule;
1535
    }
1536
    
1499 1537
}

Also available in: Unified diff