View Javadoc
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   * dao for data row field assign
17   * @author mchyzer
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    * delete all data if table is here
128    */
129   public static void reset() {
130     new GcDbAccess().connectionName("grouper").sql("delete from " + GcPersistableHelper.tableName(GrouperDataRowFieldAssign.class)).executeSql();
131   }
132 
133   /**
134    * @param grouperDataRowFieldAssign
135    * @param connectionName
136    * @return true if changed
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 }