Move use of Glom.build_sql*() into a new SqlUtils class.
[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.util.ArrayList;
23
24 import org.apache.commons.lang3.StringUtils;
25 import org.glom.libglom.Document;
26 import org.glom.libglom.Field;
27 import org.glom.libglom.Glom;
28 import org.glom.libglom.LayoutGroupVector;
29 import org.glom.libglom.LayoutItem_Field;
30 import org.glom.libglom.SortClause;
31 import org.glom.libglom.SqlExpr;
32 import org.glom.libglom.Value;
33 import org.glom.web.server.SqlUtils;
34 import org.glom.web.shared.DataItem;
35
36 import com.mchange.v2.c3p0.ComboPooledDataSource;
37
38 /**
39  *
40  */
41 public class ListViewDBAccess extends ListDBAccess {
42
43         public ListViewDBAccess(final Document document, final String documentID, final ComboPooledDataSource cpds,
44                         final String tableName, final org.glom.libglom.LayoutGroup libglomLayoutGroup) {
45                 super(document, documentID, cpds, tableName);
46
47                 // Convert the libglom LayoutGroup object into a LayoutFieldVector suitable for SQL queries.
48                 final LayoutGroupVector tempLayoutGroupVec = new LayoutGroupVector();
49                 tempLayoutGroupVec.add(libglomLayoutGroup);
50                 fieldsToGet = getFieldsToShowForSQLQuery(tempLayoutGroupVec);
51
52                 // Add a LayoutItem_Field for the primary key to the end of the LayoutFieldVector if it doesn't already contain
53                 // a primary key.
54                 if (getPrimaryKeyIndex() < 0) {
55                         fieldsToGet.add(getPrimaryKeyLayoutItemField(tableName));
56                 }
57         }
58
59         public ArrayList<DataItem[]> getData(final String quickFind, final int start, final int length,
60                         final boolean useSortClause, final int sortColumnIndex, final boolean isAscending) {
61
62                 return getListData(quickFind, start, length, useSortClause, sortColumnIndex, isAscending);
63         }
64
65         /*
66          * (non-Javadoc)
67          * 
68          * @see org.glom.web.server.ListDBAccess#getExpectedResultSize()
69          */
70         public int getExpectedResultSize() {
71
72                 if (fieldsToGet == null || fieldsToGet.size() <= 0)
73                         return -1;
74
75                 return getResultSizeOfSQLQuery();
76         }
77
78         /*
79          * (non-Javadoc)
80          * 
81          * @see org.glom.web.server.ListDBAccess#getSQLQuery(org.glom.libglom.LayoutFieldVector,
82          * org.glom.libglom.SortClause)
83          */
84         @Override
85         protected String getSelectQuery(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                 SqlExpr whereClause;
89                 if (StringUtils.isEmpty(quickFind)) {
90                         whereClause = new SqlExpr();
91                 } else {
92                         final Value quickFindValue = new Value(quickFind);
93                         whereClause = Glom.get_find_where_clause_quick(document, tableName, quickFindValue);
94                 }
95
96                 return SqlUtils.build_sql_select_with_where_clause(tableName, fieldsToGet, whereClause, sortClause);
97         }
98
99         /*
100          * (non-Javadoc)
101          * 
102          * @see org.glom.web.server.ListDBAccess#getCountQuery(org.glom.libglom.LayoutFieldVector)
103          */
104         @Override
105         protected String getCountQuery() {
106                 return SqlUtils.build_sql_count_select_with_where_clause(tableName, fieldsToGet);
107         }
108
109         /**
110          * Gets the primary key index of this list layout.
111          * 
112          * @return index of primary key or -1 if a primary key was not found
113          */
114         private int getPrimaryKeyIndex() {
115                 for (int i = 0; i < fieldsToGet.size(); i++) {
116                         final LayoutItem_Field layoutItemField = fieldsToGet.get(i);
117                         final Field field = layoutItemField.get_full_field_details();
118                         if (tableName.equals(layoutItemField.get_table_used(tableName)) && field != null && field.get_primary_key())
119                                 return i;
120                 }
121                 return -1;
122         }
123 }