1 package edu.internet2.middleware.grouper.dataField;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.List;
6 import java.util.Set;
7
8 import edu.internet2.middleware.grouper.tableIndex.TableIndex;
9 import edu.internet2.middleware.grouper.tableIndex.TableIndexType;
10 import edu.internet2.middleware.grouper.util.GrouperUtil;
11 import edu.internet2.middleware.grouperClient.jdbc.GcDbAccess;
12 import edu.internet2.middleware.grouperClient.jdbc.GcPersistableHelper;
13 import edu.internet2.middleware.grouperClient.util.GrouperClientUtils;
14
15
16
17
18
19
20 public class GrouperDataRowFieldAssignDao {
21
22
23 public GrouperDataRowFieldAssignDao() {
24 }
25
26 public static List<GrouperDataRowFieldAssign> selectByProvider(Long dataProviderInternalId) {
27
28 if (dataProviderInternalId == null) {
29 throw new NullPointerException();
30 }
31
32 List<GrouperDataRowFieldAssign> grouperDataRowFieldAssigns = new GcDbAccess()
33 .sql("select * from grouper_data_row_field_assign gdrfa where exists "
34 + "(select 1 from grouper_data_row_assign gdra where gdrfa.data_row_assign_internal_id = gdra.internal_id and gdra.data_provider_internal_id = ? )")
35 .addBindVar(dataProviderInternalId).selectList(GrouperDataRowFieldAssign.class);
36 return grouperDataRowFieldAssigns;
37 }
38
39 public static List<GrouperDataRowFieldAssign> selectByProviderAndMembers(Long dataProviderInternalId, Set<Long> memberInternalIds) {
40
41 if (dataProviderInternalId == null) {
42 throw new NullPointerException();
43 }
44
45 List<GrouperDataRowFieldAssign> grouperDataRowFieldAssigns = new ArrayList<GrouperDataRowFieldAssign>();
46
47 if (memberInternalIds.size() == 0) {
48 return grouperDataRowFieldAssigns;
49 }
50
51 int batchSize = 200;
52 List<Long> memberInternalIdsList = new ArrayList<Long>(memberInternalIds);
53
54 int numberOfBatches = GrouperUtil.batchNumberOfBatches(memberInternalIdsList.size(), batchSize, true);
55 for (int i=0;i<numberOfBatches;i++) {
56 GcDbAccess gcDbAccess = new GcDbAccess();
57 List<Long> batchMemberInternalIds = GrouperUtil.batchList(memberInternalIdsList, batchSize, i);
58
59 StringBuilder sql = new StringBuilder("select * from grouper_data_row_field_assign gdrfa where exists "
60 + "(select 1 from grouper_data_row_assign gdra where gdrfa.data_row_assign_internal_id = gdra.internal_id and gdra.data_provider_internal_id = ? and gdra.member_internal_id in (");
61 gcDbAccess.addBindVar(dataProviderInternalId);
62 GrouperClientUtils.appendQuestions(sql, GrouperUtil.length(batchMemberInternalIds));
63 for (Long memberId : batchMemberInternalIds) {
64 gcDbAccess.addBindVar(memberId);
65 }
66
67 sql.append("))");
68
69 List<GrouperDataRowFieldAssign> currGrouperDataRowFieldAssigns = gcDbAccess.sql(sql.toString()).selectList(GrouperDataRowFieldAssign.class);
70 grouperDataRowFieldAssigns.addAll(currGrouperDataRowFieldAssigns);
71 }
72
73 return grouperDataRowFieldAssigns;
74 }
75
76 public static List<GrouperDataRowFieldAssign> selectByDataFieldInternalId(long dataFieldInternalId) {
77 return new GcDbAccess().sql("select * from grouper_data_row_field_assign where data_field_internal_id = ?")
78 .addBindVar(dataFieldInternalId)
79 .selectList(GrouperDataRowFieldAssign.class);
80
81 }
82
83 public static List<GrouperDataRowFieldAssign> selectByDataFieldInternalIds(Set<Long> dataFieldInternalIds) {
84
85 if (dataFieldInternalIds == null || dataFieldInternalIds.size() == 0) {
86 return new ArrayList<>();
87 }
88
89 return new GcDbAccess().sql("select * from grouper_data_row_field_assign ")
90 .selectMultipleColumnName("data_field_internal_id")
91 .bindVars(new ArrayList<Long>(dataFieldInternalIds))
92 .selectList(GrouperDataRowFieldAssign.class);
93 }
94
95 public static List<GrouperDataRowFieldAssign> selectByDataRowAssignInternalIds(Set<Long> dataRowAssignInternalIds) {
96
97 if (dataRowAssignInternalIds == null || dataRowAssignInternalIds.size() == 0) {
98 return new ArrayList<>();
99 }
100
101 return new GcDbAccess().sql("select * from grouper_data_row_field_assign ")
102 .selectMultipleColumnName("data_row_assign_internal_id")
103 .bindVars(new ArrayList<Long>(dataRowAssignInternalIds))
104 .selectList(GrouperDataRowFieldAssign.class);
105 }
106
107 public static List<GrouperDataRowFieldAssign> selectByDataRowInternalId(long dataRowInternalId) {
108 return new GcDbAccess().sql("select gdrfa.* from grouper_data_row_field_assign gdrfa join grouper_data_row_assign gdra on gdrfa.data_row_assign_internal_id = gdra.internal_id where gdra.data_row_internal_id = ?")
109 .addBindVar(dataRowInternalId)
110 .selectList(GrouperDataRowFieldAssign.class);
111
112 }
113
114 public static List<GrouperDataRowFieldAssign> selectByDataRowInternalIds(Set<Long> dataRowInternalIds) {
115 if (dataRowInternalIds == null || dataRowInternalIds.size() == 0) {
116 return new ArrayList<>();
117 }
118
119 return new GcDbAccess().sql("select gdrfa.* from grouper_data_row_field_assign gdrfa join grouper_data_row_assign gdra on gdrfa.data_row_assign_internal_id = gdra.internal_id ")
120 .selectMultipleColumnName("gdra.data_row_internal_id")
121 .bindVars(new ArrayList<Long>(dataRowInternalIds))
122 .selectList(GrouperDataRowFieldAssign.class);
123
124 }
125
126
127
128
129 public static void reset() {
130 new GcDbAccess().connectionName("grouper").sql("delete from " + GcPersistableHelper.tableName(GrouperDataRowFieldAssign.class)).executeSql();
131 }
132
133
134
135
136
137
138 public static boolean store(GrouperDataRowFieldAssign grouperDataRowFieldAssign) {
139
140 GrouperUtil.assertion(grouperDataRowFieldAssign != null, "grouperDataRowFieldAssign is null");
141
142 grouperDataRowFieldAssign.storePrepare();
143
144 boolean changed = new GcDbAccess().storeToDatabase(grouperDataRowFieldAssign);
145 return changed;
146
147 }
148
149 public static void generateInternalIdsIfNeeded(Collection<GrouperDataRowFieldAssign> grouperDataRowFieldAssigns) {
150 if (GrouperUtil.length(grouperDataRowFieldAssigns) == 0) {
151 return;
152 }
153
154 int internalIdsNeeded = 0;
155 for (GrouperDataRowFieldAssign grouperDataRowFieldAssign : grouperDataRowFieldAssigns) {
156 if (grouperDataRowFieldAssign.getTempInternalIdOnDeck() == null && grouperDataRowFieldAssign.getInternalId() == -1) {
157 internalIdsNeeded++;
158 }
159 }
160
161 List<Long> ids = TableIndex.reserveIds(TableIndexType.dataRowFieldAssign, internalIdsNeeded);
162 int currentIndex = 0;
163 for (GrouperDataRowFieldAssign grouperDataRowFieldAssign : grouperDataRowFieldAssigns) {
164 if (grouperDataRowFieldAssign.getTempInternalIdOnDeck() == null && grouperDataRowFieldAssign.getInternalId() == -1) {
165 grouperDataRowFieldAssign.setTempInternalIdOnDeck(ids.get(currentIndex++));
166 }
167 }
168 }
169
170 public static void store(Collection<GrouperDataRowFieldAssign> grouperDataRowFieldAssigns) {
171 if (GrouperUtil.length(grouperDataRowFieldAssigns) == 0) {
172 return;
173 }
174
175 for (GrouperDataRowFieldAssign grouperDataRowFieldAssign: grouperDataRowFieldAssigns) {
176 grouperDataRowFieldAssign.storePrepare();
177 }
178
179 new GcDbAccess().storeBatchToDatabase(grouperDataRowFieldAssigns, 1000);
180 }
181
182 public static List<GrouperDataRowFieldAssign> selectByMarker(Long dataRowAssignInternalId, Long dataFieldInternalId) {
183
184 if (dataRowAssignInternalId == null) {
185 throw new NullPointerException();
186 }
187 if (dataFieldInternalId == null) {
188 throw new NullPointerException();
189 }
190
191 List<GrouperDataRowFieldAssign> grouperDataRowFieldAssigns = new GcDbAccess()
192 .sql("select * from grouper_data_row_field_assign where data_row_assign_internal_id = ? and data_field_internal_id = ? "
193 + " and value_integer is null and value_dictionary_internal_id is null ")
194 .addBindVar(dataRowAssignInternalId).addBindVar(dataFieldInternalId).selectList(GrouperDataRowFieldAssign.class);
195 return grouperDataRowFieldAssigns;
196 }
197
198 public static void delete(GrouperDataRowFieldAssign grouperDataRowFieldAssign) {
199 grouperDataRowFieldAssign.storePrepare();
200 new GcDbAccess().deleteFromDatabase(grouperDataRowFieldAssign);
201 }
202
203 public static void delete(Collection<GrouperDataRowFieldAssign> grouperDataRowFieldAssigns) {
204 for (GrouperDataRowFieldAssign grouperDataRowFieldAssign: grouperDataRowFieldAssigns) {
205 grouperDataRowFieldAssign.storePrepare();
206 }
207
208 new GcDbAccess().deleteFromDatabaseMultiple(grouperDataRowFieldAssigns);
209 }
210 }