mirror of https://github.com/apache/cloudstack.git
bug 6277: listVirtualMachines with group=-1 would return all vms that don't belong to any group. As a part of the fix, changed Dao layer to be able to make different types of Joins - Inner, Right, Left, etc.
status 6277: resolved fixed
This commit is contained in:
parent
703c182f8f
commit
0f2f356874
|
|
@ -38,6 +38,7 @@ import com.cloud.utils.Pair;
|
|||
import com.cloud.utils.component.ComponentLocator;
|
||||
import com.cloud.utils.db.DB;
|
||||
import com.cloud.utils.db.GenericDaoBase;
|
||||
import com.cloud.utils.db.JoinBuilder;
|
||||
import com.cloud.utils.db.SearchBuilder;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
import com.cloud.utils.db.Transaction;
|
||||
|
|
@ -171,7 +172,7 @@ public class VlanDaoImpl extends GenericDaoBase<VlanVO, Long> implements VlanDao
|
|||
|
||||
SearchBuilder<PodVlanMapVO> PodVlanSearch = _podVlanMapDao.createSearchBuilder();
|
||||
PodVlanSearch.and("podId", PodVlanSearch.entity().getPodId(), SearchCriteria.Op.NNULL);
|
||||
ZoneTypeAllPodsSearch.join("vlan", PodVlanSearch, PodVlanSearch.entity().getVlanDbId(), ZoneTypeAllPodsSearch.entity().getId());
|
||||
ZoneTypeAllPodsSearch.join("vlan", PodVlanSearch, PodVlanSearch.entity().getVlanDbId(), ZoneTypeAllPodsSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
|
||||
ZoneTypeAllPodsSearch.done();
|
||||
PodVlanSearch.done();
|
||||
|
|
@ -182,7 +183,7 @@ public class VlanDaoImpl extends GenericDaoBase<VlanVO, Long> implements VlanDao
|
|||
|
||||
SearchBuilder<PodVlanMapVO> PodVlanSearch2 = _podVlanMapDao.createSearchBuilder();
|
||||
PodVlanSearch2.and("podId", PodVlanSearch2.entity().getPodId(), SearchCriteria.Op.EQ);
|
||||
ZoneTypePodSearch.join("vlan", PodVlanSearch2, PodVlanSearch2.entity().getVlanDbId(), ZoneTypePodSearch.entity().getId());
|
||||
ZoneTypePodSearch.join("vlan", PodVlanSearch2, PodVlanSearch2.entity().getVlanDbId(), ZoneTypePodSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
PodVlanSearch2.done();
|
||||
ZoneTypePodSearch.done();
|
||||
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ import com.cloud.network.security.IngressRuleVO;
|
|||
import com.cloud.network.security.NetworkGroupVO;
|
||||
import com.cloud.utils.component.Inject;
|
||||
import com.cloud.utils.db.GenericDaoBase;
|
||||
import com.cloud.utils.db.JoinBuilder;
|
||||
import com.cloud.utils.db.SearchBuilder;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
|
||||
|
|
@ -121,7 +122,7 @@ public class IngressRuleDaoImpl extends GenericDaoBase<IngressRuleVO, Long> impl
|
|||
protoPortsAndNetworkGroupNameSearch.and("endPort", protoPortsAndNetworkGroupNameSearch.entity().getEndPort(), SearchCriteria.Op.EQ);
|
||||
SearchBuilder<NetworkGroupVO> ngSb = _networkGroupDao.createSearchBuilder();
|
||||
ngSb.and("groupName", ngSb.entity().getName(), SearchCriteria.Op.EQ);
|
||||
protoPortsAndNetworkGroupNameSearch.join("groupName", ngSb, protoPortsAndNetworkGroupNameSearch.entity().getAllowedNetworkId(), ngSb.entity().getId());
|
||||
protoPortsAndNetworkGroupNameSearch.join("groupName", ngSb, protoPortsAndNetworkGroupNameSearch.entity().getAllowedNetworkId(), ngSb.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
protoPortsAndNetworkGroupNameSearch.done();
|
||||
return super.configure(name, params);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ import com.cloud.server.ManagementServer;
|
|||
import com.cloud.utils.component.ComponentLocator;
|
||||
import com.cloud.utils.db.Filter;
|
||||
import com.cloud.utils.db.GenericDaoBase;
|
||||
import com.cloud.utils.db.JoinBuilder;
|
||||
import com.cloud.utils.db.SearchBuilder;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
|
||||
|
|
@ -70,7 +71,7 @@ public class NetworkGroupRulesDaoImpl extends GenericDaoBase<NetworkGroupRulesVO
|
|||
DomainSearch.and("domainId", DomainSearch.entity().getDomainId(), SearchCriteria.Op.EQ);
|
||||
SearchBuilder<DomainVO> domainSearch = _domainDao.createSearchBuilder();
|
||||
domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE);
|
||||
DomainSearch.join("domainSearch", domainSearch, DomainSearch.entity().getDomainId(), domainSearch.entity().getId());
|
||||
DomainSearch.join("domainSearch", domainSearch, DomainSearch.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
DomainSearch.done();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ import com.cloud.service.dao.ServiceOfferingDao;
|
|||
import com.cloud.utils.component.ComponentLocator;
|
||||
import com.cloud.utils.db.Attribute;
|
||||
import com.cloud.utils.db.GenericDaoBase;
|
||||
import com.cloud.utils.db.JoinBuilder;
|
||||
import com.cloud.utils.db.SearchBuilder;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
import com.cloud.utils.db.UpdateBuilder;
|
||||
|
|
@ -273,7 +274,7 @@ public class UserVmDaoImpl extends GenericDaoBase<UserVmVO, Long> implements Use
|
|||
AccountDataCenterVirtualSearch = createSearchBuilder();
|
||||
AccountDataCenterVirtualSearch.and("account", AccountDataCenterVirtualSearch.entity().getAccountId(), SearchCriteria.Op.EQ);
|
||||
AccountDataCenterVirtualSearch.and("dc", AccountDataCenterVirtualSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
|
||||
AccountDataCenterVirtualSearch.join("offeringSearch", offeringSearch, AccountDataCenterVirtualSearch.entity().getServiceOfferingId(), offeringSearch.entity().getId());
|
||||
AccountDataCenterVirtualSearch.join("offeringSearch", offeringSearch, AccountDataCenterVirtualSearch.entity().getServiceOfferingId(), offeringSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
AccountDataCenterVirtualSearch.done();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -145,6 +145,7 @@ import com.cloud.utils.component.ComponentLocator;
|
|||
import com.cloud.utils.component.Inject;
|
||||
import com.cloud.utils.concurrency.NamedThreadFactory;
|
||||
import com.cloud.utils.db.DB;
|
||||
import com.cloud.utils.db.JoinBuilder;
|
||||
import com.cloud.utils.db.SearchBuilder;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
import com.cloud.utils.db.Transaction;
|
||||
|
|
@ -2349,7 +2350,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager
|
|||
|
||||
SearchBuilder<VlanVO> virtualNetworkVlanSB = _vlanDao.createSearchBuilder();
|
||||
virtualNetworkVlanSB.and("vlanType", virtualNetworkVlanSB.entity().getVlanType(), SearchCriteria.Op.EQ);
|
||||
ipAddressSB.join("virtualNetworkVlanSB", virtualNetworkVlanSB, ipAddressSB.entity().getVlanDbId(), virtualNetworkVlanSB.entity().getId());
|
||||
ipAddressSB.join("virtualNetworkVlanSB", virtualNetworkVlanSB, ipAddressSB.entity().getVlanDbId(), virtualNetworkVlanSB.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
|
||||
SearchCriteria<IPAddressVO> ipAddressSC = ipAddressSB.create();
|
||||
ipAddressSC.setParameters("accountId", accountId);
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ import com.cloud.network.NetworkAccountVO;
|
|||
import com.cloud.network.NetworkConfigurationVO;
|
||||
import com.cloud.utils.db.DB;
|
||||
import com.cloud.utils.db.GenericDaoBase;
|
||||
import com.cloud.utils.db.JoinBuilder;
|
||||
import com.cloud.utils.db.SearchBuilder;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
import com.cloud.utils.db.Transaction;
|
||||
|
|
@ -56,7 +57,7 @@ public class NetworkConfigurationDaoImpl extends GenericDaoBase<NetworkConfigura
|
|||
AccountSearch.and("offering", AccountSearch.entity().getNetworkOfferingId(), SearchCriteria.Op.EQ);
|
||||
SearchBuilder<NetworkAccountVO> join = _accountsDao.createSearchBuilder();
|
||||
join.and("account", join.entity().getAccountId(), SearchCriteria.Op.EQ);
|
||||
AccountSearch.join("accounts", join, AccountSearch.entity().getId(), join.entity().getNetworkConfigurationId());
|
||||
AccountSearch.join("accounts", join, AccountSearch.entity().getId(), join.entity().getNetworkConfigurationId(), JoinBuilder.JoinType.INNER);
|
||||
AccountSearch.and("datacenter", AccountSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
|
||||
AccountSearch.done();
|
||||
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@ import com.cloud.utils.component.Inject;
|
|||
import com.cloud.utils.concurrency.NamedThreadFactory;
|
||||
import com.cloud.utils.db.DB;
|
||||
import com.cloud.utils.db.Filter;
|
||||
import com.cloud.utils.db.JoinBuilder;
|
||||
import com.cloud.utils.db.SearchBuilder;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
import com.cloud.utils.db.Transaction;
|
||||
|
|
@ -797,7 +798,7 @@ public class NetworkGroupManagerImpl implements NetworkGroupManager {
|
|||
if ((accountId == null) && (instanceId == null) && (domainId != null) && Boolean.TRUE.equals(recursive)) {
|
||||
SearchBuilder<DomainVO> domainSearch = _domainDao.createSearchBuilder();
|
||||
domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE);
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId());
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
SearchCriteria<NetworkGroupRulesVO> sc = sb.create();
|
||||
|
|
|
|||
|
|
@ -51,8 +51,6 @@ import javax.crypto.spec.SecretKeySpec;
|
|||
import org.apache.commons.codec.binary.Base64;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import sun.nio.cs.ext.TIS_620;
|
||||
|
||||
import com.cloud.agent.AgentManager;
|
||||
import com.cloud.agent.api.GetVncPortAnswer;
|
||||
import com.cloud.agent.api.GetVncPortCommand;
|
||||
|
|
@ -110,15 +108,15 @@ import com.cloud.async.executor.SecurityGroupParam;
|
|||
import com.cloud.async.executor.UpdateLoadBalancerParam;
|
||||
import com.cloud.async.executor.UpgradeVMParam;
|
||||
import com.cloud.async.executor.VMOperationParam;
|
||||
import com.cloud.async.executor.VolumeOperationParam;
|
||||
import com.cloud.async.executor.VMOperationParam.VmOp;
|
||||
import com.cloud.async.executor.VolumeOperationParam;
|
||||
import com.cloud.async.executor.VolumeOperationParam.VolumeOp;
|
||||
import com.cloud.capacity.CapacityVO;
|
||||
import com.cloud.capacity.dao.CapacityDao;
|
||||
import com.cloud.configuration.ConfigurationManager;
|
||||
import com.cloud.configuration.ConfigurationVO;
|
||||
import com.cloud.configuration.ResourceLimitVO;
|
||||
import com.cloud.configuration.ResourceCount.ResourceType;
|
||||
import com.cloud.configuration.ResourceLimitVO;
|
||||
import com.cloud.configuration.dao.ConfigurationDao;
|
||||
import com.cloud.configuration.dao.ResourceLimitDao;
|
||||
import com.cloud.consoleproxy.ConsoleProxyManager;
|
||||
|
|
@ -128,8 +126,8 @@ import com.cloud.dc.DataCenterIpAddressVO;
|
|||
import com.cloud.dc.DataCenterVO;
|
||||
import com.cloud.dc.HostPodVO;
|
||||
import com.cloud.dc.PodVlanMapVO;
|
||||
import com.cloud.dc.VlanVO;
|
||||
import com.cloud.dc.Vlan.VlanType;
|
||||
import com.cloud.dc.VlanVO;
|
||||
import com.cloud.dc.dao.AccountVlanMapDao;
|
||||
import com.cloud.dc.dao.ClusterDao;
|
||||
import com.cloud.dc.dao.DataCenterDao;
|
||||
|
|
@ -189,7 +187,6 @@ import com.cloud.serializer.GsonHelper;
|
|||
import com.cloud.server.auth.UserAuthenticator;
|
||||
import com.cloud.service.ServiceOfferingVO;
|
||||
import com.cloud.service.dao.ServiceOfferingDao;
|
||||
import com.cloud.storage.UploadVO;
|
||||
import com.cloud.storage.DiskOfferingVO;
|
||||
import com.cloud.storage.DiskTemplateVO;
|
||||
import com.cloud.storage.GuestOS;
|
||||
|
|
@ -197,25 +194,26 @@ import com.cloud.storage.GuestOSCategoryVO;
|
|||
import com.cloud.storage.GuestOSVO;
|
||||
import com.cloud.storage.LaunchPermissionVO;
|
||||
import com.cloud.storage.Snapshot;
|
||||
import com.cloud.storage.Snapshot.SnapshotType;
|
||||
import com.cloud.storage.SnapshotPolicyVO;
|
||||
import com.cloud.storage.SnapshotScheduleVO;
|
||||
import com.cloud.storage.SnapshotVO;
|
||||
import com.cloud.storage.Storage;
|
||||
import com.cloud.storage.Storage.FileSystem;
|
||||
import com.cloud.storage.Storage.ImageFormat;
|
||||
import com.cloud.storage.StorageManager;
|
||||
import com.cloud.storage.StoragePoolHostVO;
|
||||
import com.cloud.storage.StoragePoolVO;
|
||||
import com.cloud.storage.StorageStats;
|
||||
import com.cloud.storage.Upload.Type;
|
||||
import com.cloud.storage.UploadVO;
|
||||
import com.cloud.storage.VMTemplateHostVO;
|
||||
import com.cloud.storage.VMTemplateStorageResourceAssoc;
|
||||
import com.cloud.storage.VMTemplateVO;
|
||||
import com.cloud.storage.Volume;
|
||||
import com.cloud.storage.Volume.VolumeType;
|
||||
import com.cloud.storage.VolumeStats;
|
||||
import com.cloud.storage.VolumeVO;
|
||||
import com.cloud.storage.Snapshot.SnapshotType;
|
||||
import com.cloud.storage.Storage.FileSystem;
|
||||
import com.cloud.storage.Storage.ImageFormat;
|
||||
import com.cloud.storage.Upload.Type;
|
||||
import com.cloud.storage.Volume.VolumeType;
|
||||
import com.cloud.storage.dao.DiskOfferingDao;
|
||||
import com.cloud.storage.dao.DiskTemplateDao;
|
||||
import com.cloud.storage.dao.GuestOSCategoryDao;
|
||||
|
|
@ -227,9 +225,9 @@ import com.cloud.storage.dao.StoragePoolDao;
|
|||
import com.cloud.storage.dao.StoragePoolHostDao;
|
||||
import com.cloud.storage.dao.UploadDao;
|
||||
import com.cloud.storage.dao.VMTemplateDao;
|
||||
import com.cloud.storage.dao.VMTemplateDao.TemplateFilter;
|
||||
import com.cloud.storage.dao.VMTemplateHostDao;
|
||||
import com.cloud.storage.dao.VolumeDao;
|
||||
import com.cloud.storage.dao.VMTemplateDao.TemplateFilter;
|
||||
import com.cloud.storage.preallocatedlun.PreallocatedLunVO;
|
||||
import com.cloud.storage.preallocatedlun.dao.PreallocatedLunDao;
|
||||
import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
||||
|
|
@ -252,19 +250,19 @@ import com.cloud.user.dao.UserDao;
|
|||
import com.cloud.user.dao.UserStatisticsDao;
|
||||
import com.cloud.uservm.UserVm;
|
||||
import com.cloud.utils.DateUtil;
|
||||
import com.cloud.utils.DateUtil.IntervalType;
|
||||
import com.cloud.utils.EnumUtils;
|
||||
import com.cloud.utils.NumbersUtil;
|
||||
import com.cloud.utils.Pair;
|
||||
import com.cloud.utils.PasswordGenerator;
|
||||
import com.cloud.utils.StringUtils;
|
||||
import com.cloud.utils.DateUtil.IntervalType;
|
||||
import com.cloud.utils.component.Adapters;
|
||||
import com.cloud.utils.component.ComponentLocator;
|
||||
import com.cloud.utils.component.Inject;
|
||||
import com.cloud.utils.concurrency.NamedThreadFactory;
|
||||
import com.cloud.utils.db.DB;
|
||||
import com.cloud.utils.db.Filter;
|
||||
import com.cloud.utils.db.GlobalLock;
|
||||
import com.cloud.utils.db.JoinBuilder;
|
||||
import com.cloud.utils.db.SearchBuilder;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
import com.cloud.utils.db.Transaction;
|
||||
|
|
@ -276,21 +274,21 @@ import com.cloud.vm.ConsoleProxyVO;
|
|||
import com.cloud.vm.DomainRouter;
|
||||
import com.cloud.vm.DomainRouterVO;
|
||||
import com.cloud.vm.InstanceGroupVMMapVO;
|
||||
import com.cloud.vm.InstanceGroupVO;
|
||||
import com.cloud.vm.SecondaryStorageVmVO;
|
||||
import com.cloud.vm.State;
|
||||
import com.cloud.vm.UserVmManager;
|
||||
import com.cloud.vm.UserVmVO;
|
||||
import com.cloud.vm.VMInstanceVO;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
import com.cloud.vm.InstanceGroupVO;
|
||||
import com.cloud.vm.VmStats;
|
||||
import com.cloud.vm.dao.ConsoleProxyDao;
|
||||
import com.cloud.vm.dao.DomainRouterDao;
|
||||
import com.cloud.vm.dao.InstanceGroupDao;
|
||||
import com.cloud.vm.dao.InstanceGroupVMMapDao;
|
||||
import com.cloud.vm.dao.SecondaryStorageVmDao;
|
||||
import com.cloud.vm.dao.UserVmDao;
|
||||
import com.cloud.vm.dao.VMInstanceDao;
|
||||
import com.cloud.vm.dao.InstanceGroupDao;
|
||||
import com.google.gson.Gson;
|
||||
|
||||
public class ManagementServerImpl implements ManagementServer {
|
||||
|
|
@ -3955,7 +3953,7 @@ public class ManagementServerImpl implements ManagementServer {
|
|||
if ((account == null) && (domainId != null)) {
|
||||
SearchBuilder<DomainVO> domainSearch = _domainDao.createSearchBuilder();
|
||||
domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE);
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId());
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
SearchCriteria<UserAccountVO> sc = sb.create();
|
||||
|
|
@ -4197,13 +4195,13 @@ public class ManagementServerImpl implements ManagementServer {
|
|||
if (accountId != null) {
|
||||
SearchBuilder<AccountVlanMapVO> accountVlanMapSearch = _accountVlanMapDao.createSearchBuilder();
|
||||
accountVlanMapSearch.and("accountId", accountVlanMapSearch.entity().getAccountId(), SearchCriteria.Op.EQ);
|
||||
sb.join("accountVlanMapSearch", accountVlanMapSearch, sb.entity().getId(), accountVlanMapSearch.entity().getVlanDbId());
|
||||
sb.join("accountVlanMapSearch", accountVlanMapSearch, sb.entity().getId(), accountVlanMapSearch.entity().getVlanDbId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
if (podId != null) {
|
||||
SearchBuilder<PodVlanMapVO> podVlanMapSearch = _podVlanMapDao.createSearchBuilder();
|
||||
podVlanMapSearch.and("podId", podVlanMapSearch.entity().getPodId(), SearchCriteria.Op.EQ);
|
||||
sb.join("podVlanMapSearch", podVlanMapSearch, sb.entity().getId(), podVlanMapSearch.entity().getVlanDbId());
|
||||
sb.join("podVlanMapSearch", podVlanMapSearch, sb.entity().getId(), podVlanMapSearch.entity().getVlanDbId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
SearchCriteria<VlanVO> sc = sb.create();
|
||||
|
|
@ -4542,7 +4540,7 @@ public class ManagementServerImpl implements ManagementServer {
|
|||
// if accountId isn't specified, we can do a domain match for the admin case
|
||||
SearchBuilder<DomainVO> domainSearch = _domainDao.createSearchBuilder();
|
||||
domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE);
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId());
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
SearchCriteria<AccountVO> sc = sb.create();
|
||||
|
|
@ -5320,19 +5318,27 @@ public class ManagementServerImpl implements ManagementServer {
|
|||
// if accountId isn't specified, we can do a domain match for the admin case
|
||||
SearchBuilder<DomainVO> domainSearch = _domainDao.createSearchBuilder();
|
||||
domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE);
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId());
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
if (groupId != null) {
|
||||
if (groupId != null && (Long)groupId == -1) {
|
||||
SearchBuilder<InstanceGroupVMMapVO> vmSearch = _groupVMMapDao.createSearchBuilder();
|
||||
vmSearch.and("instanceId", vmSearch.entity().getInstanceId(), SearchCriteria.Op.EQ);
|
||||
sb.join("vmSearch", vmSearch, sb.entity().getId(), vmSearch.entity().getInstanceId(), JoinBuilder.JoinType.LEFTOUTER);
|
||||
}
|
||||
else if (groupId != null) {
|
||||
SearchBuilder<InstanceGroupVMMapVO> groupSearch = _groupVMMapDao.createSearchBuilder();
|
||||
groupSearch.and("groupId", groupSearch.entity().getGroupId(), SearchCriteria.Op.EQ);
|
||||
sb.join("groupSearch", groupSearch, sb.entity().getId(), groupSearch.entity().getInstanceId());
|
||||
sb.join("groupSearch", groupSearch, sb.entity().getId(), groupSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
// populate the search criteria with the values passed in
|
||||
SearchCriteria<UserVmVO> sc = sb.create();
|
||||
|
||||
if (groupId != null) {
|
||||
if (groupId != null && (Long)groupId == -1){
|
||||
sc.setJoinParameters("vmSearch", "instanceId", (Object)null);
|
||||
}
|
||||
else if (groupId != null ) {
|
||||
sc.setJoinParameters("groupSearch", "groupId", groupId);
|
||||
}
|
||||
|
||||
|
|
@ -5571,7 +5577,7 @@ public class ManagementServerImpl implements ManagementServer {
|
|||
// join with securityGroup table to make sure the account is the owner of the network rule
|
||||
SearchBuilder<SecurityGroupVO> securityGroupSearch = _securityGroupDao.createSearchBuilder();
|
||||
securityGroupSearch.and("accountId", securityGroupSearch.entity().getAccountId(), SearchCriteria.Op.EQ);
|
||||
sb.join("groupId", securityGroupSearch, securityGroupSearch.entity().getId(), sb.entity().getSecurityGroupId());
|
||||
sb.join("groupId", securityGroupSearch, securityGroupSearch.entity().getId(), sb.entity().getSecurityGroupId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
SearchCriteria<NetworkRuleConfigVO> sc = sb.create();
|
||||
|
|
@ -5626,7 +5632,7 @@ public class ManagementServerImpl implements ManagementServer {
|
|||
// if accountId isn't specified, we can do a domain match for the admin case
|
||||
SearchBuilder<DomainVO> domainSearch = _domainDao.createSearchBuilder();
|
||||
domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE);
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId());
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
SearchCriteria<EventVO> sc = sb.create();
|
||||
|
|
@ -5744,7 +5750,7 @@ public class ManagementServerImpl implements ManagementServer {
|
|||
// if accountId isn't specified, we can do a domain match for the admin case
|
||||
SearchBuilder<DomainVO> domainSearch = _domainDao.createSearchBuilder();
|
||||
domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE);
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId());
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
SearchCriteria<DomainRouterVO> sc = sb.create();
|
||||
|
|
@ -5905,7 +5911,7 @@ public class ManagementServerImpl implements ManagementServer {
|
|||
// if accountId isn't specified, we can do a domain match for the admin case
|
||||
SearchBuilder<DomainVO> domainSearch = _domainDao.createSearchBuilder();
|
||||
domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE);
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId());
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
// now set the SC criteria...
|
||||
|
|
@ -6024,13 +6030,13 @@ public class ManagementServerImpl implements ManagementServer {
|
|||
// if accountId isn't specified, we can do a domain match for the admin case
|
||||
SearchBuilder<DomainVO> domainSearch = _domainDao.createSearchBuilder();
|
||||
domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE);
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId());
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
if (forVirtualNetwork != null) {
|
||||
SearchBuilder<VlanVO> vlanSearch = _vlanDao.createSearchBuilder();
|
||||
vlanSearch.and("vlanType", vlanSearch.entity().getVlanType(), SearchCriteria.Op.EQ);
|
||||
sb.join("vlanSearch", vlanSearch, sb.entity().getVlanDbId(), vlanSearch.entity().getId());
|
||||
sb.join("vlanSearch", vlanSearch, sb.entity().getVlanDbId(), vlanSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
if ((isAllocated != null) && ((Boolean) isAllocated == true)) {
|
||||
|
|
@ -7336,7 +7342,7 @@ public class ManagementServerImpl implements ManagementServer {
|
|||
// if accountId isn't specified, we can do a domain match for the admin case
|
||||
SearchBuilder<DomainVO> domainSearch = _domainDao.createSearchBuilder();
|
||||
domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE);
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId());
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
SearchCriteria<SecurityGroupVO> sc = sb.create();
|
||||
|
|
@ -8056,13 +8062,13 @@ public class ManagementServerImpl implements ManagementServer {
|
|||
// if accountId isn't specified, we can do a domain match for the admin case
|
||||
SearchBuilder<DomainVO> domainSearch = _domainDao.createSearchBuilder();
|
||||
domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE);
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId());
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
if (instanceId != null) {
|
||||
SearchBuilder<LoadBalancerVMMapVO> lbVMSearch = _loadBalancerVMMapDao.createSearchBuilder();
|
||||
lbVMSearch.and("instanceId", lbVMSearch.entity().getInstanceId(), SearchCriteria.Op.EQ);
|
||||
sb.join("lbVMSearch", lbVMSearch, sb.entity().getId(), lbVMSearch.entity().getLoadBalancerId());
|
||||
sb.join("lbVMSearch", lbVMSearch, sb.entity().getId(), lbVMSearch.entity().getLoadBalancerId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
SearchCriteria<LoadBalancerVO> sc = sb.create();
|
||||
|
|
@ -9044,7 +9050,7 @@ public class ManagementServerImpl implements ManagementServer {
|
|||
// if accountId isn't specified, we can do a domain match for the admin case
|
||||
SearchBuilder<DomainVO> domainSearch = _domainDao.createSearchBuilder();
|
||||
domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE);
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId());
|
||||
sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
SearchCriteria<InstanceGroupVO> sc = sb.create();
|
||||
|
|
|
|||
|
|
@ -133,6 +133,7 @@ import com.cloud.utils.component.Inject;
|
|||
import com.cloud.utils.concurrency.NamedThreadFactory;
|
||||
import com.cloud.utils.db.DB;
|
||||
import com.cloud.utils.db.GlobalLock;
|
||||
import com.cloud.utils.db.JoinBuilder;
|
||||
import com.cloud.utils.db.SearchBuilder;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
import com.cloud.utils.db.Transaction;
|
||||
|
|
@ -361,7 +362,7 @@ public class StorageManagerImpl implements StorageManager {
|
|||
|
||||
SearchBuilder<VMInstanceVO> activeVmSB = _vmInstanceDao.createSearchBuilder();
|
||||
activeVmSB.and("state", activeVmSB.entity().getState(), SearchCriteria.Op.IN);
|
||||
volumeSB.join("activeVmSB", activeVmSB, volumeSB.entity().getInstanceId(), activeVmSB.entity().getId());
|
||||
volumeSB.join("activeVmSB", activeVmSB, volumeSB.entity().getInstanceId(), activeVmSB.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
|
||||
SearchCriteria<VolumeVO> volumeSC = volumeSB.create();
|
||||
volumeSC.setParameters("poolId", storagePool.getId());
|
||||
|
|
@ -1104,7 +1105,7 @@ public class StorageManagerImpl implements StorageManager {
|
|||
|
||||
PoolsUsedByVmSearch = _storagePoolDao.createSearchBuilder();
|
||||
SearchBuilder<VolumeVO> volSearch = _volsDao.createSearchBuilder();
|
||||
PoolsUsedByVmSearch.join("volumes", volSearch, volSearch.entity().getPoolId(), PoolsUsedByVmSearch.entity().getId());
|
||||
PoolsUsedByVmSearch.join("volumes", volSearch, volSearch.entity().getPoolId(), PoolsUsedByVmSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
volSearch.and("vm", volSearch.entity().getInstanceId(), SearchCriteria.Op.EQ);
|
||||
volSearch.done();
|
||||
PoolsUsedByVmSearch.done();
|
||||
|
|
@ -1116,7 +1117,7 @@ public class StorageManagerImpl implements StorageManager {
|
|||
SearchBuilder<HostVO> HostSearch = _hostDao.createSearchBuilder();
|
||||
HostSearch.and("dcId", HostSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
|
||||
|
||||
HostTemplateStatesSearch.join("host", HostSearch, HostSearch.entity().getId(), HostTemplateStatesSearch.entity().getHostId());
|
||||
HostTemplateStatesSearch.join("host", HostSearch, HostSearch.entity().getId(), HostTemplateStatesSearch.entity().getHostId(), JoinBuilder.JoinType.INNER);
|
||||
HostSearch.done();
|
||||
HostTemplateStatesSearch.done();
|
||||
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ import com.cloud.utils.DateUtil;
|
|||
import com.cloud.utils.NumbersUtil;
|
||||
import com.cloud.utils.component.Inject;
|
||||
import com.cloud.utils.db.GenericSearchBuilder;
|
||||
import com.cloud.utils.db.JoinBuilder;
|
||||
import com.cloud.utils.db.SearchBuilder;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
import com.cloud.utils.db.SearchCriteria.Func;
|
||||
|
|
@ -288,7 +289,7 @@ public class LocalStoragePoolAllocator extends FirstFitStoragePoolAllocator {
|
|||
SearchBuilder<VolumeVO> sbVolume = _volumeDao.createSearchBuilder();
|
||||
sbVolume.and("poolId", sbVolume.entity().getPoolId(), SearchCriteria.Op.EQ);
|
||||
|
||||
VmsOnPoolSearch.join("volumeJoin", sbVolume, VmsOnPoolSearch.entity().getId(), sbVolume.entity().getInstanceId());
|
||||
VmsOnPoolSearch.join("volumeJoin", sbVolume, VmsOnPoolSearch.entity().getId(), sbVolume.entity().getInstanceId(), JoinBuilder.JoinType.INNER);
|
||||
|
||||
sbVolume.done();
|
||||
VmsOnPoolSearch.done();
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ import com.cloud.utils.component.ComponentLocator;
|
|||
import com.cloud.utils.db.DB;
|
||||
import com.cloud.utils.db.GenericDaoBase;
|
||||
import com.cloud.utils.db.GenericSearchBuilder;
|
||||
import com.cloud.utils.db.JoinBuilder;
|
||||
import com.cloud.utils.db.SearchBuilder;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
import com.cloud.utils.db.Transaction;
|
||||
|
|
@ -73,7 +74,7 @@ public class PreallocatedLunDaoImpl extends GenericDaoBase<PreallocatedLunVO, Lo
|
|||
DetailsSearch = _detailsDao.createSearchBuilder(String.class);
|
||||
SearchBuilder<PreallocatedLunVO> targetSearch = createSearchBuilder();
|
||||
targetSearch.and("targetiqn", targetSearch.entity().getTargetIqn(), SearchCriteria.Op.EQ);
|
||||
DetailsSearch.join("target", targetSearch, targetSearch.entity().getId(), DetailsSearch.entity().getLunId());
|
||||
DetailsSearch.join("target", targetSearch, targetSearch.entity().getId(), DetailsSearch.entity().getLunId(), JoinBuilder.JoinType.INNER);
|
||||
DetailsSearch.select(null, Func.DISTINCT, DetailsSearch.entity().getTag());
|
||||
DetailsSearch.done();
|
||||
targetSearch.done();
|
||||
|
|
|
|||
|
|
@ -94,6 +94,7 @@ import com.cloud.utils.component.Inject;
|
|||
import com.cloud.utils.db.DB;
|
||||
import com.cloud.utils.db.Filter;
|
||||
import com.cloud.utils.db.GenericDaoBase;
|
||||
import com.cloud.utils.db.JoinBuilder;
|
||||
import com.cloud.utils.db.SearchBuilder;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
import com.cloud.utils.db.Transaction;
|
||||
|
|
@ -1313,7 +1314,7 @@ public class SnapshotManagerImpl implements SnapshotManager {
|
|||
policySearch.and("policyId", policySearch.entity().getPolicyId(), SearchCriteria.Op.EQ);
|
||||
|
||||
PolicySnapshotSearch = _snapshotDao.createSearchBuilder();
|
||||
PolicySnapshotSearch.join("policy", policySearch, policySearch.entity().getSnapshotId(), PolicySnapshotSearch.entity().getId());
|
||||
PolicySnapshotSearch.join("policy", policySearch, policySearch.entity().getSnapshotId(), PolicySnapshotSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
policySearch.done();
|
||||
PolicySnapshotSearch.done();
|
||||
|
||||
|
|
@ -1322,7 +1323,7 @@ public class SnapshotManagerImpl implements SnapshotManager {
|
|||
SearchBuilder<SnapshotPolicyRefVO> policyRefSearch = _snapPolicyRefDao.createSearchBuilder();
|
||||
policyRefSearch.and("snapshotId", policyRefSearch.entity().getSnapshotId(), SearchCriteria.Op.EQ);
|
||||
|
||||
PoliciesForSnapSearch.join("policyRef", policyRefSearch, policyRefSearch.entity().getPolicyId(), PoliciesForSnapSearch.entity().getId());
|
||||
PoliciesForSnapSearch.join("policyRef", policyRefSearch, policyRefSearch.entity().getPolicyId(), PoliciesForSnapSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
policyRefSearch.done();
|
||||
PoliciesForSnapSearch.done();
|
||||
s_logger.info("Snapshot Manager is configured.");
|
||||
|
|
|
|||
|
|
@ -80,6 +80,7 @@ import com.cloud.utils.NumbersUtil;
|
|||
import com.cloud.utils.component.ComponentLocator;
|
||||
import com.cloud.utils.component.Inject;
|
||||
import com.cloud.utils.db.DB;
|
||||
import com.cloud.utils.db.JoinBuilder;
|
||||
import com.cloud.utils.db.SearchBuilder;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
import com.cloud.utils.db.Transaction;
|
||||
|
|
@ -587,7 +588,7 @@ public class TemplateManagerImpl implements TemplateManager {
|
|||
SearchBuilder<HostVO> HostSearch = _hostDao.createSearchBuilder();
|
||||
HostSearch.and("dcId", HostSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
|
||||
|
||||
HostTemplateStatesSearch.join("host", HostSearch, HostSearch.entity().getId(), HostTemplateStatesSearch.entity().getHostId());
|
||||
HostTemplateStatesSearch.join("host", HostSearch, HostSearch.entity().getId(), HostTemplateStatesSearch.entity().getHostId(), JoinBuilder.JoinType.INNER);
|
||||
HostSearch.done();
|
||||
HostTemplateStatesSearch.done();
|
||||
|
||||
|
|
|
|||
|
|
@ -312,7 +312,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
|
|||
str.append(clause);
|
||||
}
|
||||
|
||||
Collection<Ternary<SearchCriteria<?>, Attribute, Attribute>> joins = null;
|
||||
Collection<JoinBuilder<SearchCriteria<?>>> joins = null;
|
||||
if (sc != null) {
|
||||
joins = sc.getJoins();
|
||||
if (joins != null) {
|
||||
|
|
@ -341,9 +341,10 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
|
|||
prepareAttribute(++i, pstmt, value.first(), value.second());
|
||||
}
|
||||
}
|
||||
|
||||
if (joins != null) {
|
||||
for (Ternary<SearchCriteria<?>, Attribute, Attribute> join : joins) {
|
||||
for (final Pair<Attribute, Object> value : join.first().getValues()) {
|
||||
for (JoinBuilder<SearchCriteria<?>> join : joins) {
|
||||
for (final Pair<Attribute, Object> value : join.getT().getValues()) {
|
||||
prepareAttribute(++i, pstmt, value.first(), value.second());
|
||||
}
|
||||
}
|
||||
|
|
@ -378,7 +379,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
|
|||
str.append(clause);
|
||||
}
|
||||
|
||||
Collection<Ternary<SearchCriteria<?>, Attribute, Attribute>> joins = null;
|
||||
Collection<JoinBuilder<SearchCriteria<?>>> joins = null;
|
||||
if (sc != null) {
|
||||
joins = sc.getJoins();
|
||||
if (joins != null) {
|
||||
|
|
@ -401,9 +402,10 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
|
|||
prepareAttribute(++i, pstmt, value.first(), value.second());
|
||||
}
|
||||
}
|
||||
|
||||
if (joins != null) {
|
||||
for (Ternary<SearchCriteria<?>, Attribute, Attribute> join : joins) {
|
||||
for (final Pair<Attribute, Object> value : join.first().getValues()) {
|
||||
for (JoinBuilder<SearchCriteria<?>> join : joins) {
|
||||
for (final Pair<Attribute, Object> value : join.getT().getValues()) {
|
||||
prepareAttribute(++i, pstmt, value.first(), value.second());
|
||||
}
|
||||
}
|
||||
|
|
@ -411,6 +413,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
|
|||
s_logger.trace("join search statement is " + pstmt.toString());
|
||||
}
|
||||
}
|
||||
|
||||
ResultSet rs = pstmt.executeQuery();
|
||||
SelectType st = sc.getSelectType();
|
||||
ArrayList<M> results = new ArrayList<M>();
|
||||
|
|
@ -1013,25 +1016,28 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
|
|||
}
|
||||
|
||||
@DB(txn=false)
|
||||
protected void addJoins(StringBuilder str, Collection<Ternary<SearchCriteria<?>, Attribute, Attribute>> joins) {
|
||||
int fromIndex = str.lastIndexOf("FROM") + 5;
|
||||
if (str.lastIndexOf("WHERE") == -1) {
|
||||
protected void addJoins(StringBuilder str, Collection<JoinBuilder<SearchCriteria<?>>> joins) {
|
||||
int fromIndex = str.lastIndexOf("WHERE");
|
||||
if (fromIndex == -1) {
|
||||
fromIndex = str.length();
|
||||
str.append(" WHERE ");
|
||||
} else {
|
||||
str.append(" AND ");
|
||||
}
|
||||
|
||||
for (Ternary<SearchCriteria<?>, Attribute, Attribute> join : joins) {
|
||||
str.insert(fromIndex, join.third().table + ", ");
|
||||
str.append(join.second().table).append(".").append(join.second().columnName).append("=").append(join.third().table).append(".").append(join.third().columnName);
|
||||
str.append(" AND (").append(join.first().getWhereClause()).append(") AND ");
|
||||
}
|
||||
|
||||
for (Ternary<SearchCriteria<?>, Attribute, Attribute> join : joins) {
|
||||
if (join.first().getJoins() != null) {
|
||||
addJoins(str, join.first().getJoins());
|
||||
}
|
||||
|
||||
for (JoinBuilder<SearchCriteria<?>> join : joins) {
|
||||
StringBuilder onClause = new StringBuilder();
|
||||
onClause.append(" ").append(join.getType().getName()).append(" ").append(join.getSecondAttribute().table).append(" ON ").append(join.getFirstAttribute().table).append(".").append(join.getFirstAttribute().columnName).append("=").append(join.getSecondAttribute().table).append(".").append(join.getSecondAttribute().columnName).append(" ");
|
||||
str.insert(fromIndex, onClause);
|
||||
str.append(" (").append(join.getT().getWhereClause()).append(") AND ");
|
||||
fromIndex+=onClause.length();
|
||||
}
|
||||
|
||||
for (JoinBuilder<SearchCriteria<?>> join : joins) {
|
||||
if (join.getT().getJoins() != null) {
|
||||
addJoins(str, join.getT().getJoins());
|
||||
}
|
||||
}
|
||||
|
||||
str.delete(str.length() - 4, str.length());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@ import net.sf.cglib.proxy.Factory;
|
|||
import net.sf.cglib.proxy.MethodInterceptor;
|
||||
import net.sf.cglib.proxy.MethodProxy;
|
||||
|
||||
import com.cloud.utils.Ternary;
|
||||
import com.cloud.utils.db.SearchCriteria.Func;
|
||||
import com.cloud.utils.db.SearchCriteria.Op;
|
||||
import com.cloud.utils.db.SearchCriteria.SelectType;
|
||||
|
|
@ -47,7 +46,7 @@ public class GenericSearchBuilder<T, K> implements MethodInterceptor {
|
|||
final protected Map<String, Attribute> _attrs;
|
||||
|
||||
protected ArrayList<Condition> _conditions;
|
||||
protected HashMap<String, Ternary<GenericSearchBuilder<?, ?>, Attribute, Attribute>> _joins;
|
||||
protected HashMap<String, JoinBuilder<GenericSearchBuilder<?, ?>>> _joins;
|
||||
protected ArrayList<Select> _selects;
|
||||
protected ArrayList<Attribute> _groupBys;
|
||||
protected Class<T> _entityBeanType;
|
||||
|
|
@ -219,16 +218,16 @@ public class GenericSearchBuilder<T, K> implements MethodInterceptor {
|
|||
return this;
|
||||
}
|
||||
|
||||
public GenericSearchBuilder<T, K> join(String name, GenericSearchBuilder<?, ?> builder, Object useless, Object useless2) {
|
||||
public GenericSearchBuilder<T, K> join(String name, GenericSearchBuilder<?, ?> builder, Object useless, Object useless2, JoinBuilder.JoinType joinType) {
|
||||
assert _entity != null : "SearchBuilder cannot be modified once it has been setup";
|
||||
assert _specifiedAttrs.size() == 1 : "You didn't select the attribute.";
|
||||
assert builder._entity != null : "SearchBuilder cannot be modified once it has been setup";
|
||||
assert builder._specifiedAttrs.size() == 1 : "You didn't select the attribute.";
|
||||
assert builder != this : "You can't add yourself, can you? Really think about it!";
|
||||
|
||||
Ternary<GenericSearchBuilder<?, ?>, Attribute, Attribute> t = new Ternary<GenericSearchBuilder<?, ?>, Attribute, Attribute>(builder, _specifiedAttrs.get(0), builder._specifiedAttrs.get(0));
|
||||
JoinBuilder<GenericSearchBuilder<?, ?>> t = new JoinBuilder<GenericSearchBuilder<?, ?>>(builder, _specifiedAttrs.get(0), builder._specifiedAttrs.get(0), joinType);
|
||||
if (_joins == null) {
|
||||
_joins = new HashMap<String, Ternary<GenericSearchBuilder<?, ?>, Attribute, Attribute>>();
|
||||
_joins = new HashMap<String, JoinBuilder<GenericSearchBuilder<?, ?>>>();
|
||||
}
|
||||
_joins.put(name, t);
|
||||
|
||||
|
|
@ -294,8 +293,8 @@ public class GenericSearchBuilder<T, K> implements MethodInterceptor {
|
|||
}
|
||||
|
||||
if (_joins != null) {
|
||||
for (Ternary<GenericSearchBuilder<?, ?>, Attribute, Attribute> join : _joins.values()) {
|
||||
join.first().done();
|
||||
for (JoinBuilder<GenericSearchBuilder<?, ?>> join : _joins.values()) {
|
||||
join.getT().done();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,63 @@
|
|||
package com.cloud.utils.db;
|
||||
|
||||
|
||||
public class JoinBuilder<T> {
|
||||
|
||||
public enum JoinType {
|
||||
INNER ("INNER JOIN"),
|
||||
LEFT ("LEFT JOIN"),
|
||||
RIGHT ("RIGHT JOIN"),
|
||||
RIGHTOUTER ("RIGHT OUTER JOIN"),
|
||||
LEFTOUTER ("LEFT OUTER JOIN");
|
||||
|
||||
private final String _name;
|
||||
|
||||
JoinType(String name) {
|
||||
_name = name;
|
||||
}
|
||||
|
||||
public String getName() { return _name; }
|
||||
}
|
||||
|
||||
|
||||
private T t;
|
||||
private JoinType type;
|
||||
private Attribute firstAttribute;
|
||||
private Attribute secondAttribute;
|
||||
|
||||
public JoinBuilder(T t, Attribute firstAttribute,
|
||||
Attribute secondAttribute, JoinType type) {
|
||||
this.t = t;
|
||||
this.firstAttribute = firstAttribute;
|
||||
this.secondAttribute = secondAttribute;
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public T getT() {
|
||||
return t;
|
||||
}
|
||||
public void setT(T t) {
|
||||
this.t = t;
|
||||
}
|
||||
public JoinType getType() {
|
||||
return type;
|
||||
}
|
||||
public void setType(JoinType type) {
|
||||
this.type = type;
|
||||
}
|
||||
public Attribute getFirstAttribute() {
|
||||
return firstAttribute;
|
||||
}
|
||||
public void setFirstAttribute(Attribute firstAttribute) {
|
||||
this.firstAttribute = firstAttribute;
|
||||
}
|
||||
public Attribute getSecondAttribute() {
|
||||
return secondAttribute;
|
||||
}
|
||||
public void setSecondAttribute(Attribute secondAttribute) {
|
||||
this.secondAttribute = secondAttribute;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -25,7 +25,6 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
|
||||
import com.cloud.utils.Pair;
|
||||
import com.cloud.utils.Ternary;
|
||||
import com.cloud.utils.db.GenericSearchBuilder.Condition;
|
||||
import com.cloud.utils.db.GenericSearchBuilder.Select;
|
||||
|
||||
|
|
@ -117,7 +116,7 @@ public class SearchCriteria<K> {
|
|||
private ArrayList<Condition> _additionals = null;
|
||||
private final HashMap<String, Object[]> _params = new HashMap<String, Object[]>();
|
||||
private int _counter;
|
||||
private HashMap<String, Ternary<SearchCriteria<?>, Attribute, Attribute>> _joins;
|
||||
private HashMap<String, JoinBuilder<SearchCriteria<?>>> _joins;
|
||||
private final ArrayList<Select> _selects;
|
||||
private final ArrayList<Attribute> _groupBys;
|
||||
private final Class<K> _resultType;
|
||||
|
|
@ -130,10 +129,10 @@ public class SearchCriteria<K> {
|
|||
this._counter = 0;
|
||||
this._joins = null;
|
||||
if (sb._joins != null) {
|
||||
_joins = new HashMap<String, Ternary<SearchCriteria<?>, Attribute, Attribute>>(sb._joins.size());
|
||||
for (Map.Entry<String, Ternary<GenericSearchBuilder<?, ?>, Attribute, Attribute>> entry : sb._joins.entrySet()) {
|
||||
Ternary<GenericSearchBuilder<?, ?>, Attribute, Attribute> value = entry.getValue();
|
||||
_joins.put(entry.getKey(), new Ternary<SearchCriteria<?>, Attribute, Attribute>(value.first().create(), value.second(), value.third()));
|
||||
_joins = new HashMap<String, JoinBuilder<SearchCriteria<?>>>(sb._joins.size());
|
||||
for (Map.Entry<String, JoinBuilder<GenericSearchBuilder<?, ?>>> entry : sb._joins.entrySet()) {
|
||||
JoinBuilder<GenericSearchBuilder<?, ?>> value = entry.getValue();
|
||||
_joins.put(entry.getKey(), new JoinBuilder<SearchCriteria<?>>(value.getT().create(),value.getFirstAttribute(), value.getSecondAttribute(), value.getType()));
|
||||
}
|
||||
}
|
||||
_selects = sb._selects;
|
||||
|
|
@ -187,25 +186,26 @@ public class SearchCriteria<K> {
|
|||
}
|
||||
|
||||
public void setJoinParameters(String joinName, String conditionName, Object... params) {
|
||||
Ternary<SearchCriteria<?>, Attribute, Attribute> join = _joins.get(joinName);
|
||||
JoinBuilder<SearchCriteria<?>> join = _joins.get(joinName);
|
||||
assert (join != null) : "Incorrect join name specified: " + joinName;
|
||||
join.first().setParameters(conditionName, params);
|
||||
join.getT().setParameters(conditionName, params);
|
||||
|
||||
}
|
||||
|
||||
public void addJoinAnd(String joinName, String field, Op op, Object... values) {
|
||||
Ternary<SearchCriteria<?>, Attribute, Attribute> join = _joins.get(joinName);
|
||||
JoinBuilder<SearchCriteria<?>> join = _joins.get(joinName);
|
||||
assert (join != null) : "Incorrect join name specified: " + joinName;
|
||||
join.first().addAnd(field, op, values);
|
||||
join.getT().addAnd(field, op, values);
|
||||
}
|
||||
|
||||
public void addJoinOr(String joinName, String field, Op op, Object... values) {
|
||||
Ternary<SearchCriteria<?>, Attribute, Attribute> join = _joins.get(joinName);
|
||||
JoinBuilder<SearchCriteria<?>> join = _joins.get(joinName);
|
||||
assert (join != null) : "Incorrect join name specified: " + joinName;
|
||||
join.first().addOr(field, op, values);
|
||||
join.getT().addOr(field, op, values);
|
||||
}
|
||||
|
||||
public SearchCriteria getJoin(String joinName) {
|
||||
return _joins.get(joinName).first();
|
||||
return _joins.get(joinName).getT();
|
||||
}
|
||||
|
||||
public List<Attribute> getGroupBy() {
|
||||
|
|
@ -290,12 +290,11 @@ public class SearchCriteria<K> {
|
|||
return params;
|
||||
}
|
||||
|
||||
public Collection<Ternary<SearchCriteria<?>, Attribute, Attribute>> getJoins() {
|
||||
public Collection<JoinBuilder<SearchCriteria<?>>> getJoins() {
|
||||
return _joins != null ? _joins.values() : null;
|
||||
}
|
||||
|
||||
private void getParams(ArrayList<Pair<Attribute, Object>> params, Condition condition, Object[] objs) {
|
||||
//Object[] objs = _params.get(condition.name);
|
||||
if (condition.op == Op.SC) {
|
||||
assert (objs != null && objs.length > 0) : " Where's your search criteria object? " + condition.name;
|
||||
params.addAll(((SearchCriteria<?>)objs[0]).getValues());
|
||||
|
|
|
|||
Loading…
Reference in New Issue