@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,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bulkified Query Patterns
|
|
3
|
+
*
|
|
4
|
+
* This file demonstrates the correct patterns for querying related data
|
|
5
|
+
* in bulk operations (triggers, batches, etc.) without hitting governor limits.
|
|
6
|
+
*
|
|
7
|
+
* Key Pattern: Collect IDs first, query once, use Map for O(1) lookups.
|
|
8
|
+
*
|
|
9
|
+
* @see https://www.apexhours.com/bulkification-of-apex-triggers/
|
|
10
|
+
* @see https://medium.com/@saurabh.samirs/salesforce-apex-triggers-5-bulkification-patterns-to-avoid-soql-dml-limits-f4e9c8bbfb3a
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
14
|
+
// PATTERN 1: Simple Map Lookup (Parent Record Access)
|
|
15
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* ❌ ANTI-PATTERN: Query inside loop
|
|
19
|
+
* This code will fail with "Too many SOQL queries: 101" for 101+ records
|
|
20
|
+
*/
|
|
21
|
+
public class AntiPatternExample {
|
|
22
|
+
public void processContacts_WRONG(List<Contact> contacts) {
|
|
23
|
+
for (Contact c : contacts) {
|
|
24
|
+
// ❌ QUERY IN LOOP - will hit governor limit!
|
|
25
|
+
Account a = [SELECT Name FROM Account WHERE Id = :c.AccountId];
|
|
26
|
+
c.Description = 'Account: ' + a.Name;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* ✅ CORRECT PATTERN: Bulk query with Map lookup
|
|
33
|
+
* Uses 1 query regardless of record count
|
|
34
|
+
*/
|
|
35
|
+
public class BulkPatternExample {
|
|
36
|
+
public void processContacts_CORRECT(List<Contact> contacts) {
|
|
37
|
+
// Step 1: Collect all parent IDs
|
|
38
|
+
Set<Id> accountIds = new Set<Id>();
|
|
39
|
+
for (Contact c : contacts) {
|
|
40
|
+
if (c.AccountId != null) {
|
|
41
|
+
accountIds.add(c.AccountId);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Step 2: Single bulk query
|
|
46
|
+
Map<Id, Account> accountMap = new Map<Id, Account>([
|
|
47
|
+
SELECT Id, Name
|
|
48
|
+
FROM Account
|
|
49
|
+
WHERE Id IN :accountIds
|
|
50
|
+
WITH SECURITY_ENFORCED
|
|
51
|
+
]);
|
|
52
|
+
|
|
53
|
+
// Step 3: O(1) Map lookups
|
|
54
|
+
for (Contact c : contacts) {
|
|
55
|
+
Account a = accountMap.get(c.AccountId);
|
|
56
|
+
if (a != null) {
|
|
57
|
+
c.Description = 'Account: ' + a.Name;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
64
|
+
// PATTERN 2: Grouped Child Records (One-to-Many)
|
|
65
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Get child records grouped by parent ID
|
|
69
|
+
* Useful when you need all children for each parent
|
|
70
|
+
*/
|
|
71
|
+
public class GroupedChildPattern {
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Returns Contacts grouped by their AccountId
|
|
75
|
+
*/
|
|
76
|
+
public static Map<Id, List<Contact>> getContactsByAccountId(Set<Id> accountIds) {
|
|
77
|
+
Map<Id, List<Contact>> contactsByAccount = new Map<Id, List<Contact>>();
|
|
78
|
+
|
|
79
|
+
// Initialize empty lists for each account
|
|
80
|
+
for (Id accountId : accountIds) {
|
|
81
|
+
contactsByAccount.put(accountId, new List<Contact>());
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Single query for all contacts
|
|
85
|
+
for (Contact c : [
|
|
86
|
+
SELECT Id, FirstName, LastName, Email, AccountId
|
|
87
|
+
FROM Contact
|
|
88
|
+
WHERE AccountId IN :accountIds
|
|
89
|
+
WITH SECURITY_ENFORCED
|
|
90
|
+
]) {
|
|
91
|
+
contactsByAccount.get(c.AccountId).add(c);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return contactsByAccount;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Usage example in a trigger
|
|
99
|
+
*/
|
|
100
|
+
public void onAccountUpdate(List<Account> accounts) {
|
|
101
|
+
Set<Id> accountIds = new Set<Id>();
|
|
102
|
+
for (Account a : accounts) {
|
|
103
|
+
accountIds.add(a.Id);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Get all contacts for all accounts in ONE query
|
|
107
|
+
Map<Id, List<Contact>> contactsByAccount = getContactsByAccountId(accountIds);
|
|
108
|
+
|
|
109
|
+
for (Account a : accounts) {
|
|
110
|
+
List<Contact> accountContacts = contactsByAccount.get(a.Id);
|
|
111
|
+
System.debug('Account ' + a.Name + ' has ' + accountContacts.size() + ' contacts');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
117
|
+
// PATTERN 3: Multi-Level Relationship Lookup
|
|
118
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* When you need to traverse multiple relationship levels
|
|
122
|
+
* Example: Contact -> Account -> Owner
|
|
123
|
+
*/
|
|
124
|
+
public class MultiLevelLookupPattern {
|
|
125
|
+
|
|
126
|
+
public void enrichContactsWithOwnerInfo(List<Contact> contacts) {
|
|
127
|
+
// Step 1: Get Account IDs
|
|
128
|
+
Set<Id> accountIds = new Set<Id>();
|
|
129
|
+
for (Contact c : contacts) {
|
|
130
|
+
if (c.AccountId != null) {
|
|
131
|
+
accountIds.add(c.AccountId);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Step 2: Query Accounts with Owner info (single query)
|
|
136
|
+
Map<Id, Account> accountMap = new Map<Id, Account>([
|
|
137
|
+
SELECT Id, Name, OwnerId, Owner.Name, Owner.Email
|
|
138
|
+
FROM Account
|
|
139
|
+
WHERE Id IN :accountIds
|
|
140
|
+
WITH SECURITY_ENFORCED
|
|
141
|
+
]);
|
|
142
|
+
|
|
143
|
+
// Step 3: Use the data
|
|
144
|
+
for (Contact c : contacts) {
|
|
145
|
+
Account a = accountMap.get(c.AccountId);
|
|
146
|
+
if (a != null && a.Owner != null) {
|
|
147
|
+
c.Description = 'Account Owner: ' + a.Owner.Name;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
154
|
+
// PATTERN 4: Conditional Query Based on Field Values
|
|
155
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* When you only need to query for certain records based on field values
|
|
159
|
+
*/
|
|
160
|
+
public class ConditionalQueryPattern {
|
|
161
|
+
|
|
162
|
+
public void updateHighValueOpportunities(List<Opportunity> opportunities) {
|
|
163
|
+
// Step 1: Filter to high-value opportunities only
|
|
164
|
+
Set<Id> highValueAccountIds = new Set<Id>();
|
|
165
|
+
for (Opportunity opp : opportunities) {
|
|
166
|
+
if (opp.Amount != null && opp.Amount > 100000 && opp.AccountId != null) {
|
|
167
|
+
highValueAccountIds.add(opp.AccountId);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Step 2: Only query if we have high-value records
|
|
172
|
+
if (highValueAccountIds.isEmpty()) {
|
|
173
|
+
return; // No query needed!
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
Map<Id, Account> accountMap = new Map<Id, Account>([
|
|
177
|
+
SELECT Id, Name, AnnualRevenue, Industry
|
|
178
|
+
FROM Account
|
|
179
|
+
WHERE Id IN :highValueAccountIds
|
|
180
|
+
WITH SECURITY_ENFORCED
|
|
181
|
+
]);
|
|
182
|
+
|
|
183
|
+
// Step 3: Process only the high-value opportunities
|
|
184
|
+
for (Opportunity opp : opportunities) {
|
|
185
|
+
if (opp.Amount != null && opp.Amount > 100000) {
|
|
186
|
+
Account a = accountMap.get(opp.AccountId);
|
|
187
|
+
if (a != null) {
|
|
188
|
+
opp.Description = 'High-value opp for ' + a.Industry + ' account';
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
196
|
+
// PATTERN 5: Avoiding Duplicate Queries in Complex Logic
|
|
197
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* When the same data is needed in multiple methods,
|
|
201
|
+
* query once and pass the Map around
|
|
202
|
+
*/
|
|
203
|
+
public class SharedQueryPattern {
|
|
204
|
+
|
|
205
|
+
private Map<Id, Account> accountCache;
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Initialize the cache once at the start of processing
|
|
209
|
+
*/
|
|
210
|
+
public void initializeCache(Set<Id> accountIds) {
|
|
211
|
+
this.accountCache = new Map<Id, Account>([
|
|
212
|
+
SELECT Id, Name, Industry, AnnualRevenue, OwnerId
|
|
213
|
+
FROM Account
|
|
214
|
+
WHERE Id IN :accountIds
|
|
215
|
+
WITH SECURITY_ENFORCED
|
|
216
|
+
]);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Multiple methods can use the cached data
|
|
221
|
+
*/
|
|
222
|
+
public String getAccountName(Id accountId) {
|
|
223
|
+
Account a = accountCache.get(accountId);
|
|
224
|
+
return a != null ? a.Name : null;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
public String getAccountIndustry(Id accountId) {
|
|
228
|
+
Account a = accountCache.get(accountId);
|
|
229
|
+
return a != null ? a.Industry : null;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
public Decimal getAccountRevenue(Id accountId) {
|
|
233
|
+
Account a = accountCache.get(accountId);
|
|
234
|
+
return a != null ? a.AnnualRevenue : 0;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
239
|
+
// PATTERN 6: SOQL For Loop (Large Dataset Processing)
|
|
240
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* For processing very large datasets without hitting heap limits
|
|
244
|
+
* The SOQL for loop fetches 200 records at a time
|
|
245
|
+
*/
|
|
246
|
+
public class LargeDatasetPattern {
|
|
247
|
+
|
|
248
|
+
public void processAllAccounts() {
|
|
249
|
+
// This fetches 200 records at a time, not all 50,000
|
|
250
|
+
for (Account a : [
|
|
251
|
+
SELECT Id, Name, Industry
|
|
252
|
+
FROM Account
|
|
253
|
+
WHERE CreatedDate = THIS_YEAR
|
|
254
|
+
]) {
|
|
255
|
+
// Process one record at a time
|
|
256
|
+
// Heap stays small because only 200 records in memory
|
|
257
|
+
processAccount(a);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
public void processAllAccountsInBatches() {
|
|
262
|
+
// Alternative: explicit batch processing (200 at a time)
|
|
263
|
+
for (List<Account> accountBatch : [
|
|
264
|
+
SELECT Id, Name, Industry
|
|
265
|
+
FROM Account
|
|
266
|
+
WHERE CreatedDate = THIS_YEAR
|
|
267
|
+
]) {
|
|
268
|
+
// Process 200 records at a time
|
|
269
|
+
processBatch(accountBatch);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
private void processAccount(Account a) {
|
|
274
|
+
// Individual record processing
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
private void processBatch(List<Account> accounts) {
|
|
278
|
+
// Batch processing
|
|
279
|
+
}
|
|
280
|
+
}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SOQL OPTIMIZATION PATTERNS
|
|
3
|
+
*
|
|
4
|
+
* These patterns demonstrate how to write efficient, selective queries
|
|
5
|
+
* that perform well within Salesforce governor limits.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
9
|
+
// SELECTIVE vs NON-SELECTIVE QUERIES
|
|
10
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
11
|
+
|
|
12
|
+
-- ❌ NON-SELECTIVE: Status alone is not indexed
|
|
13
|
+
SELECT Id, Name FROM Lead
|
|
14
|
+
WHERE Status = 'Open'
|
|
15
|
+
-- Scans ALL Lead records
|
|
16
|
+
|
|
17
|
+
-- ✅ SELECTIVE: Add indexed field filter
|
|
18
|
+
SELECT Id, Name FROM Lead
|
|
19
|
+
WHERE Status = 'Open'
|
|
20
|
+
AND CreatedDate = LAST_N_DAYS:30
|
|
21
|
+
-- CreatedDate is indexed, reduces scan
|
|
22
|
+
|
|
23
|
+
-- ❌ NON-SELECTIVE: Leading wildcard prevents index use
|
|
24
|
+
SELECT Id, Name FROM Account
|
|
25
|
+
WHERE Name LIKE '%corporation'
|
|
26
|
+
|
|
27
|
+
-- ✅ SELECTIVE: Trailing wildcard uses index
|
|
28
|
+
SELECT Id, Name FROM Account
|
|
29
|
+
WHERE Name LIKE 'Acme%'
|
|
30
|
+
|
|
31
|
+
-- ❌ NON-SELECTIVE: OR can prevent index optimization
|
|
32
|
+
SELECT Id FROM Contact
|
|
33
|
+
WHERE Email = 'test@test.com'
|
|
34
|
+
OR Phone = '555-1234'
|
|
35
|
+
|
|
36
|
+
-- ✅ SELECTIVE: Use UNION-style in Apex or multiple queries
|
|
37
|
+
-- Query 1: SELECT Id FROM Contact WHERE Email = 'test@test.com'
|
|
38
|
+
-- Query 2: SELECT Id FROM Contact WHERE Phone = '555-1234'
|
|
39
|
+
-- Combine results in Apex
|
|
40
|
+
|
|
41
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
42
|
+
// INDEXED FIELDS
|
|
43
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
44
|
+
|
|
45
|
+
-- Always indexed fields (use these in WHERE)
|
|
46
|
+
-- • Id (primary key)
|
|
47
|
+
-- • Name (standard Name field)
|
|
48
|
+
-- • OwnerId
|
|
49
|
+
-- • CreatedDate
|
|
50
|
+
-- • LastModifiedDate
|
|
51
|
+
-- • RecordTypeId
|
|
52
|
+
-- • External ID fields (custom)
|
|
53
|
+
-- • Master-Detail relationship fields
|
|
54
|
+
-- • Lookup fields (selective when <100k parent records)
|
|
55
|
+
|
|
56
|
+
-- ✅ GOOD: Uses indexed OwnerId
|
|
57
|
+
SELECT Id, Name FROM Account
|
|
58
|
+
WHERE OwnerId = '005xx000000XXXX'
|
|
59
|
+
|
|
60
|
+
-- ✅ GOOD: Uses indexed CreatedDate
|
|
61
|
+
SELECT Id, Name FROM Contact
|
|
62
|
+
WHERE CreatedDate >= 2024-01-01T00:00:00Z
|
|
63
|
+
|
|
64
|
+
-- ✅ GOOD: Uses indexed External ID
|
|
65
|
+
SELECT Id, Name FROM Account
|
|
66
|
+
WHERE External_Id__c = 'EXT-12345'
|
|
67
|
+
|
|
68
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
69
|
+
// FIELD SELECTION OPTIMIZATION
|
|
70
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
71
|
+
|
|
72
|
+
-- ❌ BAD: Selecting unnecessary fields
|
|
73
|
+
SELECT Id, Name, Description, BillingStreet, BillingCity, BillingState,
|
|
74
|
+
BillingPostalCode, BillingCountry, ShippingStreet, ShippingCity,
|
|
75
|
+
ShippingState, ShippingPostalCode, ShippingCountry, Phone, Fax,
|
|
76
|
+
AccountNumber, Website, Industry, AnnualRevenue, NumberOfEmployees,
|
|
77
|
+
Ownership, TickerSymbol, Description, Rating, Site, AccountSource
|
|
78
|
+
FROM Account
|
|
79
|
+
|
|
80
|
+
-- ✅ GOOD: Select only needed fields
|
|
81
|
+
SELECT Id, Name, Industry, AnnualRevenue
|
|
82
|
+
FROM Account
|
|
83
|
+
|
|
84
|
+
-- For display only: Use specific fields
|
|
85
|
+
SELECT Id, Name FROM Account
|
|
86
|
+
|
|
87
|
+
-- For processing: Query fields you'll update
|
|
88
|
+
SELECT Id, Status__c, Last_Processed__c FROM Account
|
|
89
|
+
|
|
90
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
91
|
+
// LIMIT USAGE
|
|
92
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
93
|
+
|
|
94
|
+
-- ❌ BAD: No limit (could return 50,000 rows)
|
|
95
|
+
SELECT Id, Name FROM Account
|
|
96
|
+
|
|
97
|
+
-- ✅ GOOD: Appropriate limit
|
|
98
|
+
SELECT Id, Name FROM Account LIMIT 200
|
|
99
|
+
|
|
100
|
+
-- For pagination
|
|
101
|
+
SELECT Id, Name FROM Account ORDER BY Name LIMIT 100 OFFSET 0
|
|
102
|
+
|
|
103
|
+
-- For single record lookup
|
|
104
|
+
SELECT Id, Name FROM Account WHERE Name = 'Acme Corp' LIMIT 1
|
|
105
|
+
|
|
106
|
+
-- For existence check
|
|
107
|
+
SELECT Id FROM Account WHERE Name = 'Acme Corp' LIMIT 1
|
|
108
|
+
-- In Apex: if (!results.isEmpty()) { /* exists */ }
|
|
109
|
+
|
|
110
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
111
|
+
// RELATIONSHIP QUERY OPTIMIZATION
|
|
112
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
113
|
+
|
|
114
|
+
-- ❌ BAD: Deep nesting (5 levels is max, avoid if possible)
|
|
115
|
+
SELECT Id, Account.Owner.Manager.Department.Name FROM Contact
|
|
116
|
+
|
|
117
|
+
-- ✅ GOOD: Flatten when possible
|
|
118
|
+
SELECT Id, Account.Name, Account.OwnerId FROM Contact
|
|
119
|
+
-- Then query Owner separately if needed
|
|
120
|
+
|
|
121
|
+
-- ❌ BAD: Too many child subqueries
|
|
122
|
+
SELECT Id, Name,
|
|
123
|
+
(SELECT Id FROM Contacts),
|
|
124
|
+
(SELECT Id FROM Opportunities),
|
|
125
|
+
(SELECT Id FROM Cases),
|
|
126
|
+
(SELECT Id FROM Tasks),
|
|
127
|
+
(SELECT Id FROM Events),
|
|
128
|
+
(SELECT Id FROM Notes)
|
|
129
|
+
FROM Account
|
|
130
|
+
|
|
131
|
+
-- ✅ GOOD: Query what you need
|
|
132
|
+
SELECT Id, Name,
|
|
133
|
+
(SELECT Id, Name FROM Contacts LIMIT 5)
|
|
134
|
+
FROM Account
|
|
135
|
+
|
|
136
|
+
-- ❌ BAD: Unfiltered subquery
|
|
137
|
+
SELECT Id, (SELECT Id FROM Opportunities) FROM Account
|
|
138
|
+
|
|
139
|
+
-- ✅ GOOD: Filtered subquery
|
|
140
|
+
SELECT Id, (SELECT Id FROM Opportunities WHERE StageName != 'Closed Lost' LIMIT 10)
|
|
141
|
+
FROM Account
|
|
142
|
+
|
|
143
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
144
|
+
// BULK QUERY PATTERNS
|
|
145
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
146
|
+
|
|
147
|
+
-- ❌ BAD: Query in loop
|
|
148
|
+
/*
|
|
149
|
+
for (Contact c : contacts) {
|
|
150
|
+
Account a = [SELECT Name FROM Account WHERE Id = :c.AccountId];
|
|
151
|
+
}
|
|
152
|
+
*/
|
|
153
|
+
|
|
154
|
+
-- ✅ GOOD: Bulk query with Map
|
|
155
|
+
/*
|
|
156
|
+
Set<Id> accountIds = new Set<Id>();
|
|
157
|
+
for (Contact c : contacts) {
|
|
158
|
+
accountIds.add(c.AccountId);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
Map<Id, Account> accountMap = new Map<Id, Account>(
|
|
162
|
+
[SELECT Id, Name FROM Account WHERE Id IN :accountIds]
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
for (Contact c : contacts) {
|
|
166
|
+
Account a = accountMap.get(c.AccountId);
|
|
167
|
+
}
|
|
168
|
+
*/
|
|
169
|
+
|
|
170
|
+
-- Use IN clause for bulk operations
|
|
171
|
+
SELECT Id, Name FROM Account WHERE Id IN :accountIdSet
|
|
172
|
+
|
|
173
|
+
-- Bind variable with Set (most efficient)
|
|
174
|
+
SELECT Id, Name FROM Contact WHERE AccountId IN :accountIds
|
|
175
|
+
|
|
176
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
177
|
+
// FOR UPDATE (Record Locking)
|
|
178
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
179
|
+
|
|
180
|
+
-- Lock records for update (prevents concurrent modification)
|
|
181
|
+
SELECT Id, Status__c FROM Account WHERE Id = :accountId FOR UPDATE
|
|
182
|
+
|
|
183
|
+
-- Note: Only use FOR UPDATE when you need to prevent race conditions
|
|
184
|
+
-- Adds overhead and can cause lock contention
|
|
185
|
+
|
|
186
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
187
|
+
// SECURITY ENFORCEMENT
|
|
188
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
189
|
+
|
|
190
|
+
-- ✅ Recommended: WITH SECURITY_ENFORCED
|
|
191
|
+
SELECT Id, Name, Phone FROM Account
|
|
192
|
+
WITH SECURITY_ENFORCED
|
|
193
|
+
-- Throws exception if user lacks field access
|
|
194
|
+
|
|
195
|
+
-- Alternative: USER_MODE (API 54.0+)
|
|
196
|
+
SELECT Id, Name FROM Account
|
|
197
|
+
WITH USER_MODE
|
|
198
|
+
-- Respects sharing rules and FLS
|
|
199
|
+
|
|
200
|
+
-- For admin operations: SYSTEM_MODE
|
|
201
|
+
SELECT Id, Name FROM Account
|
|
202
|
+
WITH SYSTEM_MODE
|
|
203
|
+
-- Bypasses sharing (use with caution)
|
|
204
|
+
|
|
205
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
206
|
+
// QUERY PLAN ANALYSIS
|
|
207
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
208
|
+
|
|
209
|
+
/*
|
|
210
|
+
Use Developer Console or CLI to analyze query plans:
|
|
211
|
+
|
|
212
|
+
1. Developer Console:
|
|
213
|
+
- Query Editor > Check "Use Tooling API"
|
|
214
|
+
- Click "Query Plan" button
|
|
215
|
+
|
|
216
|
+
2. CLI (uses REST API explain endpoint):
|
|
217
|
+
sf api request rest '/query/?explain=SELECT+Id+FROM+Account+WHERE+Name='\''Test'\''' --target-org my-org --json
|
|
218
|
+
|
|
219
|
+
Plan Output:
|
|
220
|
+
- Cardinality: Estimated rows returned
|
|
221
|
+
- Fields: Index fields used
|
|
222
|
+
- LeadingOperationType:
|
|
223
|
+
- "Index" = Good (using index)
|
|
224
|
+
- "TableScan" = Bad (scanning all records)
|
|
225
|
+
- Cost: Relative cost (lower is better)
|
|
226
|
+
- sObjectCardinality: Total records in object
|
|
227
|
+
*/
|
|
228
|
+
|
|
229
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
230
|
+
// LARGE DATA VOLUME PATTERNS
|
|
231
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
232
|
+
|
|
233
|
+
-- For tables with millions of records:
|
|
234
|
+
|
|
235
|
+
-- 1. Always use indexed fields
|
|
236
|
+
SELECT Id FROM Account
|
|
237
|
+
WHERE External_Id__c = 'EXT-123'
|
|
238
|
+
|
|
239
|
+
-- 2. Use date range with limit
|
|
240
|
+
SELECT Id, Name FROM Contact
|
|
241
|
+
WHERE CreatedDate >= 2024-01-01T00:00:00Z
|
|
242
|
+
AND CreatedDate < 2024-02-01T00:00:00Z
|
|
243
|
+
LIMIT 10000
|
|
244
|
+
|
|
245
|
+
-- 3. Use skinny tables (configured by Salesforce Support)
|
|
246
|
+
-- Query fields included in skinny table for best performance
|
|
247
|
+
|
|
248
|
+
-- 4. Consider archiving old records
|
|
249
|
+
SELECT Id FROM Account
|
|
250
|
+
WHERE LastActivityDate < LAST_N_YEARS:2
|
|
251
|
+
AND CreatedDate < LAST_N_YEARS:3
|
|
252
|
+
|
|
253
|
+
-- 5. Use Database.query() with query locator for batch
|
|
254
|
+
/*
|
|
255
|
+
Database.QueryLocator ql = Database.getQueryLocator(
|
|
256
|
+
'SELECT Id, Name FROM Account WHERE CreatedDate = THIS_YEAR'
|
|
257
|
+
);
|
|
258
|
+
// Can process up to 50 million records in batch
|
|
259
|
+
*/
|