2222import com .cloud .utils .db .GenericDaoBase ;
2323import com .cloud .utils .db .SearchBuilder ;
2424import com .cloud .utils .db .SearchCriteria ;
25+ import org .apache .commons .collections .CollectionUtils ;
2526import org .springframework .stereotype .Component ;
2627
2728import javax .inject .Inject ;
29+ import java .util .ArrayList ;
2830import java .util .List ;
31+ import java .util .Map ;
2932import java .util .Set ;
33+ import java .util .stream .Collectors ;
3034
3135@ Component
3236public class IacTemplateDaoImpl extends GenericDaoBase <IacTemplateVO , Long > implements IacTemplateDao {
@@ -47,26 +51,8 @@ public class IacTemplateDaoImpl extends GenericDaoBase<IacTemplateVO, Long> impl
4751 private final SearchBuilder <IacTemplateVO > iacTemplatesSearch ;
4852
4953 public IacTemplateDaoImpl () {
50- /**
51- * WHERE id = <id> AND name = <name> AND name LIKE %<keyword>%
52- * AND (id IN (<shareddomainid1>, <shareddomainid2>) OR (domain_id IN (<domain1>, <domain2>, <domain3>) AND account_id = <account-id>)))
53-
54- ./engine/schema/src/main/java/org/apache/cloudstack/gui/theme/dao/GuiThemeDetailsDaoImpl.java: detailsDaoSearchBuilder.and().op("firstReplace", detailsDaoSearchBuilder.entity().getValue(), SearchCriteria.Op.LIKE_REPLACE);
55- ./engine/schema/src/main/java/com/cloud/gpu/dao/GpuDeviceDaoImpl.java: sb.op("cardNameKeyword", cardSb.entity().getName(), SearchCriteria.Op.LIKE);
56- grep: ./engine/service/target/engine/WEB-INF/lib/jaxb-impl-2.3.9.jar: binary file matches
57- ./engine/schema/src/main/java/com/cloud/gpu/dao/GpuDeviceDaoImpl.java: sb.op("profileNameKeyword", profileSb.entity().getName(), SearchCriteria.Op.LIKE);
58- ./engine/schema/src/main/java/com/cloud/gpu/dao/GpuDeviceDaoImpl.java: sb.op("profileDescriptionKeyword", profileSb.entity().getDescription(), SearchCriteria.Op.LIKE);
59- ./engine/schema/src/main/java/com/cloud/gpu/dao/GpuCardDaoImpl.java: sb.op("nameKeyword", sb.entity().getName(), SearchCriteria.Op.LIKE);
60-
61- */
6254 iacTemplatesSearch = createSearchBuilder ();
63- iacTemplatesSearch .and (ID , iacTemplatesSearch .entity ().getId (), SearchCriteria .Op .EQ );
64- iacTemplatesSearch .and (NAME , iacTemplatesSearch .entity ().getName (), SearchCriteria .Op .EQ );
65- iacTemplatesSearch .and (NAME_LIKE_KEYWORD , iacTemplatesSearch .entity ().getName (), SearchCriteria .Op .LIKE );
66- iacTemplatesSearch .and ().op (SHARED_IAC_TEMPLATE_IDS , iacTemplatesSearch .entity ().getId (), SearchCriteria .Op .IN );
67- iacTemplatesSearch .or ().op (DOMAIN_IDS , iacTemplatesSearch .entity ().getDomainId (), SearchCriteria .Op .IN );
6855 iacTemplatesSearch .and (ACCOUNT_ID , iacTemplatesSearch .entity ().getAccountId (), SearchCriteria .Op .EQ );
69- iacTemplatesSearch .cp ().cp ();
7056 iacTemplatesSearch .done ();
7157 }
7258
@@ -111,17 +97,66 @@ public List<IacTemplateVO> listByAccountId(long accountId) {
11197 @ Override
11298 public Pair <List <IacTemplateVO >, Integer > listIacTemplates (Long id , String name , List <Long > domainIds , Long accountId ,
11399 Set <Long > sharedIacTemplateIds , String keyword , Long pageSizeVal , Long startIndex ) {
114- SearchCriteria <IacTemplateVO > searchCriteria = iacTemplatesSearch .create ();
100+ boolean listSharedIacTemplates = CollectionUtils .isNotEmpty (sharedIacTemplateIds );
101+ SearchCriteria <IacTemplateVO > searchCriteria = createListIacTemplatesSearchCriteria (id , name , domainIds , accountId , sharedIacTemplateIds , keyword , listSharedIacTemplates );
102+ Filter filter = new Filter (IacTemplateVO .class , CREATED , false , startIndex , pageSizeVal );
103+ Pair <List <IacTemplateVO >, Integer > iacTemplates = searchAndCount (searchCriteria , filter );
104+ populateSharedEntitiesMappings (iacTemplates .first ());
105+ return iacTemplates ;
106+ }
107+
108+ private void populateSharedEntitiesMappings (List <IacTemplateVO > iacTemplates ) {
109+ if (CollectionUtils .isEmpty (iacTemplates )) {
110+ return ;
111+ }
112+
113+ List <Long > iacTemplateIds = iacTemplates .stream ().map (IacTemplateVO ::getId ).collect (Collectors .toList ());
114+ Map <Long , List <IacTemplateAccountMapVO >> accountMappings = iacTemplateAccountMapDao .listByIacTemplateIds (iacTemplateIds )
115+ .stream ().collect (Collectors .groupingBy (IacTemplateAccountMapVO ::getIacTemplateId ));
116+ Map <Long , List <IacTemplateDomainMapVO >> domainMappings = iacTemplateDomainMapDao .listByIacTemplateIds (iacTemplateIds )
117+ .stream ().collect (Collectors .groupingBy (IacTemplateDomainMapVO ::getIacTemplateId ));
118+
119+ for (IacTemplateVO iacTemplate : iacTemplates ) {
120+ iacTemplate .setAccountMappings (accountMappings .getOrDefault (iacTemplate .getId (), new ArrayList <>()));
121+ iacTemplate .setDomainMappings (domainMappings .getOrDefault (iacTemplate .getId (), new ArrayList <>()));
122+ }
123+ }
124+
125+ private SearchCriteria <IacTemplateVO > createListIacTemplatesSearchCriteria (Long id , String name , List <Long > domainIds , Long accountId ,
126+ Set <Long > sharedIacTemplateIds , String keyword , boolean listSharedIacTemplates ) {
127+ SearchCriteria <IacTemplateVO > searchCriteria = createListIacTemplatesSearchBuilder (listSharedIacTemplates ).create ();
128+
115129 searchCriteria .setParametersIfNotNull (ID , id );
116130 searchCriteria .setParametersIfNotNull (NAME , name );
117131 if (keyword != null ) {
118132 searchCriteria .setParameters (NAME_LIKE_KEYWORD , "%" + keyword + "%" );
119133 }
120- searchCriteria .setParameters (SHARED_IAC_TEMPLATE_IDS , sharedIacTemplateIds .toArray ());
134+ if (listSharedIacTemplates ) {
135+ searchCriteria .setParameters (SHARED_IAC_TEMPLATE_IDS , sharedIacTemplateIds .toArray ());
136+ }
121137 searchCriteria .setParameters (DOMAIN_IDS , domainIds .toArray ());
122138 searchCriteria .setParametersIfNotNull (ACCOUNT_ID , accountId );
123139
124- Filter filter = new Filter (IacTemplateVO .class , CREATED , false , startIndex , pageSizeVal );
125- return searchAndCount (searchCriteria , filter );
140+ return searchCriteria ;
141+ }
142+
143+ private SearchBuilder <IacTemplateVO > createListIacTemplatesSearchBuilder (boolean listSharedIacTemplates ) {
144+ SearchBuilder <IacTemplateVO > searchBuilder = createSearchBuilder ();
145+
146+ searchBuilder .and (ID , searchBuilder .entity ().getId (), SearchCriteria .Op .EQ );
147+ searchBuilder .and (NAME , searchBuilder .entity ().getName (), SearchCriteria .Op .EQ );
148+ searchBuilder .and (NAME_LIKE_KEYWORD , searchBuilder .entity ().getName (), SearchCriteria .Op .LIKE );
149+ if (listSharedIacTemplates ) {
150+ searchBuilder .and ().op (SHARED_IAC_TEMPLATE_IDS , searchBuilder .entity ().getId (), SearchCriteria .Op .IN );
151+ searchBuilder .or ().op (DOMAIN_IDS , searchBuilder .entity ().getDomainId (), SearchCriteria .Op .IN );
152+ searchBuilder .and (ACCOUNT_ID , searchBuilder .entity ().getAccountId (), SearchCriteria .Op .EQ );
153+ searchBuilder .cp ().cp ();
154+ } else {
155+ searchBuilder .and (DOMAIN_IDS , searchBuilder .entity ().getDomainId (), SearchCriteria .Op .IN );
156+ searchBuilder .and (ACCOUNT_ID , searchBuilder .entity ().getAccountId (), SearchCriteria .Op .EQ );
157+ }
158+ searchBuilder .done ();
159+
160+ return searchBuilder ;
126161 }
127162}
0 commit comments