Revision 46091

View differences:

trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/expressionbuilder/formatters/$Constant.java
34 34
import org.gvsig.fmap.dal.SQLBuilder;
35 35
import static org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase.PROP_SYMBOLTABLE;
36 36
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_$CONSTANT;
37
import org.gvsig.expressionevaluator.GeometryExpressionBuilder;
38
import org.gvsig.fmap.geom.Geometry;
37 39

  
38 40
/**
39 41
 *
......
59 61

  
60 62
    @Override
61 63
    public String format(Value value) {
62
        return resolve(this.sqlbuilder.expression(), this.formatter, value);
64
        return resolve(this.sqlbuilder, this.formatter, value);
63 65
    }
64 66
    
65 67
    public static boolean isConstant(Value value) {
......
70 72
               StringUtils.equalsIgnoreCase(((ExpressionBuilder.Function)value).name(),FUNCTION_$CONSTANT);
71 73
    }
72 74
    
73
    public static String resolve(Value value) {
74
        ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
75
        return resolve(builder, null, value);
76
    }
77 75
    
78
    public static String resolve(ExpressionBuilder builder, Formatter<Value> formatter, Value value) {
76
    public static String resolve(SQLBuilder sqlbuilder, Formatter<Value> formatter, Value value) {
77
		GeometryExpressionBuilder builder = sqlbuilder.expression();
79 78
        if( value instanceof ExpressionBuilder.Constant) {
80 79
            Object x = ((ExpressionBuilder.Constant)value).value();
81 80
            return builder.constant(x).toString(formatter);
......
83 82
                StringUtils.equalsIgnoreCase(((ExpressionBuilder.Function)value).name(),FUNCTION_$CONSTANT) ) {
84 83
            SymbolTable symbolTable = (SymbolTable) value.getProperty(PROP_SYMBOLTABLE);
85 84
            Object x = ExpressionUtils.evaluate(symbolTable, value.toString());
85
			
86
			if( x instanceof Geometry && builder instanceof GeometryExpressionBuilder) {
87
				GeometryExpressionBuilder gbuilder = (GeometryExpressionBuilder) builder;
88
				Geometry geom = (Geometry) x;
89
				String hexwkb = geom.convertToHexWKBQuietly();
90
				
91
				Function v = gbuilder.ST_GeomFromWKB(
92
					gbuilder.decode(
93
						gbuilder.constant(hexwkb),
94
						gbuilder.constant("hex")
95
					),
96
					gbuilder.constant(
97
						sqlbuilder.srs_id(geom.getProjection())
98
					)
99
				);
100
				return v.toString(formatter);
101
			}
86 102
            return builder.constant(x).toString(formatter);
87 103
        } 
88 104
        throw new RuntimeException("Expected constant value or $$CONSTANT function ("+Objects.toString(value)+").");
trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.app/org.gvsig.app.mainplugin/src/main/java/org/gvsig/app/project/symboltables/ProjectSymbolTable.java
4 4
import java.io.FileInputStream;
5 5
import java.util.HashMap;
6 6
import java.util.Iterator;
7
import java.util.List;
8 7
import java.util.Map;
9 8
import java.util.Properties;
10 9
import org.apache.commons.io.IOUtils;
......
32 31
import org.gvsig.fmap.dal.HasDataStore;
33 32
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
34 33
import org.gvsig.fmap.dal.feature.Feature;
35
import org.gvsig.fmap.dal.feature.FeatureQuery;
36 34
import org.gvsig.fmap.dal.feature.FeatureSet;
37 35
import org.gvsig.fmap.dal.feature.FeatureStore;
38 36
import org.gvsig.fmap.geom.Geometry;
......
44 42
import org.gvsig.temporarystorage.TemporaryStorageGroup;
45 43
import org.gvsig.temporarystorage.TemporaryStorageLocator;
46 44
import org.gvsig.temporarystorage.TemporaryStorageManager;
47
import org.gvsig.tools.util.UnmodifiableBasicList;
48 45

  
49 46
/**
50 47
 *
......
494 491
            Geometry value = (Geometry) storage.get(getStr(args, 0));
495 492
            return value;
496 493
        }
494
		
495
		}
497 496

  
498
    }
499

  
500 497
    private  class AreaFunction extends AbstractGeometryFunction {
501 498
        
502 499
        public AreaFunction() {
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/spi/AbstractLexicalAnalyzer.java
353 353
        }
354 354
        token.set(Token.STRING_LITERAL, buffer.toString());
355 355
    }
356

  
356
    
357
//    protected void parseStringBlock() {
358
//        buffer.clear();
359
//        char ch = getch();
360
//        while (true) {
361
//            if (ch == EOF) {
362
//                throw new ExpressionSyntaxException(I18N.End_of_string_was_expected_and_end_of_source_was_found(), this);
363
//            }
364
//            if (ch == '$') {
365
//                ch = getch();
366
//                if (ch == EOF) {
367
//                    break;
368
//                }
369
//                if (ch != '$') {
370
//                    ungetch();
371
//                    break;
372
//                }
373
//            }
374
//            buffer.add(ch);
375
//            ch = getch();
376
//        }
377
//        token.set(Token.STRING_LITERAL, buffer.toString());
378
//    }
379
    
357 380
    protected void parseDMSNumber() {
358 381
        int d;
359 382
        int m;
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/LexicalAnalyzer.java
48 48
        public static final int ASSIGNMENT = 38;
49 49
        public static final int ARGUMENT_ASSIGNMENT = 39;
50 50
        public static final int COLON = 40;
51
        public static final int BEGIN_$CONSTANT = 41;
52
        public static final int END_$CONSTANT = 42;
51 53

  
52 54
        @Override
53 55
        public Token clone() throws CloneNotSupportedException;
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/SQLLexicalAnalyzer.java
73 73
            token.set(Token.OP_DIV, "/");
74 74
            return token;
75 75
        case '%':
76
			ch = getch();
77
            switch( ch ) {
78
            case EOF:
79
                throw new ExpressionSyntaxException(I18N.unexpected_end_of_source(), this);
80
            case '>':
81
                token.set(Token.END_$CONSTANT, "%>");
82
                return token;
83
            }
84
            ungetch();
76 85
            token.set(Token.OP_MOD, "%");
77 86
            return token;
78 87
        case '=':
......
112 121
            case '=':
113 122
                token.set(Token.OP_LE, "<=");
114 123
                return token;
124
            case '%':
125
                token.set(Token.BEGIN_$CONSTANT, "<%");
126
                return token;
115 127
            }
116 128
            ungetch();
117 129
            token.set(Token.OP_LT, "<");
......
232 244
        case '\'':
233 245
            parseString();
234 246
            return token;
235
        
247
            
236 248
        case '@':
237 249
            ungetch();
238 250
            parseDMSNumber();
239 251
            return token;
252
//            
253
//        case '$':
254
//            ch = getch();
255
//            switch( ch ) {
256
//            case EOF:
257
//                throw new ExpressionSyntaxException(I18N.unexpected_end_of_source(), this);
258
//            case '$':
259
//                parseStringBlock();
260
//                return token;
261
//            }
262
//            ungetch();
263
//            ungetch();
264
//            break;
240 265
        }
241 266
        
242 267
        if( Character.isDigit(ch) ) {
243 268
            ungetch();
244 269
            parseNumber();
245 270
            return token;
246
        }
271
        }             
247 272
        if( Character.isAlphabetic(ch) || ch =='$' ) {
248 273
            buffer.clear();
249 274
            while( Character.isLetterOrDigit(ch) || ch =='$' || ch == '_' ) {
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/grammars/BasicGrammarFactory.java
164 164
            theGrammar.addStatement(this.createTimeStatement(theGrammar));
165 165
            theGrammar.addStatement(this.createTimestampStatement(theGrammar));
166 166
            theGrammar.addStatement(this.createWhileStatement(theGrammar));
167
            theGrammar.addStatement(this.create$ConstantStatement(theGrammar));
167 168

  
168 169
            this.grammar = theGrammar;
169 170
        }
......
187 188
        stmt.builder(new BeginStatementBuilder("VALUES", "EXCEPT"));
188 189
        return stmt;
189 190
    }
191
	
192
    private Statement create$ConstantStatement(Grammar theGrammar) {
193
        Statement stmt;
190 194

  
195
        stmt = theGrammar.createStatement("$Constant");
196
        stmt.addRule(stmt.require_any_token("<%"));
197
        stmt.addRule(stmt.require_any_token("="));
198
        stmt.addRule(stmt.require_expression().capture_as("VALUE"));
199
        stmt.addRule(stmt.require_any_token("%>"));
200
		stmt.code(
201
				  ExpressionBuilder.FUNCTION_$CONSTANT,
202
				  stmt.args_names("VALUE")
203
			  );
204
        return stmt;
205
    }
206

  
191 207
    private Statement createIfStatement(Grammar theGrammar) {
192 208
        Statement stmt;
193 209

  
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/test/java/org/gvsig/expresionevaluator/impl/TestGrammarCompiler.java
419 419
        link(code);
420 420
        assertEquals("PASS()", code.toString());
421 421
    }
422
	
423
    public void test$Constant1() {
424
        String source = "set x = <%='hola'%>";
425

  
426
        Compiler compiler = createCompiler();
427

  
428
        Code code = compiler.compileExpression(source);
429
        link(code);
430
        assertEquals("LET('x', $CONSTANT('hola'))", code.toString());
431
    }
422 432
    
423 433

  
424 434
}

Also available in: Unified diff