// Code generated by BobGen psql v0.42.5. DO NOT EDIT.
// This file is meant to be re-generated in place and/or deleted at any time.

package models

import (
	"hash/maphash"

	"github.com/Gleipnir-Technology/bob"
	"github.com/Gleipnir-Technology/bob/clause"
	"github.com/Gleipnir-Technology/bob/dialect/psql/dialect"
)

var (
	SelectJoins = getJoins[*dialect.SelectQuery]()
	UpdateJoins = getJoins[*dialect.UpdateQuery]()
	DeleteJoins = getJoins[*dialect.DeleteQuery]()
)

type joinSet[Q interface{ aliasedAs(string) Q }] struct {
	InnerJoin Q
	LeftJoin  Q
	RightJoin Q
}

func (j joinSet[Q]) AliasedAs(alias string) joinSet[Q] {
	return joinSet[Q]{
		InnerJoin: j.InnerJoin.aliasedAs(alias),
		LeftJoin:  j.LeftJoin.aliasedAs(alias),
		RightJoin: j.RightJoin.aliasedAs(alias),
	}
}

type joins[Q dialect.Joinable] struct {
	Addresses                          joinSet[addressJoins[Q]]
	ArcgisAccounts                     joinSet[arcgisAccountJoins[Q]]
	ArcgisAddressMappings              joinSet[arcgisAddressMappingJoins[Q]]
	ArcgisLayers                       joinSet[arcgisLayerJoins[Q]]
	ArcgisLayerFields                  joinSet[arcgisLayerFieldJoins[Q]]
	ArcgisOauthTokens                  joinSet[arcgisOauthTokenJoins[Q]]
	ArcgisParcelMappings               joinSet[arcgisParcelMappingJoins[Q]]
	ArcgisServiceFeatures              joinSet[arcgisServiceFeatureJoins[Q]]
	ArcgisServiceMaps                  joinSet[arcgisServiceMapJoins[Q]]
	ArcgisUsers                        joinSet[arcgisuserJoins[Q]]
	ArcgisUserPrivileges               joinSet[arcgisUserPrivilegeJoins[Q]]
	CommsEmailContacts                 joinSet[commsEmailContactJoins[Q]]
	CommsEmailLogs                     joinSet[commsEmailLogJoins[Q]]
	CommsEmailTemplates                joinSet[commsEmailTemplateJoins[Q]]
	CommsPhones                        joinSet[commsPhoneJoins[Q]]
	CommsTextJobs                      joinSet[commsTextJobJoins[Q]]
	CommsTextLogs                      joinSet[commsTextLogJoins[Q]]
	ComplianceReportRequests           joinSet[complianceReportRequestJoins[Q]]
	DistrictSubscriptionEmails         joinSet[districtSubscriptionEmailJoins[Q]]
	DistrictSubscriptionPhones         joinSet[districtSubscriptionPhoneJoins[Q]]
	FieldseekerContainerrelates        joinSet[fieldseekerContainerrelateJoins[Q]]
	FieldseekerFieldscoutinglogs       joinSet[fieldseekerFieldscoutinglogJoins[Q]]
	FieldseekerHabitatrelates          joinSet[fieldseekerHabitatrelateJoins[Q]]
	FieldseekerInspectionsamples       joinSet[fieldseekerInspectionsampleJoins[Q]]
	FieldseekerInspectionsampledetails joinSet[fieldseekerInspectionsampledetailJoins[Q]]
	FieldseekerLinelocations           joinSet[fieldseekerLinelocationJoins[Q]]
	FieldseekerLocationtrackings       joinSet[fieldseekerLocationtrackingJoins[Q]]
	FieldseekerMosquitoinspections     joinSet[fieldseekerMosquitoinspectionJoins[Q]]
	FieldseekerPointlocations          joinSet[fieldseekerPointlocationJoins[Q]]
	FieldseekerPolygonlocations        joinSet[fieldseekerPolygonlocationJoins[Q]]
	FieldseekerPools                   joinSet[fieldseekerPoolJoins[Q]]
	FieldseekerPooldetails             joinSet[fieldseekerPooldetailJoins[Q]]
	FieldseekerProposedtreatmentareas  joinSet[fieldseekerProposedtreatmentareaJoins[Q]]
	FieldseekerQamosquitoinspections   joinSet[fieldseekerQamosquitoinspectionJoins[Q]]
	FieldseekerRodentlocations         joinSet[fieldseekerRodentlocationJoins[Q]]
	FieldseekerSamplecollections       joinSet[fieldseekerSamplecollectionJoins[Q]]
	FieldseekerSamplelocations         joinSet[fieldseekerSamplelocationJoins[Q]]
	FieldseekerServicerequests         joinSet[fieldseekerServicerequestJoins[Q]]
	FieldseekerSpeciesabundances       joinSet[fieldseekerSpeciesabundanceJoins[Q]]
	FieldseekerStormdrains             joinSet[fieldseekerStormdrainJoins[Q]]
	FieldseekerTimecards               joinSet[fieldseekerTimecardJoins[Q]]
	FieldseekerTrapdata                joinSet[fieldseekerTrapdatumJoins[Q]]
	FieldseekerTraplocations           joinSet[fieldseekerTraplocationJoins[Q]]
	FieldseekerTreatments              joinSet[fieldseekerTreatmentJoins[Q]]
	FieldseekerTreatmentareas          joinSet[fieldseekerTreatmentareaJoins[Q]]
	FieldseekerZones                   joinSet[fieldseekerZoneJoins[Q]]
	FieldseekerZones2s                 joinSet[fieldseekerZones2Joins[Q]]
	FieldseekerSyncs                   joinSet[fieldseekerSyncJoins[Q]]
	FileuploadCSVS                     joinSet[fileuploadCSVJoins[Q]]
	FileuploadErrorCSVS                joinSet[fileuploadErrorCSVJoins[Q]]
	FileuploadErrorFiles               joinSet[fileuploadErrorFileJoins[Q]]
	FileuploadFiles                    joinSet[fileuploadFileJoins[Q]]
	FileuploadPools                    joinSet[fileuploadPoolJoins[Q]]
	H3Aggregations                     joinSet[h3AggregationJoins[Q]]
	NoteAudios                         joinSet[noteAudioJoins[Q]]
	NoteAudioBreadcrumbs               joinSet[noteAudioBreadcrumbJoins[Q]]
	NoteAudioData                      joinSet[noteAudioDatumJoins[Q]]
	NoteImages                         joinSet[noteImageJoins[Q]]
	NoteImageBreadcrumbs               joinSet[noteImageBreadcrumbJoins[Q]]
	NoteImageData                      joinSet[noteImageDatumJoins[Q]]
	Notifications                      joinSet[notificationJoins[Q]]
	Organizations                      joinSet[organizationJoins[Q]]
	Parcels                            joinSet[parcelJoins[Q]]
	Pools                              joinSet[poolJoins[Q]]
	PublicreportImages                 joinSet[publicreportImageJoins[Q]]
	PublicreportImageExifs             joinSet[publicreportImageExifJoins[Q]]
	PublicreportNotifyEmailNuisances   joinSet[publicreportNotifyEmailNuisanceJoins[Q]]
	PublicreportNotifyEmailPools       joinSet[publicreportNotifyEmailPoolJoins[Q]]
	PublicreportNotifyPhoneNuisances   joinSet[publicreportNotifyPhoneNuisanceJoins[Q]]
	PublicreportNotifyPhonePools       joinSet[publicreportNotifyPhonePoolJoins[Q]]
	PublicreportNuisances              joinSet[publicreportNuisanceJoins[Q]]
	PublicreportNuisanceImages         joinSet[publicreportNuisanceImageJoins[Q]]
	PublicreportPools                  joinSet[publicreportPoolJoins[Q]]
	PublicreportPoolImages             joinSet[publicreportPoolImageJoins[Q]]
	PublicreportQuicks                 joinSet[publicreportQuickJoins[Q]]
	PublicreportQuickImages            joinSet[publicreportQuickImageJoins[Q]]
	PublicreportSubscribeEmails        joinSet[publicreportSubscribeEmailJoins[Q]]
	PublicreportSubscribePhones        joinSet[publicreportSubscribePhoneJoins[Q]]
	Residents                          joinSet[residentJoins[Q]]
	Sites                              joinSet[siteJoins[Q]]
	Users                              joinSet[userJoins[Q]]
}

func buildJoinSet[Q interface{ aliasedAs(string) Q }, C any, F func(C, string) Q](c C, f F) joinSet[Q] {
	return joinSet[Q]{
		InnerJoin: f(c, clause.InnerJoin),
		LeftJoin:  f(c, clause.LeftJoin),
		RightJoin: f(c, clause.RightJoin),
	}
}

func getJoins[Q dialect.Joinable]() joins[Q] {
	return joins[Q]{
		Addresses:                          buildJoinSet[addressJoins[Q]](Addresses.Columns, buildAddressJoins),
		ArcgisAccounts:                     buildJoinSet[arcgisAccountJoins[Q]](ArcgisAccounts.Columns, buildArcgisAccountJoins),
		ArcgisAddressMappings:              buildJoinSet[arcgisAddressMappingJoins[Q]](ArcgisAddressMappings.Columns, buildArcgisAddressMappingJoins),
		ArcgisLayers:                       buildJoinSet[arcgisLayerJoins[Q]](ArcgisLayers.Columns, buildArcgisLayerJoins),
		ArcgisLayerFields:                  buildJoinSet[arcgisLayerFieldJoins[Q]](ArcgisLayerFields.Columns, buildArcgisLayerFieldJoins),
		ArcgisOauthTokens:                  buildJoinSet[arcgisOauthTokenJoins[Q]](ArcgisOauthTokens.Columns, buildArcgisOauthTokenJoins),
		ArcgisParcelMappings:               buildJoinSet[arcgisParcelMappingJoins[Q]](ArcgisParcelMappings.Columns, buildArcgisParcelMappingJoins),
		ArcgisServiceFeatures:              buildJoinSet[arcgisServiceFeatureJoins[Q]](ArcgisServiceFeatures.Columns, buildArcgisServiceFeatureJoins),
		ArcgisServiceMaps:                  buildJoinSet[arcgisServiceMapJoins[Q]](ArcgisServiceMaps.Columns, buildArcgisServiceMapJoins),
		ArcgisUsers:                        buildJoinSet[arcgisuserJoins[Q]](ArcgisUsers.Columns, buildArcgisUserJoins),
		ArcgisUserPrivileges:               buildJoinSet[arcgisUserPrivilegeJoins[Q]](ArcgisUserPrivileges.Columns, buildArcgisUserPrivilegeJoins),
		CommsEmailContacts:                 buildJoinSet[commsEmailContactJoins[Q]](CommsEmailContacts.Columns, buildCommsEmailContactJoins),
		CommsEmailLogs:                     buildJoinSet[commsEmailLogJoins[Q]](CommsEmailLogs.Columns, buildCommsEmailLogJoins),
		CommsEmailTemplates:                buildJoinSet[commsEmailTemplateJoins[Q]](CommsEmailTemplates.Columns, buildCommsEmailTemplateJoins),
		CommsPhones:                        buildJoinSet[commsPhoneJoins[Q]](CommsPhones.Columns, buildCommsPhoneJoins),
		CommsTextJobs:                      buildJoinSet[commsTextJobJoins[Q]](CommsTextJobs.Columns, buildCommsTextJobJoins),
		CommsTextLogs:                      buildJoinSet[commsTextLogJoins[Q]](CommsTextLogs.Columns, buildCommsTextLogJoins),
		ComplianceReportRequests:           buildJoinSet[complianceReportRequestJoins[Q]](ComplianceReportRequests.Columns, buildComplianceReportRequestJoins),
		DistrictSubscriptionEmails:         buildJoinSet[districtSubscriptionEmailJoins[Q]](DistrictSubscriptionEmails.Columns, buildDistrictSubscriptionEmailJoins),
		DistrictSubscriptionPhones:         buildJoinSet[districtSubscriptionPhoneJoins[Q]](DistrictSubscriptionPhones.Columns, buildDistrictSubscriptionPhoneJoins),
		FieldseekerContainerrelates:        buildJoinSet[fieldseekerContainerrelateJoins[Q]](FieldseekerContainerrelates.Columns, buildFieldseekerContainerrelateJoins),
		FieldseekerFieldscoutinglogs:       buildJoinSet[fieldseekerFieldscoutinglogJoins[Q]](FieldseekerFieldscoutinglogs.Columns, buildFieldseekerFieldscoutinglogJoins),
		FieldseekerHabitatrelates:          buildJoinSet[fieldseekerHabitatrelateJoins[Q]](FieldseekerHabitatrelates.Columns, buildFieldseekerHabitatrelateJoins),
		FieldseekerInspectionsamples:       buildJoinSet[fieldseekerInspectionsampleJoins[Q]](FieldseekerInspectionsamples.Columns, buildFieldseekerInspectionsampleJoins),
		FieldseekerInspectionsampledetails: buildJoinSet[fieldseekerInspectionsampledetailJoins[Q]](FieldseekerInspectionsampledetails.Columns, buildFieldseekerInspectionsampledetailJoins),
		FieldseekerLinelocations:           buildJoinSet[fieldseekerLinelocationJoins[Q]](FieldseekerLinelocations.Columns, buildFieldseekerLinelocationJoins),
		FieldseekerLocationtrackings:       buildJoinSet[fieldseekerLocationtrackingJoins[Q]](FieldseekerLocationtrackings.Columns, buildFieldseekerLocationtrackingJoins),
		FieldseekerMosquitoinspections:     buildJoinSet[fieldseekerMosquitoinspectionJoins[Q]](FieldseekerMosquitoinspections.Columns, buildFieldseekerMosquitoinspectionJoins),
		FieldseekerPointlocations:          buildJoinSet[fieldseekerPointlocationJoins[Q]](FieldseekerPointlocations.Columns, buildFieldseekerPointlocationJoins),
		FieldseekerPolygonlocations:        buildJoinSet[fieldseekerPolygonlocationJoins[Q]](FieldseekerPolygonlocations.Columns, buildFieldseekerPolygonlocationJoins),
		FieldseekerPools:                   buildJoinSet[fieldseekerPoolJoins[Q]](FieldseekerPools.Columns, buildFieldseekerPoolJoins),
		FieldseekerPooldetails:             buildJoinSet[fieldseekerPooldetailJoins[Q]](FieldseekerPooldetails.Columns, buildFieldseekerPooldetailJoins),
		FieldseekerProposedtreatmentareas:  buildJoinSet[fieldseekerProposedtreatmentareaJoins[Q]](FieldseekerProposedtreatmentareas.Columns, buildFieldseekerProposedtreatmentareaJoins),
		FieldseekerQamosquitoinspections:   buildJoinSet[fieldseekerQamosquitoinspectionJoins[Q]](FieldseekerQamosquitoinspections.Columns, buildFieldseekerQamosquitoinspectionJoins),
		FieldseekerRodentlocations:         buildJoinSet[fieldseekerRodentlocationJoins[Q]](FieldseekerRodentlocations.Columns, buildFieldseekerRodentlocationJoins),
		FieldseekerSamplecollections:       buildJoinSet[fieldseekerSamplecollectionJoins[Q]](FieldseekerSamplecollections.Columns, buildFieldseekerSamplecollectionJoins),
		FieldseekerSamplelocations:         buildJoinSet[fieldseekerSamplelocationJoins[Q]](FieldseekerSamplelocations.Columns, buildFieldseekerSamplelocationJoins),
		FieldseekerServicerequests:         buildJoinSet[fieldseekerServicerequestJoins[Q]](FieldseekerServicerequests.Columns, buildFieldseekerServicerequestJoins),
		FieldseekerSpeciesabundances:       buildJoinSet[fieldseekerSpeciesabundanceJoins[Q]](FieldseekerSpeciesabundances.Columns, buildFieldseekerSpeciesabundanceJoins),
		FieldseekerStormdrains:             buildJoinSet[fieldseekerStormdrainJoins[Q]](FieldseekerStormdrains.Columns, buildFieldseekerStormdrainJoins),
		FieldseekerTimecards:               buildJoinSet[fieldseekerTimecardJoins[Q]](FieldseekerTimecards.Columns, buildFieldseekerTimecardJoins),
		FieldseekerTrapdata:                buildJoinSet[fieldseekerTrapdatumJoins[Q]](FieldseekerTrapdata.Columns, buildFieldseekerTrapdatumJoins),
		FieldseekerTraplocations:           buildJoinSet[fieldseekerTraplocationJoins[Q]](FieldseekerTraplocations.Columns, buildFieldseekerTraplocationJoins),
		FieldseekerTreatments:              buildJoinSet[fieldseekerTreatmentJoins[Q]](FieldseekerTreatments.Columns, buildFieldseekerTreatmentJoins),
		FieldseekerTreatmentareas:          buildJoinSet[fieldseekerTreatmentareaJoins[Q]](FieldseekerTreatmentareas.Columns, buildFieldseekerTreatmentareaJoins),
		FieldseekerZones:                   buildJoinSet[fieldseekerZoneJoins[Q]](FieldseekerZones.Columns, buildFieldseekerZoneJoins),
		FieldseekerZones2s:                 buildJoinSet[fieldseekerZones2Joins[Q]](FieldseekerZones2s.Columns, buildFieldseekerZones2Joins),
		FieldseekerSyncs:                   buildJoinSet[fieldseekerSyncJoins[Q]](FieldseekerSyncs.Columns, buildFieldseekerSyncJoins),
		FileuploadCSVS:                     buildJoinSet[fileuploadCSVJoins[Q]](FileuploadCSVS.Columns, buildFileuploadCSVJoins),
		FileuploadErrorCSVS:                buildJoinSet[fileuploadErrorCSVJoins[Q]](FileuploadErrorCSVS.Columns, buildFileuploadErrorCSVJoins),
		FileuploadErrorFiles:               buildJoinSet[fileuploadErrorFileJoins[Q]](FileuploadErrorFiles.Columns, buildFileuploadErrorFileJoins),
		FileuploadFiles:                    buildJoinSet[fileuploadFileJoins[Q]](FileuploadFiles.Columns, buildFileuploadFileJoins),
		FileuploadPools:                    buildJoinSet[fileuploadPoolJoins[Q]](FileuploadPools.Columns, buildFileuploadPoolJoins),
		H3Aggregations:                     buildJoinSet[h3AggregationJoins[Q]](H3Aggregations.Columns, buildH3AggregationJoins),
		NoteAudios:                         buildJoinSet[noteAudioJoins[Q]](NoteAudios.Columns, buildNoteAudioJoins),
		NoteAudioBreadcrumbs:               buildJoinSet[noteAudioBreadcrumbJoins[Q]](NoteAudioBreadcrumbs.Columns, buildNoteAudioBreadcrumbJoins),
		NoteAudioData:                      buildJoinSet[noteAudioDatumJoins[Q]](NoteAudioData.Columns, buildNoteAudioDatumJoins),
		NoteImages:                         buildJoinSet[noteImageJoins[Q]](NoteImages.Columns, buildNoteImageJoins),
		NoteImageBreadcrumbs:               buildJoinSet[noteImageBreadcrumbJoins[Q]](NoteImageBreadcrumbs.Columns, buildNoteImageBreadcrumbJoins),
		NoteImageData:                      buildJoinSet[noteImageDatumJoins[Q]](NoteImageData.Columns, buildNoteImageDatumJoins),
		Notifications:                      buildJoinSet[notificationJoins[Q]](Notifications.Columns, buildNotificationJoins),
		Organizations:                      buildJoinSet[organizationJoins[Q]](Organizations.Columns, buildOrganizationJoins),
		Parcels:                            buildJoinSet[parcelJoins[Q]](Parcels.Columns, buildParcelJoins),
		Pools:                              buildJoinSet[poolJoins[Q]](Pools.Columns, buildPoolJoins),
		PublicreportImages:                 buildJoinSet[publicreportImageJoins[Q]](PublicreportImages.Columns, buildPublicreportImageJoins),
		PublicreportImageExifs:             buildJoinSet[publicreportImageExifJoins[Q]](PublicreportImageExifs.Columns, buildPublicreportImageExifJoins),
		PublicreportNotifyEmailNuisances:   buildJoinSet[publicreportNotifyEmailNuisanceJoins[Q]](PublicreportNotifyEmailNuisances.Columns, buildPublicreportNotifyEmailNuisanceJoins),
		PublicreportNotifyEmailPools:       buildJoinSet[publicreportNotifyEmailPoolJoins[Q]](PublicreportNotifyEmailPools.Columns, buildPublicreportNotifyEmailPoolJoins),
		PublicreportNotifyPhoneNuisances:   buildJoinSet[publicreportNotifyPhoneNuisanceJoins[Q]](PublicreportNotifyPhoneNuisances.Columns, buildPublicreportNotifyPhoneNuisanceJoins),
		PublicreportNotifyPhonePools:       buildJoinSet[publicreportNotifyPhonePoolJoins[Q]](PublicreportNotifyPhonePools.Columns, buildPublicreportNotifyPhonePoolJoins),
		PublicreportNuisances:              buildJoinSet[publicreportNuisanceJoins[Q]](PublicreportNuisances.Columns, buildPublicreportNuisanceJoins),
		PublicreportNuisanceImages:         buildJoinSet[publicreportNuisanceImageJoins[Q]](PublicreportNuisanceImages.Columns, buildPublicreportNuisanceImageJoins),
		PublicreportPools:                  buildJoinSet[publicreportPoolJoins[Q]](PublicreportPools.Columns, buildPublicreportPoolJoins),
		PublicreportPoolImages:             buildJoinSet[publicreportPoolImageJoins[Q]](PublicreportPoolImages.Columns, buildPublicreportPoolImageJoins),
		PublicreportQuicks:                 buildJoinSet[publicreportQuickJoins[Q]](PublicreportQuicks.Columns, buildPublicreportQuickJoins),
		PublicreportQuickImages:            buildJoinSet[publicreportQuickImageJoins[Q]](PublicreportQuickImages.Columns, buildPublicreportQuickImageJoins),
		PublicreportSubscribeEmails:        buildJoinSet[publicreportSubscribeEmailJoins[Q]](PublicreportSubscribeEmails.Columns, buildPublicreportSubscribeEmailJoins),
		PublicreportSubscribePhones:        buildJoinSet[publicreportSubscribePhoneJoins[Q]](PublicreportSubscribePhones.Columns, buildPublicreportSubscribePhoneJoins),
		Residents:                          buildJoinSet[residentJoins[Q]](Residents.Columns, buildResidentJoins),
		Sites:                              buildJoinSet[siteJoins[Q]](Sites.Columns, buildSiteJoins),
		Users:                              buildJoinSet[userJoins[Q]](Users.Columns, buildUserJoins),
	}
}

type modAs[Q any, C interface{ AliasedAs(string) C }] struct {
	c C
	f func(C) bob.Mod[Q]
}

func (m modAs[Q, C]) Apply(q Q) {
	m.f(m.c).Apply(q)
}

func (m modAs[Q, C]) AliasedAs(alias string) bob.Mod[Q] {
	m.c = m.c.AliasedAs(alias)
	return m
}

func randInt() int64 {
	out := int64(new(maphash.Hash).Sum64())

	if out < 0 {
		return -out % 10000
	}

	return out % 10000
}
