Revision 45710 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/operations/CountOperation.java

View differences:

CountOperation.java
38 38
import org.gvsig.fmap.dal.expressionevaluator.FeatureAttributeEmulatorExpression;
39 39
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
40 40
import org.gvsig.fmap.dal.feature.FeatureQuery;
41
import org.gvsig.fmap.dal.feature.FeatureQueryOrder;
41 42
import org.gvsig.fmap.dal.feature.FeatureType;
42 43
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
43 44
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
......
85 86

  
86 87
        SelectBuilder select = sqlbuilder.select();
87 88

  
88
        if (this.query != null && this.query.hasGroupByColumns()) {
89
        if (this.query != null) { // && (this.query.hasOrder() || this.query.hasGroupByColumns())) {
89 90
            JDBCSQLBuilderBase subsqlbuilder = this.createSQLBuilder();
90 91
            SelectBuilder subselect = subsqlbuilder.select();
91
            subselect.column().value(subsqlbuilder.count().all());
92
            subselect.from().table()
93
                    .database(this.table.getDatabase())
94
                    .schema(this.table.getSchema())
95
                    .name(this.table.getTable());
96
            subselect.from().subquery(this.table.getSubquery());
97
            Evaluator filter = query == null ? null : query.getFilter();
98
            if (filter != null) {
99
                String sqlfilter = filter.getSQL();
100
                if (!StringUtils.isEmpty(sqlfilter)) {
101
                    if (this.helper.supportFilter(this.featureType, filter)) {
102
                        subselect.where().set(expbuilder.toValue(sqlfilter));
92
            if (this.query.hasGroupByColumns()) {
93
                if (this.query.hasOrder()) {
94
                    FeatureQueryOrder order = query.getOrder();
95
                    if (order != null) {
96
                        for (FeatureQueryOrder.FeatureQueryOrderMember member : order.members()) {
97
                            if (member.hasEvaluator()) {
98
                                String sqlorder = member.getEvaluator().getSQL();
99
                                if (!StringUtils.isEmpty(sqlorder)) {
100
                                    subselect.order_by()
101
                                            .value(expbuilder.toValue(sqlorder))
102
                                            .ascending(member.getAscending());
103
                                }
104
                            } else {
105
                                subselect.order_by()
106
                                        .column(member.getAttributeName())
107
                                        .ascending(member.getAscending());
108
                            }
109
                        }
103 110
                    }
104 111
                }
105
            }
106
            if (!StringUtils.isEmpty(baseFilter)) {
107
                subselect.where().and(expbuilder.toValue(baseFilter));
108
            }
112
                subselect.column().value(subsqlbuilder.count().all());
113
                subselect.from().table()
114
                        .database(this.table.getDatabase())
115
                        .schema(this.table.getSchema())
116
                        .name(this.table.getTable());
117
                subselect.from().subquery(this.table.getSubquery());
118
                Evaluator filter = query == null ? null : query.getFilter();
119
                if (filter != null) {
120
                    String sqlfilter = filter.getSQL();
121
                    if (!StringUtils.isEmpty(sqlfilter)) {
122
                        if (this.helper.supportFilter(this.featureType, filter)) {
123
                            subselect.where().set(expbuilder.toValue(sqlfilter));
124
                        }
125
                    }
126
                }
127
                if (!StringUtils.isEmpty(baseFilter)) {
128
                    subselect.where().and(expbuilder.toValue(baseFilter));
129
                }
109 130

  
110 131

  
111
            List<String> groupbyColumns = query == null ? null : query.getGroupByColumns();
112
            if (groupbyColumns != null && !groupbyColumns.isEmpty()) {
113
                for (String columnName : groupbyColumns) {
114
                    if (this.featureType.getAttributeDescriptor(columnName) != null) {
115
                        subselect.group_by(expbuilder.column(columnName));
116
                    } else if(this.featureType.getExtraColumns().get(columnName)!=null) {
117
                        EditableFeatureAttributeDescriptor attr = this.featureType.getExtraColumns().get(columnName);
118
                        subselect.group_by(expbuilder.column(columnName));
119
                        Expression exp = ((FeatureAttributeEmulatorExpression) attr.getFeatureAttributeEmulator()).getExpression();
120
                        subselect.column().value(exp.getCode().toValue()).as(columnName);
121
                    } else {
122
                        try {
132
                List<String> groupbyColumns = query == null ? null : query.getGroupByColumns();
133
                if (groupbyColumns != null && !groupbyColumns.isEmpty()) {
134
                    for (String columnName : groupbyColumns) {
135
                        if (this.featureType.getAttributeDescriptor(columnName) != null) {
136
                            subselect.group_by(expbuilder.column(columnName));
137
                        } else if(this.featureType.getExtraColumns().get(columnName)!=null) {
138
                            EditableFeatureAttributeDescriptor attr = this.featureType.getExtraColumns().get(columnName);
139
                            subselect.group_by(expbuilder.column(columnName));
140
                            Expression exp = ((FeatureAttributeEmulatorExpression) attr.getFeatureAttributeEmulator()).getExpression();
141
                            subselect.column().value(exp.getCode().toValue()).as(columnName);
142
                        } else {
123 143
                            try {
124
                                Code groupByColumnCode = ExpressionUtils.compile(columnName);
125
//                                if (groupByColumnCode.code() == Code.CALLABLE) {
126
//                                    Code.Callable callable = (Code.Callable) groupByColumnCode;
127
//                                    if (callable.name().equalsIgnoreCase(FUNCTION_LET)) {
128
//                                        Code exp = callable.parameters().get(1);
129
//                                        Code name = callable.parameters().get(0);
130
//                                        subselect.column().value(exp.toValue())
131
//                                                .as((String) ((Code.Constant) name).value());
132
//                                        // nombre que se pone en la parte del groupby debe de ser el nombre de la var del set
133
//                                        groupByColumnCode = exp; 
134
//                                    }
135
//                                }
136
                                subselect.group_by(groupByColumnCode.toValue());
144
                                try {
145
                                    Code groupByColumnCode = ExpressionUtils.compile(columnName);
146
    //                                if (groupByColumnCode.code() == Code.CALLABLE) {
147
    //                                    Code.Callable callable = (Code.Callable) groupByColumnCode;
148
    //                                    if (callable.name().equalsIgnoreCase(FUNCTION_LET)) {
149
    //                                        Code exp = callable.parameters().get(1);
150
    //                                        Code name = callable.parameters().get(0);
151
    //                                        subselect.column().value(exp.toValue())
152
    //                                                .as((String) ((Code.Constant) name).value());
153
    //                                        // nombre que se pone en la parte del groupby debe de ser el nombre de la var del set
154
    //                                        groupByColumnCode = exp; 
155
    //                                    }
156
    //                                }
157
                                    subselect.group_by(groupByColumnCode.toValue());
158
                                } catch (Exception ex) {
159
                                    throw new RuntimeException("Not able to create column by expression in groupby query", ex);
160
                                }
137 161
                            } catch (Exception ex) {
138 162
                                throw new RuntimeException("Not able to create column by expression in groupby query", ex);
139 163
                            }
140
                        } catch (Exception ex) {
141
                            throw new RuntimeException("Not able to create column by expression in groupby query", ex);
142 164
                        }
143 165
                    }
144 166
                }
167
                this.helper.processSpecialFunctions(subsqlbuilder, featureType, null);
168
                subsqlbuilder.setProperties(
169
                        ExpressionBuilder.Variable.class,
170
                        PROP_TABLE, table
171
                );
172
                String subsql = subselect.toString();
173
                select.from().table()
174
                        .database(this.table.getDatabase())
175
                        .schema(this.table.getSchema())
176
                        .name(this.table.getTable());
177
                select.from().subquery(subsql);
145 178
            }
146
            this.helper.processSpecialFunctions(subsqlbuilder, featureType, null);
147
            subsqlbuilder.setProperties(
148
                    ExpressionBuilder.Variable.class,
149
                    PROP_TABLE, table
150
            );
151
            String subsql = subselect.toString();
152
            select.from().table()
153
                    .database(this.table.getDatabase())
154
                    .schema(this.table.getSchema())
155
                    .name(this.table.getTable());
156
            select.from().subquery(subsql);
157

  
158 179
        } else {
159 180
            select.column().value(sqlbuilder.count().all());
160 181
            select.from().table()

Also available in: Unified diff