@salesforce/afv-skills 1.8.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/skills/activating-datacloud/CREDITS.md +5 -0
- package/skills/activating-datacloud/README.md +39 -0
- package/skills/activating-datacloud/SKILL.md +118 -0
- package/skills/analyzing-omnistudio-dependencies/CREDITS.md +5 -0
- package/skills/analyzing-omnistudio-dependencies/SKILL.md +477 -0
- package/skills/analyzing-omnistudio-dependencies/references/dependency-patterns.md +508 -0
- package/skills/analyzing-omnistudio-dependencies/references/namespace-guide.md +300 -0
- package/skills/building-omnistudio-callable-apex/CREDITS.md +9 -0
- package/skills/building-omnistudio-callable-apex/README.md +80 -0
- package/skills/building-omnistudio-callable-apex/SKILL.md +276 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_callable_openinterface.cls +40 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_callable_vanilla.cls +32 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_migration.cls +54 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_openinterface.cls +45 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_test_class.cls +65 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/IndustriesCallableException.cls +7 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallable.cls +115 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallableTest.cls +189 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/TRANSCRIPT.md +115 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/IndustriesCallableException.cls +7 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallable.cls +74 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallableTest.cls +146 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomRemoteClass.cls +16 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/TRANSCRIPT.md +120 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/IndustriesCallableException.cls +7 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallable.cls +73 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallableTest.cls +128 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomVlocityOpenInterface2.cls +23 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/TRANSCRIPT.md +75 -0
- package/skills/building-omnistudio-datamapper/CREDITS.md +5 -0
- package/skills/building-omnistudio-datamapper/SKILL.md +270 -0
- package/skills/building-omnistudio-datamapper/assets/completion-summary-template.md +28 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-extract.json +6 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-item.json +12 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-load.json +6 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-transform.json +6 -0
- package/skills/building-omnistudio-datamapper/references/best-practices.md +277 -0
- package/skills/building-omnistudio-datamapper/references/naming-conventions.md +145 -0
- package/skills/building-omnistudio-flexcard/CREDITS.md +5 -0
- package/skills/building-omnistudio-flexcard/SKILL.md +325 -0
- package/skills/building-omnistudio-flexcard/assets/omni-ui-card.json +10 -0
- package/skills/building-omnistudio-flexcard/references/best-practices.md +291 -0
- package/skills/building-omnistudio-flexcard/references/data-binding-guide.md +311 -0
- package/skills/building-omnistudio-flexcard/references/scoring-rubric.md +66 -0
- package/skills/building-omnistudio-flexcard/scripts/flexcard-commands.sh +24 -0
- package/skills/building-omnistudio-integration-procedure/CREDITS.md +5 -0
- package/skills/building-omnistudio-integration-procedure/SKILL.md +275 -0
- package/skills/building-omnistudio-integration-procedure/assets/omni-process-element-dr-extract.json +10 -0
- package/skills/building-omnistudio-integration-procedure/assets/omni-process-element-set-values.json +10 -0
- package/skills/building-omnistudio-integration-procedure/assets/omni-process-ip.json +12 -0
- package/skills/building-omnistudio-integration-procedure/assets/scoring-report-format.txt +14 -0
- package/skills/building-omnistudio-integration-procedure/references/best-practices.md +388 -0
- package/skills/building-omnistudio-integration-procedure/references/element-types.md +588 -0
- package/skills/building-omnistudio-integration-procedure/scripts/cli-commands.sh +18 -0
- package/skills/building-omnistudio-omniscript/CREDITS.md +5 -0
- package/skills/building-omnistudio-omniscript/SKILL.md +367 -0
- package/skills/building-omnistudio-omniscript/assets/omni-process-element-step.json +10 -0
- package/skills/building-omnistudio-omniscript/assets/omni-process-element-text-block.json +11 -0
- package/skills/building-omnistudio-omniscript/assets/omni-process-omniscript.json +12 -0
- package/skills/building-omnistudio-omniscript/references/best-practices.md +480 -0
- package/skills/building-omnistudio-omniscript/references/element-types.md +1172 -0
- package/skills/building-omnistudio-omniscript/scripts/check-duplicate-omniscript.sh +13 -0
- package/skills/building-omnistudio-omniscript/scripts/cli-reference.sh +21 -0
- package/skills/building-omnistudio-omniscript/scripts/deploy-omniscript.sh +29 -0
- package/skills/building-sf-integrations/CREDITS.md +5 -0
- package/skills/building-sf-integrations/README.md +95 -0
- package/skills/building-sf-integrations/SKILL.md +192 -0
- package/skills/building-sf-integrations/assets/callouts/callout-retry-handler.cls +167 -0
- package/skills/building-sf-integrations/assets/callouts/http-response-handler.cls +257 -0
- package/skills/building-sf-integrations/assets/callouts/rest-queueable-callout.cls +262 -0
- package/skills/building-sf-integrations/assets/callouts/rest-sync-callout.cls +211 -0
- package/skills/building-sf-integrations/assets/cdc/cdc-handler.cls +246 -0
- package/skills/building-sf-integrations/assets/cdc/cdc-subscriber-trigger.trigger +139 -0
- package/skills/building-sf-integrations/assets/endpoint-security/example.cspTrustedSite-meta.xml +58 -0
- package/skills/building-sf-integrations/assets/endpoint-security/example.remoteSite-meta.xml +39 -0
- package/skills/building-sf-integrations/assets/external-credentials/jwt-external-credential.externalCredential-meta.xml +90 -0
- package/skills/building-sf-integrations/assets/external-credentials/oauth-external-credential.externalCredential-meta.xml +87 -0
- package/skills/building-sf-integrations/assets/external-services/external-service-operations.md +221 -0
- package/skills/building-sf-integrations/assets/external-services/openapi-registration.externalServiceRegistration-meta.xml +193 -0
- package/skills/building-sf-integrations/assets/named-credentials/certificate-auth.namedCredential-meta.xml +62 -0
- package/skills/building-sf-integrations/assets/named-credentials/custom-auth.namedCredential-meta.xml +71 -0
- package/skills/building-sf-integrations/assets/named-credentials/oauth-client-credentials.namedCredential-meta.xml +51 -0
- package/skills/building-sf-integrations/assets/named-credentials/oauth-jwt-bearer.namedCredential-meta.xml +67 -0
- package/skills/building-sf-integrations/assets/platform-events/event-publisher.cls +191 -0
- package/skills/building-sf-integrations/assets/platform-events/event-subscriber-action.cls +295 -0
- package/skills/building-sf-integrations/assets/platform-events/event-subscriber-trigger.trigger +108 -0
- package/skills/building-sf-integrations/assets/platform-events/platform-event-definition.object-meta.xml +124 -0
- package/skills/building-sf-integrations/assets/soap/soap-callout-service.cls +186 -0
- package/skills/building-sf-integrations/assets/soap/wsdl2apex-guide.md +213 -0
- package/skills/building-sf-integrations/hooks/scripts/suggest_credential_setup.py +271 -0
- package/skills/building-sf-integrations/hooks/scripts/validate_integration.py +363 -0
- package/skills/building-sf-integrations/references/callout-patterns.md +719 -0
- package/skills/building-sf-integrations/references/cdc-guide.md +288 -0
- package/skills/building-sf-integrations/references/cli-reference.md +94 -0
- package/skills/building-sf-integrations/references/event-driven-architecture-guide.md +266 -0
- package/skills/building-sf-integrations/references/event-patterns.md +838 -0
- package/skills/building-sf-integrations/references/external-services-guide.md +303 -0
- package/skills/building-sf-integrations/references/messaging-api-v2.md +609 -0
- package/skills/building-sf-integrations/references/named-credentials-automation.md +201 -0
- package/skills/building-sf-integrations/references/named-credentials-guide.md +173 -0
- package/skills/building-sf-integrations/references/platform-events-guide.md +288 -0
- package/skills/building-sf-integrations/references/rest-callout-patterns.md +288 -0
- package/skills/building-sf-integrations/references/scoring-rubric.md +59 -0
- package/skills/building-sf-integrations/references/security-best-practices.md +248 -0
- package/skills/building-sf-integrations/scripts/README.md +100 -0
- package/skills/building-sf-integrations/scripts/configure-named-credential.sh +236 -0
- package/skills/building-sf-integrations/scripts/set-api-credential.sh +146 -0
- package/skills/building-sf-integrations/scripts/templates/setup-credentials-with-csp.sh +158 -0
- package/skills/configuring-connected-apps/CREDITS.md +3 -0
- package/skills/configuring-connected-apps/README.md +99 -0
- package/skills/configuring-connected-apps/SKILL.md +224 -0
- package/skills/configuring-connected-apps/assets/connected-app-basic.xml +29 -0
- package/skills/configuring-connected-apps/assets/connected-app-canvas.xml +62 -0
- package/skills/configuring-connected-apps/assets/connected-app-jwt.xml +49 -0
- package/skills/configuring-connected-apps/assets/connected-app-oauth.xml +65 -0
- package/skills/configuring-connected-apps/assets/eca-global-oauth.xml +36 -0
- package/skills/configuring-connected-apps/assets/eca-oauth-settings.xml +36 -0
- package/skills/configuring-connected-apps/assets/eca-policies.xml +36 -0
- package/skills/configuring-connected-apps/assets/external-client-app.xml +35 -0
- package/skills/configuring-connected-apps/references/example-usage.md +256 -0
- package/skills/configuring-connected-apps/references/migration-guide.md +328 -0
- package/skills/configuring-connected-apps/references/oauth-flows-reference.md +660 -0
- package/skills/configuring-connected-apps/references/security-checklist.md +209 -0
- package/skills/configuring-connected-apps/references/testing-validation-guide.md +275 -0
- package/skills/connecting-datacloud/CREDITS.md +5 -0
- package/skills/connecting-datacloud/README.md +59 -0
- package/skills/connecting-datacloud/SKILL.md +155 -0
- package/skills/connecting-datacloud/examples/connections/heroku-postgres.json +15 -0
- package/skills/connecting-datacloud/examples/connections/ingest-api-connection.json +5 -0
- package/skills/connecting-datacloud/examples/connections/ingest-api-schema.json +31 -0
- package/skills/connecting-datacloud/examples/connections/redshift.json +16 -0
- package/skills/connecting-datacloud/examples/connections/sharepoint-unstructured.json +20 -0
- package/skills/connecting-datacloud/examples/connections/snowflake-connection.json +42 -0
- package/skills/debugging-apex-logs/CREDITS.md +22 -0
- package/skills/debugging-apex-logs/README.md +74 -0
- package/skills/debugging-apex-logs/SKILL.md +172 -0
- package/skills/debugging-apex-logs/assets/benchmarking-template.cls +327 -0
- package/skills/debugging-apex-logs/assets/cpu-heap-optimization.cls +307 -0
- package/skills/debugging-apex-logs/assets/dml-in-loop-fix.cls +219 -0
- package/skills/debugging-apex-logs/assets/null-pointer-fix.cls +252 -0
- package/skills/debugging-apex-logs/assets/soql-in-loop-fix.cls +157 -0
- package/skills/debugging-apex-logs/references/analysis-playbook.md +53 -0
- package/skills/debugging-apex-logs/references/benchmarking-guide.md +287 -0
- package/skills/debugging-apex-logs/references/cli-commands.md +368 -0
- package/skills/debugging-apex-logs/references/common-issues.md +68 -0
- package/skills/debugging-apex-logs/references/debug-log-reference.md +328 -0
- package/skills/debugging-apex-logs/references/log-analysis-tools.md +248 -0
- package/skills/debugging-apex-logs/references/scoring-rubric.md +21 -0
- package/skills/deploying-metadata/CREDITS.md +25 -0
- package/skills/deploying-metadata/README.md +104 -0
- package/skills/deploying-metadata/SKILL.md +214 -0
- package/skills/deploying-metadata/assets/destructiveChanges.xml +143 -0
- package/skills/deploying-metadata/assets/package.xml +121 -0
- package/skills/deploying-metadata/references/agent-deployment-guide.md +628 -0
- package/skills/deploying-metadata/references/deploy.sh +73 -0
- package/skills/deploying-metadata/references/deployment-report-template.md +89 -0
- package/skills/deploying-metadata/references/deployment-workflows.md +395 -0
- package/skills/deploying-metadata/references/orchestration.md +183 -0
- package/skills/deploying-metadata/references/trigger-deployment-safety.md +376 -0
- package/skills/deploying-omnistudio-datapacks/CREDITS.md +5 -0
- package/skills/deploying-omnistudio-datapacks/README.md +88 -0
- package/skills/deploying-omnistudio-datapacks/SKILL.md +174 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle/TRANSCRIPT.md +124 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle/deploy-business-internet-plus-bundle.yaml +11 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle-deploy/TRANSCRIPT.md +142 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle-deploy/deploy-business-internet-plus-bundle.yaml +10 -0
- package/skills/deploying-omnistudio-datapacks/references/job-file-template.md +42 -0
- package/skills/deploying-omnistudio-datapacks/references/troubleshooting-matrix.md +24 -0
- package/skills/developing-agentforce/assets/metadata/http-callout-flow.flow-meta.xml +1 -1
- package/skills/developing-agentforce/references/actions-reference.md +8 -8
- package/skills/fetching-salesforce-docs/README.md +66 -0
- package/skills/fetching-salesforce-docs/SKILL.md +209 -0
- package/skills/fetching-salesforce-docs/requirements.txt +2 -0
- package/skills/fetching-salesforce-docs/scripts/extract_help_salesforce.py +497 -0
- package/skills/fetching-salesforce-docs/scripts/extract_salesforce_doc.py +357 -0
- package/skills/fetching-salesforce-docs/scripts/runtime_bootstrap.py +58 -0
- package/skills/generating-apex/CREDITS.md +1 -26
- package/skills/generating-apex-test/CREDITS.md +2 -27
- package/skills/generating-lwc-components/CREDITS.md +5 -0
- package/skills/generating-lwc-components/README.md +126 -0
- package/skills/generating-lwc-components/SKILL.md +191 -0
- package/skills/generating-lwc-components/assets/apex-controller/LwcController.cls +327 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.css +72 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.html +111 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.js +163 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.js-meta.xml +137 -0
- package/skills/generating-lwc-components/assets/datatable-component/datatableComponent.html +111 -0
- package/skills/generating-lwc-components/assets/datatable-component/datatableComponent.js +367 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.css +63 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.html +154 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.js +348 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.js-meta.xml +87 -0
- package/skills/generating-lwc-components/assets/form-component/formComponent.html +165 -0
- package/skills/generating-lwc-components/assets/form-component/formComponent.js +275 -0
- package/skills/generating-lwc-components/assets/graphql-component/graphqlComponent.html +100 -0
- package/skills/generating-lwc-components/assets/graphql-component/graphqlComponent.js +336 -0
- package/skills/generating-lwc-components/assets/jest-test/componentName.test.js.example +371 -0
- package/skills/generating-lwc-components/assets/message-channel/RecordSelected.messageChannel-meta.xml +71 -0
- package/skills/generating-lwc-components/assets/message-channel/lmsPublisher.js +103 -0
- package/skills/generating-lwc-components/assets/message-channel/lmsSubscriber.js +181 -0
- package/skills/generating-lwc-components/assets/modal-component/modalComponent.html +85 -0
- package/skills/generating-lwc-components/assets/modal-component/modalComponent.js +199 -0
- package/skills/generating-lwc-components/assets/record-picker/recordPicker.html +55 -0
- package/skills/generating-lwc-components/assets/record-picker/recordPicker.js +199 -0
- package/skills/generating-lwc-components/assets/state-store/store.js +282 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.css +65 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.html +95 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.js-meta.xml +75 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.test.ts.example +301 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.ts +295 -0
- package/skills/generating-lwc-components/assets/workspace-api/workspaceComponent.html +71 -0
- package/skills/generating-lwc-components/assets/workspace-api/workspaceComponent.js +316 -0
- package/skills/generating-lwc-components/hooks/scripts/lwc-lsp-validate.py +295 -0
- package/skills/generating-lwc-components/hooks/scripts/post-tool-validate.py +347 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_data/deprecated_patterns.json +74 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_data/styling_hooks.json +111 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_data/valid_slds_classes.json +127 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_linter_wrapper.py +294 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_rules/__init__.py +22 -0
- package/skills/generating-lwc-components/hooks/scripts/template_validator.py +332 -0
- package/skills/generating-lwc-components/hooks/scripts/validate_slds.py +595 -0
- package/skills/generating-lwc-components/references/accessibility-guide.md +843 -0
- package/skills/generating-lwc-components/references/advanced-features.md +108 -0
- package/skills/generating-lwc-components/references/async-notification-patterns.md +661 -0
- package/skills/generating-lwc-components/references/cli-commands.md +545 -0
- package/skills/generating-lwc-components/references/component-patterns.md +1476 -0
- package/skills/generating-lwc-components/references/flow-integration-guide.md +675 -0
- package/skills/generating-lwc-components/references/jest-testing.md +1011 -0
- package/skills/generating-lwc-components/references/lms-guide.md +860 -0
- package/skills/generating-lwc-components/references/lwc-best-practices.md +1310 -0
- package/skills/generating-lwc-components/references/performance-guide.md +861 -0
- package/skills/generating-lwc-components/references/scoring-and-testing.md +116 -0
- package/skills/generating-lwc-components/references/slds-blueprints.json +14389 -0
- package/skills/generating-lwc-components/references/slds-design-guide.md +166 -0
- package/skills/generating-lwc-components/references/state-management.md +642 -0
- package/skills/generating-lwc-components/references/template-anti-patterns.md +948 -0
- package/skills/generating-lwc-components/references/triangle-pattern.md +365 -0
- package/skills/generating-lwc-components/scripts/local-dev-preview.sh +34 -0
- package/skills/generating-mermaid-diagrams/CREDITS.md +46 -0
- package/skills/generating-mermaid-diagrams/README.md +114 -0
- package/skills/generating-mermaid-diagrams/SKILL.md +218 -0
- package/skills/generating-mermaid-diagrams/assets/agentforce/agent-flow.md +313 -0
- package/skills/generating-mermaid-diagrams/assets/architecture/system-landscape.md +351 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/b2b-commerce-erd.md +317 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/campaigns-erd.md +195 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/consent-erd.md +262 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/files-erd.md +266 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/forecasting-erd.md +261 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/fsl-erd.md +332 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/party-model-erd.md +237 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/quote-order-erd.md +277 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/revenue-cloud-erd.md +343 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/sales-cloud-erd.md +192 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/salesforce-erd.md +209 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/scheduler-erd.md +276 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/service-cloud-erd.md +217 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/territory-management-erd.md +241 -0
- package/skills/generating-mermaid-diagrams/assets/integration/api-sequence.md +387 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/authorization-code-pkce.md +197 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/authorization-code.md +152 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/client-credentials.md +233 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/device-authorization.md +295 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/jwt-bearer.md +256 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/refresh-token.md +281 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/user-agent-social-sign-on.md +281 -0
- package/skills/generating-mermaid-diagrams/assets/role-hierarchy/user-hierarchy.md +322 -0
- package/skills/generating-mermaid-diagrams/references/color-palette.md +464 -0
- package/skills/generating-mermaid-diagrams/references/diagram-conventions.md +313 -0
- package/skills/generating-mermaid-diagrams/references/erd-conventions.md +320 -0
- package/skills/generating-mermaid-diagrams/references/mermaid-reference.md +434 -0
- package/skills/generating-mermaid-diagrams/references/mermaid-styling.md +81 -0
- package/skills/generating-mermaid-diagrams/references/preview-guide.md +49 -0
- package/skills/generating-mermaid-diagrams/references/usage-examples.md +340 -0
- package/skills/generating-mermaid-diagrams/scripts/README.md +160 -0
- package/skills/generating-mermaid-diagrams/scripts/mermaid_preview.py +654 -0
- package/skills/generating-mermaid-diagrams/scripts/query-org-metadata.py +293 -0
- package/skills/generating-visual-diagrams/CREDITS.md +80 -0
- package/skills/generating-visual-diagrams/README.md +83 -0
- package/skills/generating-visual-diagrams/SKILL.md +208 -0
- package/skills/generating-visual-diagrams/assets/architecture/integration-flow.md +55 -0
- package/skills/generating-visual-diagrams/assets/erd/core-objects.md +131 -0
- package/skills/generating-visual-diagrams/assets/erd/custom-objects.md +60 -0
- package/skills/generating-visual-diagrams/assets/lwc/dashboard-card.md +45 -0
- package/skills/generating-visual-diagrams/assets/lwc/data-table.md +57 -0
- package/skills/generating-visual-diagrams/assets/lwc/record-form.md +60 -0
- package/skills/generating-visual-diagrams/assets/review/apex-review.md +57 -0
- package/skills/generating-visual-diagrams/assets/review/lwc-review.md +48 -0
- package/skills/generating-visual-diagrams/references/architect-aesthetic-guide.md +257 -0
- package/skills/generating-visual-diagrams/references/examples-index.md +35 -0
- package/skills/generating-visual-diagrams/references/gemini-cli-setup.md +65 -0
- package/skills/generating-visual-diagrams/references/interview-questions.md +529 -0
- package/skills/generating-visual-diagrams/references/iteration-workflow.md +173 -0
- package/skills/generating-visual-diagrams/scripts/check-prerequisites.sh +101 -0
- package/skills/generating-visual-diagrams/scripts/generate_image.py +243 -0
- package/skills/handling-sf-data/CREDITS.md +5 -0
- package/skills/handling-sf-data/README.md +112 -0
- package/skills/handling-sf-data/SKILL.md +235 -0
- package/skills/handling-sf-data/assets/bulk/bulk-insert-10000.apex +293 -0
- package/skills/handling-sf-data/assets/bulk/bulk-insert-200.apex +208 -0
- package/skills/handling-sf-data/assets/bulk/bulk-insert-500.apex +219 -0
- package/skills/handling-sf-data/assets/bulk/bulk-upsert-external-id.apex +324 -0
- package/skills/handling-sf-data/assets/cleanup/delete-by-created-date.apex +319 -0
- package/skills/handling-sf-data/assets/cleanup/delete-by-name.apex +240 -0
- package/skills/handling-sf-data/assets/cleanup/delete-test-data.apex +311 -0
- package/skills/handling-sf-data/assets/cleanup/rollback-transaction.apex +266 -0
- package/skills/handling-sf-data/assets/csv/account-import.csv +11 -0
- package/skills/handling-sf-data/assets/csv/contact-import.csv +11 -0
- package/skills/handling-sf-data/assets/csv/custom-object-import.csv +11 -0
- package/skills/handling-sf-data/assets/csv/opportunity-import.csv +11 -0
- package/skills/handling-sf-data/assets/factories/account-factory.apex +165 -0
- package/skills/handling-sf-data/assets/factories/case-factory.apex +237 -0
- package/skills/handling-sf-data/assets/factories/contact-factory.apex +168 -0
- package/skills/handling-sf-data/assets/factories/custom-object-factory.apex +260 -0
- package/skills/handling-sf-data/assets/factories/event-factory.apex +275 -0
- package/skills/handling-sf-data/assets/factories/hierarchy-factory.apex +372 -0
- package/skills/handling-sf-data/assets/factories/lead-factory.apex +190 -0
- package/skills/handling-sf-data/assets/factories/opportunity-factory.apex +206 -0
- package/skills/handling-sf-data/assets/factories/task-factory.apex +246 -0
- package/skills/handling-sf-data/assets/factories/user-factory.apex +278 -0
- package/skills/handling-sf-data/assets/json/account-contact-tree.json +130 -0
- package/skills/handling-sf-data/assets/json/account-opportunity-tree.json +110 -0
- package/skills/handling-sf-data/assets/json/full-hierarchy-tree.json +188 -0
- package/skills/handling-sf-data/assets/soql/aggregate.soql +226 -0
- package/skills/handling-sf-data/assets/soql/child-to-parent.soql +162 -0
- package/skills/handling-sf-data/assets/soql/parent-to-child.soql +153 -0
- package/skills/handling-sf-data/assets/soql/polymorphic.soql +198 -0
- package/skills/handling-sf-data/assets/soql/subquery.soql +287 -0
- package/skills/handling-sf-data/references/anonymous-apex-guide.md +98 -0
- package/skills/handling-sf-data/references/bulk-operations-guide.md +94 -0
- package/skills/handling-sf-data/references/bulk-testing-example.md +194 -0
- package/skills/handling-sf-data/references/cleanup-rollback-example.md +322 -0
- package/skills/handling-sf-data/references/cleanup-rollback-guide.md +84 -0
- package/skills/handling-sf-data/references/crud-workflow-example.md +183 -0
- package/skills/handling-sf-data/references/governor-limits-reference.md +74 -0
- package/skills/handling-sf-data/references/orchestration.md +174 -0
- package/skills/handling-sf-data/references/relationship-query-examples.md +249 -0
- package/skills/handling-sf-data/references/sf-cli-data-commands.md +158 -0
- package/skills/handling-sf-data/references/soql-relationship-guide.md +84 -0
- package/skills/handling-sf-data/references/test-data-best-practices.md +104 -0
- package/skills/handling-sf-data/references/test-data-factory-usage.md +290 -0
- package/skills/handling-sf-data/references/test-data-patterns.md +98 -0
- package/skills/handling-sf-data/scripts/soql_validator.py +292 -0
- package/skills/handling-sf-data/scripts/validate_data_operation.py +379 -0
- package/skills/harmonizing-datacloud/CREDITS.md +3 -0
- package/skills/harmonizing-datacloud/README.md +31 -0
- package/skills/harmonizing-datacloud/SKILL.md +117 -0
- package/skills/modeling-omnistudio-epc-catalog/CREDITS.md +14 -0
- package/skills/modeling-omnistudio-epc-catalog/README.md +89 -0
- package/skills/modeling-omnistudio-epc-catalog/SKILL.md +395 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/attribute-assignment-template.json +402 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/compiled-attribute-overrides-template.json +43 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/completion-block-template.txt +8 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/decomposition-relationships-template.json +233 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_AttributeAssignments.json +514 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_CompiledAttributeOverrides.json +21 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DataPack.json +649 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DecompositionRelationships.json +200 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ObjectFieldAttributes.json +138 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OrchestrationScenarios.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OverrideDefinitions.json +266 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ParentKeys.json +23 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PriceListEntries.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ProductChildItems.json +34 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_RuleAssignments.json +21 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_AttributeAssignments.json +410 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DataPack.json +535 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DecompositionRelationships.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ObjectFieldAttributes.json +138 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_OrchestrationScenarios.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ParentKeys.json +23 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PriceListEntries.json +220 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ProductChildItems.json +414 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_AttributeAssignments.json +382 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DataPack.json +565 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DecompositionRelationships.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ObjectFieldAttributes.json +104 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_OrchestrationScenarios.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ParentKeys.json +13 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PriceListEntries.json +106 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ProductChildItems.json +72 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_AttributeAssignments.json +142 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_DataPack.json +377 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_DecompositionRelationships.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ObjectFieldAttributes.json +36 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ParentKeys.json +8 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_PriceListEntries.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ProductChildItems.json +34 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/object-field-attributes-template.json +138 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/orchestration-scenarios-template.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/override-definitions-template.json +134 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/parent-keys-template.json +29 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/price-list-entries-template.json +158 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/pricebook-entries-template.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/product-child-item-template.json +338 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/product2-offer-template.json +527 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/.gitkeep +1 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_AttributeAssignments.json +95 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_CompiledAttributeOverrides.json +1 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_DataPack.json +214 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_DecompositionRelationships.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ObjectFieldAttributes.json +98 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_OrchestrationScenarios.json +22 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_OverrideDefinitions.json +1 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ParentKeys.json +13 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_PriceListEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_PricebookEntries.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ProductChildItems.json +110 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/TRANSCRIPT.md +58 -0
- package/skills/modeling-omnistudio-epc-catalog/references/epc-field-guide.md +90 -0
- package/skills/modeling-omnistudio-epc-catalog/references/naming-conventions.md +80 -0
- package/skills/modeling-omnistudio-epc-catalog/references/scoring-model.md +57 -0
- package/skills/modeling-omnistudio-epc-catalog/scripts/cli-validation-commands.sh +19 -0
- package/skills/modeling-omnistudio-epc-catalog/scripts/sample-invocations.sh +18 -0
- package/skills/orchestrating-datacloud/CREDITS.md +15 -0
- package/skills/orchestrating-datacloud/README.md +129 -0
- package/skills/orchestrating-datacloud/SKILL.md +236 -0
- package/skills/orchestrating-datacloud/UPSTREAM.md +45 -0
- package/skills/orchestrating-datacloud/assets/definitions/activation-target.template.json +5 -0
- package/skills/orchestrating-datacloud/assets/definitions/activation.template.json +7 -0
- package/skills/orchestrating-datacloud/assets/definitions/calculated-insight.template.json +7 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-action-target.template.json +5 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-action.template.json +5 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-graph.template.json +21 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-stream.template.json +55 -0
- package/skills/orchestrating-datacloud/assets/definitions/dmo.template.json +17 -0
- package/skills/orchestrating-datacloud/assets/definitions/identity-resolution.template.json +30 -0
- package/skills/orchestrating-datacloud/assets/definitions/mapping.template.json +14 -0
- package/skills/orchestrating-datacloud/assets/definitions/relationship.template.json +12 -0
- package/skills/orchestrating-datacloud/assets/definitions/search-index.template.json +9 -0
- package/skills/orchestrating-datacloud/assets/definitions/segment.template.json +16 -0
- package/skills/orchestrating-datacloud/references/feature-readiness.md +157 -0
- package/skills/orchestrating-datacloud/references/plugin-setup.md +140 -0
- package/skills/orchestrating-datacloud/scripts/bootstrap-plugin.sh +53 -0
- package/skills/orchestrating-datacloud/scripts/diagnose-org.mjs +511 -0
- package/skills/orchestrating-datacloud/scripts/generate-manifest.mjs +68 -0
- package/skills/orchestrating-datacloud/scripts/verify-plugin.sh +58 -0
- package/skills/preparing-datacloud/CREDITS.md +7 -0
- package/skills/preparing-datacloud/README.md +51 -0
- package/skills/preparing-datacloud/SKILL.md +191 -0
- package/skills/preparing-datacloud/examples/ingestion-api/.env.example +8 -0
- package/skills/preparing-datacloud/examples/ingestion-api/README.md +48 -0
- package/skills/preparing-datacloud/examples/ingestion-api/send-data.py +144 -0
- package/skills/querying-soql/CREDITS.md +21 -0
- package/skills/querying-soql/README.md +41 -0
- package/skills/querying-soql/SKILL.md +143 -0
- package/skills/querying-soql/assets/aggregate-queries.soql +242 -0
- package/skills/querying-soql/assets/basic-queries.soql +188 -0
- package/skills/querying-soql/assets/bulkified-query-pattern.cls +280 -0
- package/skills/querying-soql/assets/optimization-patterns.soql +259 -0
- package/skills/querying-soql/assets/relationship-queries.soql +203 -0
- package/skills/querying-soql/assets/selector-class.cls +219 -0
- package/skills/querying-soql/references/anti-patterns.md +348 -0
- package/skills/querying-soql/references/cli-commands.md +358 -0
- package/skills/querying-soql/references/field-coverage-rules.md +514 -0
- package/skills/querying-soql/references/query-optimization.md +142 -0
- package/skills/querying-soql/references/selector-patterns.md +479 -0
- package/skills/querying-soql/references/soql-reference.md +227 -0
- package/skills/querying-soql/references/soql-syntax-reference.md +208 -0
- package/skills/querying-soql/scripts/post-tool-validate.py +322 -0
- package/skills/retrieving-datacloud/CREDITS.md +7 -0
- package/skills/retrieving-datacloud/README.md +44 -0
- package/skills/retrieving-datacloud/SKILL.md +120 -0
- package/skills/retrieving-datacloud/examples/search-indexes/hybrid-structured.json +44 -0
- package/skills/retrieving-datacloud/examples/search-indexes/vector-knowledge.json +43 -0
- package/skills/running-apex-tests/CREDITS.md +22 -0
- package/skills/running-apex-tests/README.md +94 -0
- package/skills/running-apex-tests/SKILL.md +158 -0
- package/skills/running-apex-tests/assets/basic-test.cls +169 -0
- package/skills/running-apex-tests/assets/bulk-test.cls +255 -0
- package/skills/running-apex-tests/assets/dml-mock.cls +339 -0
- package/skills/running-apex-tests/assets/mock-callout-test.cls +353 -0
- package/skills/running-apex-tests/assets/stub-provider-example.cls +364 -0
- package/skills/running-apex-tests/assets/test-data-factory.cls +328 -0
- package/skills/running-apex-tests/hooks/scripts/parse-test-results.py +364 -0
- package/skills/running-apex-tests/references/cli-commands.md +289 -0
- package/skills/running-apex-tests/references/mocking-patterns.md +500 -0
- package/skills/running-apex-tests/references/performance-optimization.md +283 -0
- package/skills/running-apex-tests/references/test-fix-loop.md +49 -0
- package/skills/running-apex-tests/references/test-patterns.md +154 -0
- package/skills/running-apex-tests/references/testing-best-practices.md +509 -0
- package/skills/segmenting-datacloud/CREDITS.md +3 -0
- package/skills/segmenting-datacloud/README.md +36 -0
- package/skills/segmenting-datacloud/SKILL.md +115 -0
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
<!-- Parent: querying-soql/SKILL.md -->
|
|
2
|
+
# Selector Patterns: Query Abstraction in Vanilla Apex
|
|
3
|
+
|
|
4
|
+
This guide teaches query abstraction patterns using pure Apex — no external libraries required. These patterns improve testability, maintainability, and security compliance.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Why Use a Selector Layer?
|
|
9
|
+
|
|
10
|
+
### The Problem
|
|
11
|
+
|
|
12
|
+
Without abstraction, SOQL queries are scattered everywhere:
|
|
13
|
+
|
|
14
|
+
```apex
|
|
15
|
+
// In TriggerHandler.cls
|
|
16
|
+
List<Account> accounts = [SELECT Id, Name FROM Account WHERE Id IN :accountIds];
|
|
17
|
+
|
|
18
|
+
// In BatchJob.cls (duplicate!)
|
|
19
|
+
List<Account> accounts = [SELECT Id, Name FROM Account WHERE Id IN :ids];
|
|
20
|
+
|
|
21
|
+
// In ServiceClass.cls (slightly different fields!)
|
|
22
|
+
List<Account> accounts = [SELECT Id, Name, Industry FROM Account WHERE Id IN :accountIds];
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Problems**:
|
|
26
|
+
1. **Duplication**: Same query logic repeated
|
|
27
|
+
2. **Inconsistency**: Different fields queried in different places
|
|
28
|
+
3. **Fragility**: Field deletion breaks multiple classes
|
|
29
|
+
4. **Testability**: Must create real records to test
|
|
30
|
+
5. **Security**: FLS/sharing often forgotten
|
|
31
|
+
|
|
32
|
+
### The Solution
|
|
33
|
+
|
|
34
|
+
Centralize queries in Selector classes:
|
|
35
|
+
|
|
36
|
+
```apex
|
|
37
|
+
// Single source of truth
|
|
38
|
+
public class AccountSelector {
|
|
39
|
+
public static List<Account> byIds(Set<Id> accountIds) {
|
|
40
|
+
return [
|
|
41
|
+
SELECT Id, Name, Industry
|
|
42
|
+
FROM Account
|
|
43
|
+
WHERE Id IN :accountIds
|
|
44
|
+
WITH SECURITY_ENFORCED
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Usage everywhere
|
|
50
|
+
List<Account> accounts = AccountSelector.byIds(accountIds);
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Pattern 1: Basic Selector Class
|
|
56
|
+
|
|
57
|
+
The simplest approach - a class with static query methods.
|
|
58
|
+
|
|
59
|
+
```apex
|
|
60
|
+
/**
|
|
61
|
+
* AccountSelector - Centralized queries for Account object
|
|
62
|
+
*/
|
|
63
|
+
public inherited sharing class AccountSelector {
|
|
64
|
+
|
|
65
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
66
|
+
// FIELD SETS (centralized field lists)
|
|
67
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
68
|
+
|
|
69
|
+
private static final List<SObjectField> STANDARD_FIELDS = new List<SObjectField>{
|
|
70
|
+
Account.Id,
|
|
71
|
+
Account.Name,
|
|
72
|
+
Account.Industry,
|
|
73
|
+
Account.AnnualRevenue,
|
|
74
|
+
Account.OwnerId
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
78
|
+
// QUERY METHODS
|
|
79
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Query accounts by their IDs
|
|
83
|
+
*/
|
|
84
|
+
public static List<Account> byIds(Set<Id> accountIds) {
|
|
85
|
+
if (accountIds == null || accountIds.isEmpty()) {
|
|
86
|
+
return new List<Account>();
|
|
87
|
+
}
|
|
88
|
+
return [
|
|
89
|
+
SELECT Id, Name, Industry, AnnualRevenue, OwnerId
|
|
90
|
+
FROM Account
|
|
91
|
+
WHERE Id IN :accountIds
|
|
92
|
+
WITH SECURITY_ENFORCED
|
|
93
|
+
];
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Query accounts by Owner
|
|
98
|
+
*/
|
|
99
|
+
public static List<Account> byOwnerId(Id ownerId) {
|
|
100
|
+
return [
|
|
101
|
+
SELECT Id, Name, Industry, AnnualRevenue, OwnerId
|
|
102
|
+
FROM Account
|
|
103
|
+
WHERE OwnerId = :ownerId
|
|
104
|
+
WITH SECURITY_ENFORCED
|
|
105
|
+
LIMIT 1000
|
|
106
|
+
];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Query accounts with their contacts
|
|
111
|
+
*/
|
|
112
|
+
public static List<Account> withContactsByIds(Set<Id> accountIds) {
|
|
113
|
+
return [
|
|
114
|
+
SELECT Id, Name,
|
|
115
|
+
(SELECT Id, FirstName, LastName, Email
|
|
116
|
+
FROM Contacts
|
|
117
|
+
WHERE IsActive__c = true
|
|
118
|
+
LIMIT 50)
|
|
119
|
+
FROM Account
|
|
120
|
+
WHERE Id IN :accountIds
|
|
121
|
+
WITH SECURITY_ENFORCED
|
|
122
|
+
];
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**Usage**:
|
|
128
|
+
```apex
|
|
129
|
+
// Clean, readable, testable
|
|
130
|
+
List<Account> accounts = AccountSelector.byIds(accountIdSet);
|
|
131
|
+
List<Account> myAccounts = AccountSelector.byOwnerId(UserInfo.getUserId());
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Pattern 2: Selector with Sharing Modes
|
|
137
|
+
|
|
138
|
+
Control sharing rules at the selector level.
|
|
139
|
+
|
|
140
|
+
```apex
|
|
141
|
+
/**
|
|
142
|
+
* ContactSelector with sharing mode control
|
|
143
|
+
*/
|
|
144
|
+
public class ContactSelector {
|
|
145
|
+
|
|
146
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
147
|
+
// USER MODE (respects sharing rules - default)
|
|
148
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
149
|
+
|
|
150
|
+
public inherited sharing class UserMode {
|
|
151
|
+
public static List<Contact> byAccountIds(Set<Id> accountIds) {
|
|
152
|
+
return [
|
|
153
|
+
SELECT Id, FirstName, LastName, Email, AccountId
|
|
154
|
+
FROM Contact
|
|
155
|
+
WHERE AccountId IN :accountIds
|
|
156
|
+
WITH USER_MODE
|
|
157
|
+
];
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
162
|
+
// SYSTEM MODE (bypasses sharing - use carefully!)
|
|
163
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
164
|
+
|
|
165
|
+
public without sharing class SystemMode {
|
|
166
|
+
public static List<Contact> byAccountIds(Set<Id> accountIds) {
|
|
167
|
+
return [
|
|
168
|
+
SELECT Id, FirstName, LastName, Email, AccountId
|
|
169
|
+
FROM Contact
|
|
170
|
+
WHERE AccountId IN :accountIds
|
|
171
|
+
WITH SYSTEM_MODE
|
|
172
|
+
];
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Usage
|
|
178
|
+
List<Contact> visibleContacts = ContactSelector.UserMode.byAccountIds(ids);
|
|
179
|
+
List<Contact> allContacts = ContactSelector.SystemMode.byAccountIds(ids);
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Pattern 3: Mockable Selector (for Unit Tests)
|
|
185
|
+
|
|
186
|
+
Enable query mocking without database calls.
|
|
187
|
+
|
|
188
|
+
```apex
|
|
189
|
+
/**
|
|
190
|
+
* OpportunitySelector with mocking support
|
|
191
|
+
*/
|
|
192
|
+
public inherited sharing class OpportunitySelector {
|
|
193
|
+
|
|
194
|
+
// Test-visible mock data
|
|
195
|
+
@TestVisible
|
|
196
|
+
private static List<Opportunity> mockData;
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Query opportunities by Account IDs
|
|
200
|
+
* Returns mock data in tests if set
|
|
201
|
+
*/
|
|
202
|
+
public static List<Opportunity> byAccountIds(Set<Id> accountIds) {
|
|
203
|
+
if (Test.isRunningTest() && mockData != null) {
|
|
204
|
+
return mockData;
|
|
205
|
+
}
|
|
206
|
+
return [
|
|
207
|
+
SELECT Id, Name, StageName, Amount, CloseDate, AccountId
|
|
208
|
+
FROM Opportunity
|
|
209
|
+
WHERE AccountId IN :accountIds
|
|
210
|
+
WITH SECURITY_ENFORCED
|
|
211
|
+
];
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Set mock data for testing
|
|
216
|
+
*/
|
|
217
|
+
@TestVisible
|
|
218
|
+
private static void setMockData(List<Opportunity> opportunities) {
|
|
219
|
+
mockData = opportunities;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**Test Usage**:
|
|
225
|
+
```apex
|
|
226
|
+
@IsTest
|
|
227
|
+
private class OpportunitySelectorTest {
|
|
228
|
+
@IsTest
|
|
229
|
+
static void testByAccountIds_returnsMockData() {
|
|
230
|
+
// Arrange - no database records needed!
|
|
231
|
+
List<Opportunity> mockOpps = new List<Opportunity>{
|
|
232
|
+
new Opportunity(Name = 'Test Opp', StageName = 'Prospecting', Amount = 1000)
|
|
233
|
+
};
|
|
234
|
+
OpportunitySelector.setMockData(mockOpps);
|
|
235
|
+
|
|
236
|
+
// Act
|
|
237
|
+
List<Opportunity> result = OpportunitySelector.byAccountIds(new Set<Id>());
|
|
238
|
+
|
|
239
|
+
// Assert
|
|
240
|
+
System.assertEquals(1, result.size());
|
|
241
|
+
System.assertEquals('Test Opp', result[0].Name);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## Pattern 4: Query Builder (Dynamic SOQL)
|
|
249
|
+
|
|
250
|
+
For complex, dynamic queries that vary at runtime.
|
|
251
|
+
|
|
252
|
+
```apex
|
|
253
|
+
/**
|
|
254
|
+
* Dynamic query builder for flexible SOQL construction
|
|
255
|
+
*/
|
|
256
|
+
public inherited sharing class QueryBuilder {
|
|
257
|
+
|
|
258
|
+
private String objectName;
|
|
259
|
+
private Set<String> fields = new Set<String>();
|
|
260
|
+
private List<String> conditions = new List<String>();
|
|
261
|
+
private Map<String, Object> bindings = new Map<String, Object>();
|
|
262
|
+
private String orderByClause;
|
|
263
|
+
private Integer limitCount;
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Constructor
|
|
267
|
+
*/
|
|
268
|
+
public QueryBuilder(String objectName) {
|
|
269
|
+
this.objectName = objectName;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Add fields to select
|
|
274
|
+
*/
|
|
275
|
+
public QueryBuilder selectFields(List<String> fieldList) {
|
|
276
|
+
fields.addAll(fieldList);
|
|
277
|
+
return this;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Add fields using SObjectField tokens (type-safe!)
|
|
282
|
+
*/
|
|
283
|
+
public QueryBuilder selectFields(List<SObjectField> fieldTokens) {
|
|
284
|
+
for (SObjectField token : fieldTokens) {
|
|
285
|
+
fields.add(String.valueOf(token));
|
|
286
|
+
}
|
|
287
|
+
return this;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Add WHERE condition with binding
|
|
292
|
+
*/
|
|
293
|
+
public QueryBuilder whereEquals(String field, Object value) {
|
|
294
|
+
String bindName = 'bind' + bindings.size();
|
|
295
|
+
conditions.add(field + ' = :' + bindName);
|
|
296
|
+
bindings.put(bindName, value);
|
|
297
|
+
return this;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Add WHERE IN condition
|
|
302
|
+
*/
|
|
303
|
+
public QueryBuilder whereIn(String field, Set<Id> ids) {
|
|
304
|
+
String bindName = 'bind' + bindings.size();
|
|
305
|
+
conditions.add(field + ' IN :' + bindName);
|
|
306
|
+
bindings.put(bindName, ids);
|
|
307
|
+
return this;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Add ORDER BY
|
|
312
|
+
*/
|
|
313
|
+
public QueryBuilder orderBy(String field, Boolean ascending) {
|
|
314
|
+
orderByClause = field + (ascending ? ' ASC' : ' DESC');
|
|
315
|
+
return this;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Add LIMIT
|
|
320
|
+
*/
|
|
321
|
+
public QueryBuilder setLimit(Integer count) {
|
|
322
|
+
limitCount = count;
|
|
323
|
+
return this;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Build and execute the query
|
|
328
|
+
*/
|
|
329
|
+
public List<SObject> execute() {
|
|
330
|
+
String query = buildQuery();
|
|
331
|
+
return Database.queryWithBinds(query, bindings, AccessLevel.USER_MODE);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Build query string (for debugging)
|
|
336
|
+
*/
|
|
337
|
+
public String buildQuery() {
|
|
338
|
+
List<String> parts = new List<String>();
|
|
339
|
+
|
|
340
|
+
// SELECT
|
|
341
|
+
if (fields.isEmpty()) {
|
|
342
|
+
fields.add('Id');
|
|
343
|
+
}
|
|
344
|
+
parts.add('SELECT ' + String.join(new List<String>(fields), ', '));
|
|
345
|
+
|
|
346
|
+
// FROM
|
|
347
|
+
parts.add('FROM ' + objectName);
|
|
348
|
+
|
|
349
|
+
// WHERE
|
|
350
|
+
if (!conditions.isEmpty()) {
|
|
351
|
+
parts.add('WHERE ' + String.join(conditions, ' AND '));
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// ORDER BY
|
|
355
|
+
if (orderByClause != null) {
|
|
356
|
+
parts.add('ORDER BY ' + orderByClause);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// LIMIT
|
|
360
|
+
if (limitCount != null) {
|
|
361
|
+
parts.add('LIMIT ' + limitCount);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
return String.join(parts, ' ');
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
**Usage**:
|
|
370
|
+
```apex
|
|
371
|
+
// Fluent API for dynamic queries
|
|
372
|
+
List<SObject> results = new QueryBuilder('Account')
|
|
373
|
+
.selectFields(new List<SObjectField>{Account.Id, Account.Name, Account.Industry})
|
|
374
|
+
.whereEquals('Industry', 'Technology')
|
|
375
|
+
.whereIn('Id', accountIds)
|
|
376
|
+
.orderBy('Name', true)
|
|
377
|
+
.setLimit(100)
|
|
378
|
+
.execute();
|
|
379
|
+
|
|
380
|
+
// Debug the generated query
|
|
381
|
+
System.debug(new QueryBuilder('Account').selectFields(...).buildQuery());
|
|
382
|
+
// "SELECT Id, Name, Industry FROM Account WHERE Industry = :bind0 AND Id IN :bind1 ORDER BY Name ASC LIMIT 100"
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
---
|
|
386
|
+
|
|
387
|
+
## Pattern 5: Bulkified Query Pattern
|
|
388
|
+
|
|
389
|
+
The Map-based lookup pattern for bulk operations.
|
|
390
|
+
|
|
391
|
+
```apex
|
|
392
|
+
/**
|
|
393
|
+
* BulkQueryHelper - Reusable bulk query patterns
|
|
394
|
+
*/
|
|
395
|
+
public inherited sharing class BulkQueryHelper {
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Get Accounts by ID as a Map (O(1) lookup)
|
|
399
|
+
*/
|
|
400
|
+
public static Map<Id, Account> getAccountMapByIds(Set<Id> accountIds) {
|
|
401
|
+
return new Map<Id, Account>([
|
|
402
|
+
SELECT Id, Name, Industry
|
|
403
|
+
FROM Account
|
|
404
|
+
WHERE Id IN :accountIds
|
|
405
|
+
WITH SECURITY_ENFORCED
|
|
406
|
+
]);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Get Contacts grouped by AccountId
|
|
411
|
+
*/
|
|
412
|
+
public static Map<Id, List<Contact>> getContactsByAccountId(Set<Id> accountIds) {
|
|
413
|
+
Map<Id, List<Contact>> contactsByAccount = new Map<Id, List<Contact>>();
|
|
414
|
+
|
|
415
|
+
for (Contact c : [
|
|
416
|
+
SELECT Id, FirstName, LastName, Email, AccountId
|
|
417
|
+
FROM Contact
|
|
418
|
+
WHERE AccountId IN :accountIds
|
|
419
|
+
WITH SECURITY_ENFORCED
|
|
420
|
+
]) {
|
|
421
|
+
if (!contactsByAccount.containsKey(c.AccountId)) {
|
|
422
|
+
contactsByAccount.put(c.AccountId, new List<Contact>());
|
|
423
|
+
}
|
|
424
|
+
contactsByAccount.get(c.AccountId).add(c);
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
return contactsByAccount;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
**Usage in Trigger**:
|
|
433
|
+
```apex
|
|
434
|
+
// ❌ WRONG: Query per record
|
|
435
|
+
for (Opportunity opp : Trigger.new) {
|
|
436
|
+
Account a = [SELECT Name FROM Account WHERE Id = :opp.AccountId];
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// ✅ CORRECT: Bulk query with Map lookup
|
|
440
|
+
Set<Id> accountIds = new Set<Id>();
|
|
441
|
+
for (Opportunity opp : Trigger.new) {
|
|
442
|
+
accountIds.add(opp.AccountId);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
Map<Id, Account> accountMap = BulkQueryHelper.getAccountMapByIds(accountIds);
|
|
446
|
+
|
|
447
|
+
for (Opportunity opp : Trigger.new) {
|
|
448
|
+
Account a = accountMap.get(opp.AccountId);
|
|
449
|
+
if (a != null) {
|
|
450
|
+
// Use account data
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
---
|
|
456
|
+
|
|
457
|
+
## Best Practices Summary
|
|
458
|
+
|
|
459
|
+
| Practice | Benefit |
|
|
460
|
+
|----------|---------|
|
|
461
|
+
| Centralize in Selector classes | One place to update field lists |
|
|
462
|
+
| Use `WITH SECURITY_ENFORCED` | Automatic FLS enforcement |
|
|
463
|
+
| Return empty List, not null | Prevents NullPointerException |
|
|
464
|
+
| Use `inherited sharing` | Respects caller's sharing context |
|
|
465
|
+
| Make fields list a constant | Easy to update across queries |
|
|
466
|
+
| Add null/empty checks | Prevent unnecessary queries |
|
|
467
|
+
| Support mocking in tests | Faster tests, no database dependencies |
|
|
468
|
+
|
|
469
|
+
---
|
|
470
|
+
|
|
471
|
+
## When to Use Each Pattern
|
|
472
|
+
|
|
473
|
+
| Scenario | Pattern |
|
|
474
|
+
|----------|---------|
|
|
475
|
+
| Simple, static queries | Pattern 1: Basic Selector |
|
|
476
|
+
| Need sharing mode control | Pattern 2: Sharing Modes |
|
|
477
|
+
| Heavy unit testing | Pattern 3: Mockable Selector |
|
|
478
|
+
| Dynamic filters at runtime | Pattern 4: Query Builder |
|
|
479
|
+
| Trigger/batch bulk operations | Pattern 5: Bulkified Query |
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
<!-- Parent: querying-soql/SKILL.md -->
|
|
2
|
+
# SOQL Quick Reference
|
|
3
|
+
|
|
4
|
+
## Query Structure
|
|
5
|
+
|
|
6
|
+
```sql
|
|
7
|
+
SELECT fields
|
|
8
|
+
FROM object
|
|
9
|
+
[WHERE conditions]
|
|
10
|
+
[WITH filter]
|
|
11
|
+
[GROUP BY fields]
|
|
12
|
+
[HAVING conditions]
|
|
13
|
+
[ORDER BY fields [ASC|DESC] [NULLS FIRST|LAST]]
|
|
14
|
+
[LIMIT number]
|
|
15
|
+
[OFFSET number]
|
|
16
|
+
[FOR UPDATE]
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Operators
|
|
22
|
+
|
|
23
|
+
### Comparison Operators
|
|
24
|
+
|
|
25
|
+
| Operator | Description | Example |
|
|
26
|
+
|----------|-------------|---------|
|
|
27
|
+
| `=` | Equal | `Name = 'Acme'` |
|
|
28
|
+
| `!=` | Not equal | `Status != 'Closed'` |
|
|
29
|
+
| `<` | Less than | `Amount < 1000` |
|
|
30
|
+
| `<=` | Less than or equal | `Amount <= 1000` |
|
|
31
|
+
| `>` | Greater than | `Amount > 1000` |
|
|
32
|
+
| `>=` | Greater than or equal | `Amount >= 1000` |
|
|
33
|
+
| `LIKE` | Pattern match | `Name LIKE 'Acme%'` |
|
|
34
|
+
| `IN` | In list | `Status IN ('New', 'Open')` |
|
|
35
|
+
| `NOT IN` | Not in list | `Type NOT IN ('Other')` |
|
|
36
|
+
| `INCLUDES` | Multi-select contains | `Skills__c INCLUDES ('Java')` |
|
|
37
|
+
| `EXCLUDES` | Multi-select excludes | `Skills__c EXCLUDES ('Java')` |
|
|
38
|
+
|
|
39
|
+
### Logical Operators
|
|
40
|
+
|
|
41
|
+
| Operator | Description | Example |
|
|
42
|
+
|----------|-------------|---------|
|
|
43
|
+
| `AND` | Both conditions | `A = 1 AND B = 2` |
|
|
44
|
+
| `OR` | Either condition | `A = 1 OR B = 2` |
|
|
45
|
+
| `NOT` | Negate condition | `NOT (A = 1)` |
|
|
46
|
+
|
|
47
|
+
### LIKE Patterns
|
|
48
|
+
|
|
49
|
+
| Pattern | Matches |
|
|
50
|
+
|---------|---------|
|
|
51
|
+
| `'Acme%'` | Starts with "Acme" |
|
|
52
|
+
| `'%Corp'` | Ends with "Corp" |
|
|
53
|
+
| `'%test%'` | Contains "test" |
|
|
54
|
+
| `'A_me'` | "A" + any char + "me" |
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Date Literals
|
|
59
|
+
|
|
60
|
+
### Relative Dates
|
|
61
|
+
|
|
62
|
+
| Literal | Description |
|
|
63
|
+
|---------|-------------|
|
|
64
|
+
| `TODAY` | Current day |
|
|
65
|
+
| `YESTERDAY` | Previous day |
|
|
66
|
+
| `TOMORROW` | Next day |
|
|
67
|
+
| `THIS_WEEK` | Current week (Sun-Sat) |
|
|
68
|
+
| `LAST_WEEK` | Previous week |
|
|
69
|
+
| `NEXT_WEEK` | Next week |
|
|
70
|
+
| `THIS_MONTH` | Current month |
|
|
71
|
+
| `LAST_MONTH` | Previous month |
|
|
72
|
+
| `NEXT_MONTH` | Next month |
|
|
73
|
+
| `THIS_QUARTER` | Current quarter |
|
|
74
|
+
| `LAST_QUARTER` | Previous quarter |
|
|
75
|
+
| `NEXT_QUARTER` | Next quarter |
|
|
76
|
+
| `THIS_YEAR` | Current year |
|
|
77
|
+
| `LAST_YEAR` | Previous year |
|
|
78
|
+
| `NEXT_YEAR` | Next year |
|
|
79
|
+
| `THIS_FISCAL_QUARTER` | Current fiscal quarter |
|
|
80
|
+
| `THIS_FISCAL_YEAR` | Current fiscal year |
|
|
81
|
+
|
|
82
|
+
### N Days/Weeks/Months/Years
|
|
83
|
+
|
|
84
|
+
| Literal | Description |
|
|
85
|
+
|---------|-------------|
|
|
86
|
+
| `LAST_N_DAYS:n` | Last n days |
|
|
87
|
+
| `NEXT_N_DAYS:n` | Next n days |
|
|
88
|
+
| `LAST_N_WEEKS:n` | Last n weeks |
|
|
89
|
+
| `NEXT_N_WEEKS:n` | Next n weeks |
|
|
90
|
+
| `LAST_N_MONTHS:n` | Last n months |
|
|
91
|
+
| `NEXT_N_MONTHS:n` | Next n months |
|
|
92
|
+
| `LAST_N_QUARTERS:n` | Last n quarters |
|
|
93
|
+
| `NEXT_N_QUARTERS:n` | Next n quarters |
|
|
94
|
+
| `LAST_N_YEARS:n` | Last n years |
|
|
95
|
+
| `NEXT_N_YEARS:n` | Next n years |
|
|
96
|
+
|
|
97
|
+
### Specific Dates
|
|
98
|
+
|
|
99
|
+
```sql
|
|
100
|
+
-- Date only
|
|
101
|
+
WHERE CloseDate = 2024-12-31
|
|
102
|
+
|
|
103
|
+
-- DateTime
|
|
104
|
+
WHERE CreatedDate >= 2024-01-01T00:00:00Z
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Aggregate Functions
|
|
110
|
+
|
|
111
|
+
| Function | Description | Example |
|
|
112
|
+
|----------|-------------|---------|
|
|
113
|
+
| `COUNT()` | Count all rows | `SELECT COUNT() FROM Account` |
|
|
114
|
+
| `COUNT(field)` | Count non-null values | `SELECT COUNT(Email) FROM Contact` |
|
|
115
|
+
| `COUNT_DISTINCT(field)` | Count unique values | `SELECT COUNT_DISTINCT(Industry) FROM Account` |
|
|
116
|
+
| `SUM(field)` | Sum of values | `SELECT SUM(Amount) FROM Opportunity` |
|
|
117
|
+
| `AVG(field)` | Average of values | `SELECT AVG(Amount) FROM Opportunity` |
|
|
118
|
+
| `MIN(field)` | Minimum value | `SELECT MIN(Amount) FROM Opportunity` |
|
|
119
|
+
| `MAX(field)` | Maximum value | `SELECT MAX(Amount) FROM Opportunity` |
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Date Functions
|
|
124
|
+
|
|
125
|
+
| Function | Returns | Example |
|
|
126
|
+
|----------|---------|---------|
|
|
127
|
+
| `CALENDAR_YEAR(date)` | Year (e.g., 2024) | `SELECT CALENDAR_YEAR(CloseDate) FROM Opportunity` |
|
|
128
|
+
| `CALENDAR_QUARTER(date)` | Quarter (1-4) | `SELECT CALENDAR_QUARTER(CloseDate) FROM Opportunity` |
|
|
129
|
+
| `CALENDAR_MONTH(date)` | Month (1-12) | `SELECT CALENDAR_MONTH(CloseDate) FROM Opportunity` |
|
|
130
|
+
| `DAY_IN_MONTH(date)` | Day (1-31) | `SELECT DAY_IN_MONTH(CreatedDate) FROM Account` |
|
|
131
|
+
| `DAY_IN_WEEK(date)` | Day (1=Sun, 7=Sat) | `SELECT DAY_IN_WEEK(CreatedDate) FROM Account` |
|
|
132
|
+
| `DAY_IN_YEAR(date)` | Day (1-366) | `SELECT DAY_IN_YEAR(CreatedDate) FROM Account` |
|
|
133
|
+
| `WEEK_IN_MONTH(date)` | Week (1-5) | `SELECT WEEK_IN_MONTH(CreatedDate) FROM Account` |
|
|
134
|
+
| `WEEK_IN_YEAR(date)` | Week (1-53) | `SELECT WEEK_IN_YEAR(CreatedDate) FROM Account` |
|
|
135
|
+
| `HOUR_IN_DAY(date)` | Hour (0-23) | `SELECT HOUR_IN_DAY(CreatedDate) FROM Account` |
|
|
136
|
+
| `FISCAL_YEAR(date)` | Fiscal year | `SELECT FISCAL_YEAR(CloseDate) FROM Opportunity` |
|
|
137
|
+
| `FISCAL_QUARTER(date)` | Fiscal quarter | `SELECT FISCAL_QUARTER(CloseDate) FROM Opportunity` |
|
|
138
|
+
| `FISCAL_MONTH(date)` | Fiscal month | `SELECT FISCAL_MONTH(CloseDate) FROM Opportunity` |
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Relationship Queries
|
|
143
|
+
|
|
144
|
+
### Child-to-Parent (Dot Notation)
|
|
145
|
+
|
|
146
|
+
```sql
|
|
147
|
+
-- Standard objects
|
|
148
|
+
SELECT Contact.Name, Contact.Account.Name FROM Contact
|
|
149
|
+
|
|
150
|
+
-- Custom objects (use __r)
|
|
151
|
+
SELECT Child__c.Name, Child__c.Parent__r.Name FROM Child__c
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Parent-to-Child (Subquery)
|
|
155
|
+
|
|
156
|
+
```sql
|
|
157
|
+
-- Standard objects
|
|
158
|
+
SELECT Id, (SELECT Id FROM Contacts) FROM Account
|
|
159
|
+
|
|
160
|
+
-- Custom objects (use __r)
|
|
161
|
+
SELECT Id, (SELECT Id FROM Children__r) FROM Parent__c
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## WITH Clauses
|
|
167
|
+
|
|
168
|
+
| Clause | Description |
|
|
169
|
+
|--------|-------------|
|
|
170
|
+
| `WITH SECURITY_ENFORCED` | Enforce FLS (throws exception if no access) |
|
|
171
|
+
| `WITH USER_MODE` | Respect sharing and FLS |
|
|
172
|
+
| `WITH SYSTEM_MODE` | Bypass sharing rules |
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Governor Limits
|
|
177
|
+
|
|
178
|
+
| Limit | Synchronous | Asynchronous |
|
|
179
|
+
|-------|-------------|--------------|
|
|
180
|
+
| Total SOQL Queries | 100 | 200 |
|
|
181
|
+
| Records Retrieved | 50,000 | 50,000 |
|
|
182
|
+
| QueryLocator Rows | 10,000,000 | 10,000,000 |
|
|
183
|
+
| OFFSET Maximum | 2,000 | 2,000 |
|
|
184
|
+
| Subqueries | 20 | 20 |
|
|
185
|
+
| Relationship Depth | 5 levels | 5 levels |
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Index Usage
|
|
190
|
+
|
|
191
|
+
### Always Indexed
|
|
192
|
+
|
|
193
|
+
- `Id`
|
|
194
|
+
- `Name`
|
|
195
|
+
- `OwnerId`
|
|
196
|
+
- `CreatedDate`
|
|
197
|
+
- `LastModifiedDate`
|
|
198
|
+
- `RecordTypeId`
|
|
199
|
+
- External ID fields
|
|
200
|
+
- Master-Detail fields
|
|
201
|
+
|
|
202
|
+
### Selective Query Rules
|
|
203
|
+
|
|
204
|
+
- Query is selective if WHERE returns < 10% of first 1M records
|
|
205
|
+
- Or uses an indexed field with < 1M matching records
|
|
206
|
+
- Non-selective queries on large tables fail
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## CLI Commands
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
# Basic query
|
|
214
|
+
sf data query --query "SELECT Id, Name FROM Account LIMIT 10" --target-org my-org
|
|
215
|
+
|
|
216
|
+
# JSON output
|
|
217
|
+
sf data query --query "SELECT Id, Name FROM Account" --target-org my-org --json
|
|
218
|
+
|
|
219
|
+
# CSV output
|
|
220
|
+
sf data query --query "SELECT Id, Name FROM Account" --result-format csv --target-org my-org
|
|
221
|
+
|
|
222
|
+
# Bulk export (for large results, > 2,000 records)
|
|
223
|
+
sf data export bulk --query "SELECT Id, Name FROM Account" --target-org my-org --output-file accounts.csv
|
|
224
|
+
|
|
225
|
+
# Query plan (uses REST API explain endpoint)
|
|
226
|
+
sf api request rest "/query/?explain=SELECT+Id+FROM+Account+WHERE+Name='Test'" --target-org my-org --json
|
|
227
|
+
```
|