diff --git a/core/src/com/cloud/dc/dao/VlanDaoImpl.java b/core/src/com/cloud/dc/dao/VlanDaoImpl.java index 3d19ecd2949..9bd8f962c70 100644 --- a/core/src/com/cloud/dc/dao/VlanDaoImpl.java +++ b/core/src/com/cloud/dc/dao/VlanDaoImpl.java @@ -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 implements VlanDao SearchBuilder 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 implements VlanDao SearchBuilder 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(); diff --git a/core/src/com/cloud/network/security/dao/IngressRuleDaoImpl.java b/core/src/com/cloud/network/security/dao/IngressRuleDaoImpl.java index 3966131a3fb..7d3835d3f9d 100644 --- a/core/src/com/cloud/network/security/dao/IngressRuleDaoImpl.java +++ b/core/src/com/cloud/network/security/dao/IngressRuleDaoImpl.java @@ -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 impl protoPortsAndNetworkGroupNameSearch.and("endPort", protoPortsAndNetworkGroupNameSearch.entity().getEndPort(), SearchCriteria.Op.EQ); SearchBuilder 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); } diff --git a/core/src/com/cloud/network/security/dao/NetworkGroupRulesDaoImpl.java b/core/src/com/cloud/network/security/dao/NetworkGroupRulesDaoImpl.java index 924bfe23e12..b3b0de19d7f 100644 --- a/core/src/com/cloud/network/security/dao/NetworkGroupRulesDaoImpl.java +++ b/core/src/com/cloud/network/security/dao/NetworkGroupRulesDaoImpl.java @@ -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 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(); } diff --git a/core/src/com/cloud/vm/dao/UserVmDaoImpl.java b/core/src/com/cloud/vm/dao/UserVmDaoImpl.java index 5172f337c73..11e65907500 100755 --- a/core/src/com/cloud/vm/dao/UserVmDaoImpl.java +++ b/core/src/com/cloud/vm/dao/UserVmDaoImpl.java @@ -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 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(); } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 504aba68dd1..0d67dc519a9 100644 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -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 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 ipAddressSC = ipAddressSB.create(); ipAddressSC.setParameters("accountId", accountId); diff --git a/server/src/com/cloud/network/dao/NetworkConfigurationDaoImpl.java b/server/src/com/cloud/network/dao/NetworkConfigurationDaoImpl.java index f8b5b7e6ecb..8a5c0a03cfa 100644 --- a/server/src/com/cloud/network/dao/NetworkConfigurationDaoImpl.java +++ b/server/src/com/cloud/network/dao/NetworkConfigurationDaoImpl.java @@ -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 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(); diff --git a/server/src/com/cloud/network/security/NetworkGroupManagerImpl.java b/server/src/com/cloud/network/security/NetworkGroupManagerImpl.java index 0ab316885c1..0b5f6cf3952 100644 --- a/server/src/com/cloud/network/security/NetworkGroupManagerImpl.java +++ b/server/src/com/cloud/network/security/NetworkGroupManagerImpl.java @@ -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 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 sc = sb.create(); diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 43648b83946..73cd5f21a6f 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -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 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 sc = sb.create(); @@ -4197,13 +4195,13 @@ public class ManagementServerImpl implements ManagementServer { if (accountId != null) { SearchBuilder 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 sc = sb.create(); diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 34c86733e8d..dc0fcaca1ff 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -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 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 volumeSC = volumeSB.create(); volumeSC.setParameters("poolId", storagePool.getId()); @@ -1104,7 +1105,7 @@ public class StorageManagerImpl implements StorageManager { PoolsUsedByVmSearch = _storagePoolDao.createSearchBuilder(); SearchBuilder 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 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(); diff --git a/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java b/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java index 1ea7ef7ecfd..5825206bc12 100644 --- a/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java +++ b/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java @@ -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 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(); diff --git a/server/src/com/cloud/storage/preallocatedlun/dao/PreallocatedLunDaoImpl.java b/server/src/com/cloud/storage/preallocatedlun/dao/PreallocatedLunDaoImpl.java index 4c79cac7d44..792a3d0b75e 100644 --- a/server/src/com/cloud/storage/preallocatedlun/dao/PreallocatedLunDaoImpl.java +++ b/server/src/com/cloud/storage/preallocatedlun/dao/PreallocatedLunDaoImpl.java @@ -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 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(); diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java index adc185bc0bb..7e85ab63f7c 100644 --- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java +++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java @@ -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 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."); diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index 5b5b8a7ddba..a1aea47fe1b 100755 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -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 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(); diff --git a/utils/src/com/cloud/utils/db/GenericDaoBase.java b/utils/src/com/cloud/utils/db/GenericDaoBase.java index 8e770481be0..54e40da4fbc 100755 --- a/utils/src/com/cloud/utils/db/GenericDaoBase.java +++ b/utils/src/com/cloud/utils/db/GenericDaoBase.java @@ -312,7 +312,7 @@ public abstract class GenericDaoBase implements Gene str.append(clause); } - Collection, Attribute, Attribute>> joins = null; + Collection>> joins = null; if (sc != null) { joins = sc.getJoins(); if (joins != null) { @@ -341,9 +341,10 @@ public abstract class GenericDaoBase implements Gene prepareAttribute(++i, pstmt, value.first(), value.second()); } } + if (joins != null) { - for (Ternary, Attribute, Attribute> join : joins) { - for (final Pair value : join.first().getValues()) { + for (JoinBuilder> join : joins) { + for (final Pair value : join.getT().getValues()) { prepareAttribute(++i, pstmt, value.first(), value.second()); } } @@ -378,7 +379,7 @@ public abstract class GenericDaoBase implements Gene str.append(clause); } - Collection, Attribute, Attribute>> joins = null; + Collection>> joins = null; if (sc != null) { joins = sc.getJoins(); if (joins != null) { @@ -401,9 +402,10 @@ public abstract class GenericDaoBase implements Gene prepareAttribute(++i, pstmt, value.first(), value.second()); } } + if (joins != null) { - for (Ternary, Attribute, Attribute> join : joins) { - for (final Pair value : join.first().getValues()) { + for (JoinBuilder> join : joins) { + for (final Pair value : join.getT().getValues()) { prepareAttribute(++i, pstmt, value.first(), value.second()); } } @@ -411,6 +413,7 @@ public abstract class GenericDaoBase implements Gene s_logger.trace("join search statement is " + pstmt.toString()); } } + ResultSet rs = pstmt.executeQuery(); SelectType st = sc.getSelectType(); ArrayList results = new ArrayList(); @@ -1013,25 +1016,28 @@ public abstract class GenericDaoBase implements Gene } @DB(txn=false) - protected void addJoins(StringBuilder str, Collection, Attribute, Attribute>> joins) { - int fromIndex = str.lastIndexOf("FROM") + 5; - if (str.lastIndexOf("WHERE") == -1) { + protected void addJoins(StringBuilder str, Collection>> joins) { + int fromIndex = str.lastIndexOf("WHERE"); + if (fromIndex == -1) { + fromIndex = str.length(); str.append(" WHERE "); } else { str.append(" AND "); } - - for (Ternary, 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, Attribute, Attribute> join : joins) { - if (join.first().getJoins() != null) { - addJoins(str, join.first().getJoins()); - } + + for (JoinBuilder> 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> join : joins) { + if (join.getT().getJoins() != null) { + addJoins(str, join.getT().getJoins()); } + } str.delete(str.length() - 4, str.length()); } diff --git a/utils/src/com/cloud/utils/db/GenericSearchBuilder.java b/utils/src/com/cloud/utils/db/GenericSearchBuilder.java index 4b7fef121ba..11609eb2f3d 100644 --- a/utils/src/com/cloud/utils/db/GenericSearchBuilder.java +++ b/utils/src/com/cloud/utils/db/GenericSearchBuilder.java @@ -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 implements MethodInterceptor { final protected Map _attrs; protected ArrayList _conditions; - protected HashMap, Attribute, Attribute>> _joins; + protected HashMap>> _joins; protected ArrayList _selects; private final ArrayList _groupBys; private final Class _resultType; @@ -130,10 +129,10 @@ public class SearchCriteria { this._counter = 0; this._joins = null; if (sb._joins != null) { - _joins = new HashMap, Attribute, Attribute>>(sb._joins.size()); - for (Map.Entry, Attribute, Attribute>> entry : sb._joins.entrySet()) { - Ternary, Attribute, Attribute> value = entry.getValue(); - _joins.put(entry.getKey(), new Ternary, Attribute, Attribute>(value.first().create(), value.second(), value.third())); + _joins = new HashMap>>(sb._joins.size()); + for (Map.Entry>> entry : sb._joins.entrySet()) { + JoinBuilder> value = entry.getValue(); + _joins.put(entry.getKey(), new JoinBuilder>(value.getT().create(),value.getFirstAttribute(), value.getSecondAttribute(), value.getType())); } } _selects = sb._selects; @@ -187,25 +186,26 @@ public class SearchCriteria { } public void setJoinParameters(String joinName, String conditionName, Object... params) { - Ternary, Attribute, Attribute> join = _joins.get(joinName); + JoinBuilder> 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, Attribute, Attribute> join = _joins.get(joinName); + JoinBuilder> 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, Attribute, Attribute> join = _joins.get(joinName); + JoinBuilder> 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 getGroupBy() { @@ -290,12 +290,11 @@ public class SearchCriteria { return params; } - public Collection, Attribute, Attribute>> getJoins() { + public Collection>> getJoins() { return _joins != null ? _joins.values() : null; } private void getParams(ArrayList> 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());