Revision 47248

View differences:

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/feature/impl/DefaultFeatureQuery.java
30 30
import java.util.Iterator;
31 31
import java.util.List;
32 32
import java.util.Map;
33
import java.util.logging.Level;
33 34
import javax.json.JsonObject;
34 35
import org.apache.commons.lang3.ArrayUtils;
35 36
import org.apache.commons.lang3.StringUtils;
36 37
import org.apache.commons.lang3.builder.ToStringBuilder;
38
import org.apache.commons.lang3.mutable.MutableBoolean;
39
import org.gvsig.expressionevaluator.Code;
40
import org.gvsig.expressionevaluator.CodeBuilder;
41
import org.gvsig.expressionevaluator.Codes;
37 42
import org.gvsig.expressionevaluator.Expression;
38 43
import org.gvsig.expressionevaluator.ExpressionEvaluator;
39 44
import org.gvsig.expressionevaluator.ExpressionUtils;
45
import org.gvsig.expressionevaluator.MutableCodes;
40 46
import org.gvsig.expressionevaluator.MutableSymbolTable;
41 47
import org.gvsig.fmap.dal.DALLocator;
42 48
import org.gvsig.fmap.dal.DataManager;
43 49
import org.gvsig.fmap.dal.DataTypes;
44 50
import org.gvsig.fmap.dal.exception.DataException;
45 51
import org.gvsig.fmap.dal.exception.InitializeException;
52
import org.gvsig.fmap.dal.expressionevaluator.FeatureAttributeEmulatorExpression;
53
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
46 54
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
47 55
import org.gvsig.fmap.dal.feature.FeatureExtraColumns;
48 56
import org.gvsig.fmap.dal.feature.FeatureQuery;
......
60 68
import org.gvsig.tools.evaluator.AndEvaluator;
61 69
import org.gvsig.tools.evaluator.Evaluator;
62 70
import org.gvsig.tools.evaluator.EvaluatorFieldsInfo;
71
import org.gvsig.tools.exception.BaseException;
63 72
import org.gvsig.tools.packageutils.Version;
64 73
import org.gvsig.tools.packageutils.impl.DefaultVersion;
65 74
import org.gvsig.tools.persistence.PersistentState;
66 75
import org.gvsig.tools.persistence.exception.PersistenceException;
76
import org.gvsig.tools.visitor.VisitCanceledException;
77
import org.gvsig.tools.visitor.Visitor;
67 78
import org.slf4j.Logger;
68 79
import org.slf4j.LoggerFactory;
69 80

  
......
715 726
        // Correcciones por perdida de compatibilidad entre versiones
716 727
        //
717 728
        
729
        // Ver TC13-AC Listado peatones USUARIOS 2021.....
730
        
718 731
        if(version == null || version.compareTo(VERSION_2_6_0)<0){
719 732
            if(this.limit == 0) {
720 733
                this.clearLimit();
721 734
            }
735
            Expression exp = this.getExpressionFilter();
736
            fixOldExistsSelect(exp);
737
            for (EditableFeatureAttributeDescriptor extraColumn : this.extraColumns) {
738
                if(extraColumn.getFeatureAttributeEmulator() instanceof FeatureAttributeEmulatorExpression) {
739
                    exp = ((FeatureAttributeEmulatorExpression)extraColumn.getFeatureAttributeEmulator()).getExpression();
740
                    fixOldExistsSelect(exp);
741
                }
742
            }
722 743
        }
723 744
    }
724 745

  
......
1216 1237
            return super.toString();
1217 1238
        }
1218 1239
    }
1240

  
1241
    private void fixOldExistsSelect(Expression exp) {
1242
        try {
1243
            if(exp == null || !StringUtils.containsIgnoreCase(exp.getPhrase(), "SELECT")
1244
                    || !StringUtils.containsIgnoreCase(exp.getPhrase(), "EXISTS")){
1245
                return;
1246
            }
1247

  
1248
            MutableBoolean modified = new MutableBoolean(false);
1249
            Code code = exp.getCode();
1250
            code.accept(new Visitor() {
1251
                CodeBuilder codeBuilder = null;
1252
                @Override
1253
                public void visit(Object obj) throws VisitCanceledException, BaseException {
1254
                    if(Code.isFunction((Code) obj, "EXISTS")){
1255
                        Code.Callable fnExists = (Code.Callable) obj;
1256
                        if(Code.isFunction(fnExists.parameters().get(0), "SELECT")){
1257
                            Code.Callable fnSelect = (Code.Callable) fnExists.parameters().get(0);
1258
                            MutableCodes params = (MutableCodes) fnSelect.parameters();
1259
                            if(Code.isFunction(params.get(0), "GETATTR")){
1260
                                if(codeBuilder == null){
1261
                                    codeBuilder = ExpressionUtils.createCodeBuilder();
1262
                                }
1263
                                
1264
                                Code value = codeBuilder.tuple(codeBuilder.constant(1));
1265
                                params.set(0, value);
1266
                                modified.setTrue();
1267
                            }
1268
                        }
1269
                    }
1270
                }
1271
            });
1272
            if(modified.isTrue()){
1273
                code.link();
1274
                exp.setPhrase(code.toString());
1275
            }
1276
        } catch (Exception ex) {
1277
            LOGGER.debug("Can't fix old query with exists and select.", ex);
1278
        }
1279
        
1280
    }
1219 1281
    
1220 1282
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/CodeBuilder.java
31 31
    Callable tuple();
32 32

  
33 33
    Callable tuple(Codes args);
34
    
35
    Callable tuple(Code... items);
34 36

  
35 37
    Code add(Code op1, Code op2);
36 38

  
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/DefaultCodeBuilder.java
855 855
    }
856 856

  
857 857
    @Override
858
    public Callable tuple(Code... items) {
859
        BaseCodes args = this.args();
860
        if (items != null) {
861
            for (Code item : items) {
862
                args.add(item);
863
            }
864
        }
865
        return function(FUNCTION_TUPLE, args);
866
    }
867

  
868
    @Override
858 869
    public Callable function(String name, int type, Codes args) {
859 870
        return new BaseCaller(name, type, args);
860 871
    }

Also available in: Unified diff