Some import reorganizing by Eclipse
[online-glom:gwt-glom.git] / src / main / java / org / glom / web / server / database / ListViewDBAccess.java
1 /*
2  * Copyright (C) 2011 Openismus GmbH
3  *
4  * This file is part of GWT-Glom.
5  *
6  * GWT-Glom is free software: you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as published by the
8  * Free Software Foundation, either version 3 of the License, or (at your
9  * option) any later version.
10  *
11  * GWT-Glom is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
14  * for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with GWT-Glom.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 package org.glom.web.server.database;
21
22 import java.sql.Connection;
23 import java.util.ArrayList;
24 import java.util.List;
25
26 import org.apache.commons.lang3.StringUtils;
27 import org.glom.web.server.SqlUtils;
28 import org.glom.web.shared.DataItem;
29 import org.glom.web.shared.TypedDataItem;
30 import org.glom.web.shared.libglom.Document;
31 import org.glom.web.shared.libglom.Field;
32 import org.glom.web.shared.libglom.layout.LayoutGroup;
33 import org.glom.web.shared.libglom.layout.LayoutItemField;
34 import org.glom.web.shared.libglom.layout.SortClause;
35 import org.jooq.Condition;
36
37 import com.mchange.v2.c3p0.ComboPooledDataSource;
38
39 /**
40  *
41  */
42 public class ListViewDBAccess extends ListDBAccess {
43
44         public ListViewDBAccess(final Document document, final String documentID, final ComboPooledDataSource cpds,
45                         final String tableName, final LayoutGroup libglomLayoutGroup) {
46                 super(document, documentID, cpds, tableName);
47
48                 // Convert the LayoutGroup object into a List suitable for SQL queries.
49                 final List<LayoutGroup> tempLayoutGroupVec = new ArrayList<LayoutGroup>();
50                 tempLayoutGroupVec.add(libglomLayoutGroup);
51                 fieldsToGet = getFieldsToShowForSQLQuery(tempLayoutGroupVec);
52
53                 // Add a LayoutItem_Field for the primary key to the end of the LayoutFieldVector if it doesn't already contain
54                 // a primary key.
55                 if (getPrimaryKeyIndex() < 0) {
56                         fieldsToGet.add(getPrimaryKeyLayoutItemField(tableName));
57                 }
58         }
59
60         public ArrayList<DataItem[]> getData(final String quickFind, final int start, final int length,
61                         final boolean useSortClause, final int sortColumnIndex, final boolean isAscending) {
62
63                 return getListData(quickFind, start, length, useSortClause, sortColumnIndex, isAscending);
64         }
65
66         /*
67          * (non-Javadoc)
68          * 
69          * @see org.glom.web.server.ListDBAccess#getExpectedResultSize()
70          */
71         public int getExpectedResultSize() {
72
73                 if (fieldsToGet == null || fieldsToGet.size() <= 0)
74                         return -1;
75
76                 return getResultSizeOfSQLQuery();
77         }
78
79         /*
80          * (non-Javadoc)
81          * 
82          * @see org.glom.web.server.ListDBAccess#getSQLQuery(LayoutFieldVector, SortClause)
83          */
84         @Override
85         protected String getSelectQuery(final Connection connection, final String quickFind, final SortClause sortClause) {
86                 // Later versions of libglom actually return an empty SqlExpr when quickFindValue is empty,
87                 // but let's be sure:
88                 Condition whereClause = null;
89                 if (!StringUtils.isEmpty(quickFind)) {
90                         final TypedDataItem quickFindValue = new TypedDataItem();
91                         quickFindValue.setText(quickFind);
92                         whereClause = SqlUtils.get_find_where_clause_quick(document, tableName, quickFindValue);
93                 }
94
95                 return SqlUtils.build_sql_select_with_where_clause(connection, tableName, fieldsToGet, whereClause, sortClause);
96         }
97
98         /*
99          * (non-Javadoc)
100          * 
101          * @see org.glom.web.server.ListDBAccess#getCountQuery(LayoutFieldVector)
102          */
103         @Override
104         protected String getCountQuery(final Connection connection) {
105                 return SqlUtils.build_sql_count_select_with_where_clause(connection, tableName, fieldsToGet);
106         }
107
108         /**
109          * Gets the primary key index of this list layout.
110          * 
111          * @return index of primary key or -1 if a primary key was not found
112          */
113         private int getPrimaryKeyIndex() {
114                 for (int i = 0; i < fieldsToGet.size(); i++) {
115                         final LayoutItemField layoutItemField = fieldsToGet.get(i);
116                         final Field field = layoutItemField.get_full_field_details();
117                         if (tableName.equals(layoutItemField.get_table_used(tableName)) && field != null && field.get_primary_key())
118                                 return i;
119                 }
120                 return -1;
121         }
122 }