Statistics
| Revision:

svn-gvsig-desktop / 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 / expressionbuilderformatter / Select.java @ 44764

History | View | Annotate | Download (3.18 KB)

1
package org.gvsig.fmap.dal.store.jdbc2.spi.expressionbuilderformatter;
2

    
3
import org.apache.commons.lang3.StringUtils;
4
import org.gvsig.expressionevaluator.ExpressionBuilder;
5
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_TUPLE;
6
import org.gvsig.expressionevaluator.ExpressionBuilder.Function;
7
import org.gvsig.expressionevaluator.ExpressionBuilder.Value;
8
import org.gvsig.expressionevaluator.Formatter;
9
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT;
10

    
11
/**
12
 *
13
 * @author jjdelcerro
14
 */
15
@SuppressWarnings("UseSpecificCatch")
16
public class Select implements Formatter<Value> {
17

    
18
  private final Formatter<Value> formatter;
19

    
20
  public Select(Formatter<Value> formatter) {
21
    this.formatter = formatter;
22
  }
23

    
24
  @Override
25
  public boolean canApply(ExpressionBuilder.Value value) {
26
    if (value instanceof ExpressionBuilder.Function) {
27
      return StringUtils.equalsIgnoreCase(FUNCTION_SELECT, ((Function) value).name());
28
    }
29
    return false;
30
  }
31

    
32
  private static final int COLUMNS = 0;
33
  private static final int TABLE = 1;
34
  private static final int WHERE = 2;
35
  private static final int ORDER = 3;
36
  private static final int ORDER_MODE = 4;
37
  private static final int LIMIT = 5;
38

    
39
  @Override
40
  public String format(Value function0) {
41
    Function function = (Function) function0;
42
    String tableName = (String) function.parameters().get(TABLE).toString();
43
    Value where = function.parameters().get(WHERE);
44
    Value order = function.parameters().get(ORDER);
45
    Value limit = function.parameters().get(LIMIT);
46
    Value order_mode = function.parameters().get(ORDER_MODE);
47

    
48
    StringBuilder builder = new StringBuilder();
49
    builder.append("(SELECT ");
50

    
51
    try {
52
      Function columns = (Function) function.parameters().get(COLUMNS);
53
      if (!StringUtils.equalsIgnoreCase(((ExpressionBuilder.Function) columns).name(), FUNCTION_TUPLE)) {
54
        throw new IllegalArgumentException();
55
      }
56
      if( columns.parameters().isEmpty() ) {
57
            builder.append("* ");
58
      } else {
59
        boolean needcomma = false;
60
        for (Value parameter : columns.parameters()) {
61
          if(needcomma) {
62
            builder.append(", ");
63
          } else {
64
            needcomma = true;
65
          }
66
          builder.append(parameter.toString(formatter));
67
        }
68
      }
69
    } catch (Exception ex) {
70
      throw new IllegalArgumentException("Invalid columns, need a tuple function as columns.");
71
    }
72

    
73
    builder.append(" FROM ");
74
    builder.append(tableName);
75
    if (where != null) {
76
      builder.append(" WHERE ");
77
      builder.append(where.toString(formatter));
78
    }
79
//        for( int n=0 ; function.containsParameter("ORDER", n); n++) {
80
//          if( n>0 ) {
81
//            builder.append(", ");
82
//          }
83
//          builder.append(function.getParameter("ORDER",n).toString(formatter));
84
//          if( StringUtils.equalsIgnoreCase(function.getParameter("ORDER_MODE",n).toString(),"true") ) {
85
//            builder.append(" ASC ");
86
//          } else {
87
//            builder.append(" DESC ");
88
//          }
89
//        }
90
    if (limit != null) {
91
      builder.append(" LIMIT ");
92
      builder.append(limit.toString(formatter));
93
    }
94
    builder.append(")");
95
    return builder.toString();
96
  }
97

    
98
}