@salesforce/afv-skills 1.7.5 → 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/building-ui-bundle-frontend/SKILL.md +2 -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/deploying-ui-bundle/SKILL.md +2 -0
- package/skills/developing-agentforce/SKILL.md +1 -1
- 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/SKILL.md +4 -2
- package/skills/generating-apex-test/CREDITS.md +2 -27
- package/skills/generating-apex-test/SKILL.md +3 -1
- package/skills/generating-custom-application/SKILL.md +2 -0
- package/skills/generating-custom-field/SKILL.md +3 -1
- package/skills/generating-custom-lightning-type/SKILL.md +2 -0
- package/skills/generating-custom-object/SKILL.md +3 -1
- package/skills/generating-custom-tab/SKILL.md +3 -1
- package/skills/generating-flexipage/SKILL.md +2 -0
- package/skills/generating-flow/SKILL.md +2 -0
- package/skills/generating-lightning-app/SKILL.md +1 -1
- package/skills/generating-list-view/SKILL.md +2 -0
- 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-ui-bundle-features/SKILL.md +2 -0
- package/skills/generating-ui-bundle-metadata/SKILL.md +2 -0
- package/skills/generating-ui-bundle-site/SKILL.md +2 -0
- package/skills/generating-validation-rule/SKILL.md +2 -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/implementing-ui-bundle-agentforce-conversation-client/SKILL.md +1 -1
- package/skills/implementing-ui-bundle-file-upload/SKILL.md +2 -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/observing-agentforce/SKILL.md +1 -1
- 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
- package/skills/switching-org/SKILL.md +1 -1
- package/skills/testing-agentforce/SKILL.md +1 -1
- package/skills/uplifting-components-to-slds2/SKILL.md +3 -1
- package/skills/using-ui-bundle-salesforce-data/SKILL.md +2 -0
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
<!-- Parent: querying-soql/SKILL.md -->
|
|
2
|
+
# SOQL Field Coverage Rules
|
|
3
|
+
|
|
4
|
+
This guide documents field coverage validation rules for SOQL queries — ensuring that all fields accessed in Apex code are actually queried. This is a common source of runtime errors, especially in AI-assisted code generation.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Table of Contents
|
|
9
|
+
|
|
10
|
+
1. [The Field Coverage Problem](#the-field-coverage-problem)
|
|
11
|
+
2. [Direct Field Access](#direct-field-access)
|
|
12
|
+
3. [Relationship Field Access](#relationship-field-access)
|
|
13
|
+
4. [Dynamic Field Access](#dynamic-field-access)
|
|
14
|
+
5. [Aggregate Queries](#aggregate-queries)
|
|
15
|
+
6. [Subquery Fields](#subquery-fields)
|
|
16
|
+
7. [Validation Patterns](#validation-patterns)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## The Field Coverage Problem
|
|
21
|
+
|
|
22
|
+
When you query an sObject, only the fields in the SELECT clause are populated. Accessing any other field results in a runtime error:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
System.SObjectException: SObject row was retrieved via SOQL without querying the requested field: Account.Industry
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
This error is particularly common in LLM-generated code because the LLM may:
|
|
29
|
+
1. Query some fields but access others in subsequent code
|
|
30
|
+
2. Forget to include relationship fields (e.g., `Account.Name` on Contact)
|
|
31
|
+
3. Access fields in conditional logic that weren't anticipated in the query
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Direct Field Access
|
|
36
|
+
|
|
37
|
+
### Rule: Every field accessed must be in the SELECT clause
|
|
38
|
+
|
|
39
|
+
### ❌ BAD: Accessing Unqueried Fields
|
|
40
|
+
|
|
41
|
+
```apex
|
|
42
|
+
// Query only includes Id and Name
|
|
43
|
+
List<Account> accounts = [SELECT Id, Name FROM Account];
|
|
44
|
+
|
|
45
|
+
for (Account acc : accounts) {
|
|
46
|
+
// RUNTIME ERROR: Industry was not queried
|
|
47
|
+
if (acc.Industry == 'Technology') {
|
|
48
|
+
// RUNTIME ERROR: Description was not queried
|
|
49
|
+
acc.Description = 'Tech company';
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// RUNTIME ERROR: AnnualRevenue was not queried
|
|
53
|
+
Decimal revenue = acc.AnnualRevenue;
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### ✅ GOOD: Query All Accessed Fields
|
|
58
|
+
|
|
59
|
+
```apex
|
|
60
|
+
// Query ALL fields that will be accessed
|
|
61
|
+
List<Account> accounts = [
|
|
62
|
+
SELECT Id, Name, Industry, Description, AnnualRevenue
|
|
63
|
+
FROM Account
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
for (Account acc : accounts) {
|
|
67
|
+
if (acc.Industry == 'Technology') {
|
|
68
|
+
acc.Description = 'Tech company'; // OK - queried
|
|
69
|
+
}
|
|
70
|
+
Decimal revenue = acc.AnnualRevenue; // OK - queried
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Field Access Locations to Check
|
|
75
|
+
|
|
76
|
+
Fields can be accessed in many places—ensure coverage for all:
|
|
77
|
+
|
|
78
|
+
| Access Location | Example | Must Query |
|
|
79
|
+
|-----------------|---------|------------|
|
|
80
|
+
| Conditional (`if`) | `if (acc.Industry == 'Tech')` | `Industry` |
|
|
81
|
+
| Assignment | `acc.Description = 'Text'` | `Description` |
|
|
82
|
+
| Variable assignment | `String name = acc.Name` | `Name` |
|
|
83
|
+
| Method argument | `sendEmail(acc.Email__c)` | `Email__c` |
|
|
84
|
+
| Collection key | `map.put(acc.Name, acc)` | `Name` |
|
|
85
|
+
| String interpolation | `'Hello ' + acc.Name` | `Name` |
|
|
86
|
+
| SOQL bind | `[SELECT Id FROM Contact WHERE AccountId = :acc.Id]` | `Id` (usually included) |
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Relationship Field Access
|
|
91
|
+
|
|
92
|
+
### Rule: Parent relationship fields require dot notation in SELECT
|
|
93
|
+
|
|
94
|
+
### ❌ BAD: Missing Relationship Fields
|
|
95
|
+
|
|
96
|
+
```apex
|
|
97
|
+
// Contact query without Account relationship fields
|
|
98
|
+
List<Contact> contacts = [SELECT Id, Name, AccountId FROM Contact];
|
|
99
|
+
|
|
100
|
+
for (Contact c : contacts) {
|
|
101
|
+
// RUNTIME ERROR: Account.Name was not queried
|
|
102
|
+
String accountName = c.Account.Name;
|
|
103
|
+
|
|
104
|
+
// RUNTIME ERROR: Account.Industry was not queried
|
|
105
|
+
if (c.Account.Industry == 'Technology') {
|
|
106
|
+
// ...
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### ✅ GOOD: Include Relationship Fields
|
|
112
|
+
|
|
113
|
+
```apex
|
|
114
|
+
// Use dot notation to include parent fields
|
|
115
|
+
List<Contact> contacts = [
|
|
116
|
+
SELECT Id, Name, AccountId,
|
|
117
|
+
Account.Name, // Parent field
|
|
118
|
+
Account.Industry, // Parent field
|
|
119
|
+
Account.Owner.Name // Grandparent field (up to 5 levels)
|
|
120
|
+
FROM Contact
|
|
121
|
+
];
|
|
122
|
+
|
|
123
|
+
for (Contact c : contacts) {
|
|
124
|
+
String accountName = c.Account.Name; // OK - queried
|
|
125
|
+
|
|
126
|
+
if (c.Account.Industry == 'Technology') { // OK - queried
|
|
127
|
+
String ownerName = c.Account.Owner.Name; // OK - queried
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Relationship Traversal Limits
|
|
133
|
+
|
|
134
|
+
| Direction | Limit | Example |
|
|
135
|
+
|-----------|-------|---------|
|
|
136
|
+
| Parent (lookup/master-detail) | 5 levels | `Contact.Account.Owner.Manager.Name` |
|
|
137
|
+
| Child (subquery) | 1 level | `Account -> Contacts` (cannot nest subqueries) |
|
|
138
|
+
|
|
139
|
+
### ❌ BAD: Assuming Relationship is Populated
|
|
140
|
+
|
|
141
|
+
```apex
|
|
142
|
+
List<Contact> contacts = [SELECT Id, AccountId FROM Contact];
|
|
143
|
+
|
|
144
|
+
for (Contact c : contacts) {
|
|
145
|
+
// AccountId is queried, but Account object is NOT populated
|
|
146
|
+
// This will throw: Account.Name not queried
|
|
147
|
+
if (c.Account != null) {
|
|
148
|
+
String name = c.Account.Name; // ERROR!
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### ✅ GOOD: Query Relationship or Use Separate Query
|
|
154
|
+
|
|
155
|
+
```apex
|
|
156
|
+
// Option 1: Include relationship field
|
|
157
|
+
List<Contact> contacts = [SELECT Id, AccountId, Account.Name FROM Contact];
|
|
158
|
+
|
|
159
|
+
for (Contact c : contacts) {
|
|
160
|
+
if (c.Account != null) {
|
|
161
|
+
String name = c.Account.Name; // OK
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Option 2: Separate query using collected IDs
|
|
166
|
+
List<Contact> contacts = [SELECT Id, AccountId FROM Contact];
|
|
167
|
+
Set<Id> accountIds = new Set<Id>();
|
|
168
|
+
for (Contact c : contacts) {
|
|
169
|
+
if (c.AccountId != null) {
|
|
170
|
+
accountIds.add(c.AccountId);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
Map<Id, Account> accountMap = new Map<Id, Account>(
|
|
175
|
+
[SELECT Id, Name FROM Account WHERE Id IN :accountIds]
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
for (Contact c : contacts) {
|
|
179
|
+
Account acc = accountMap.get(c.AccountId);
|
|
180
|
+
if (acc != null) {
|
|
181
|
+
String name = acc.Name; // OK
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Dynamic Field Access
|
|
189
|
+
|
|
190
|
+
### Rule: Dynamic field access (using `get()`) also requires queried fields
|
|
191
|
+
|
|
192
|
+
### ❌ BAD: Dynamic Access to Unqueried Field
|
|
193
|
+
|
|
194
|
+
```apex
|
|
195
|
+
List<Account> accounts = [SELECT Id, Name FROM Account];
|
|
196
|
+
String fieldName = 'Industry'; // Dynamic field name
|
|
197
|
+
|
|
198
|
+
for (Account acc : accounts) {
|
|
199
|
+
// RUNTIME ERROR: Industry was not queried
|
|
200
|
+
Object value = acc.get(fieldName);
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### ✅ GOOD: Query Fields Used Dynamically
|
|
205
|
+
|
|
206
|
+
```apex
|
|
207
|
+
// If you know which fields will be accessed dynamically, query them
|
|
208
|
+
List<Account> accounts = [SELECT Id, Name, Industry FROM Account];
|
|
209
|
+
String fieldName = 'Industry';
|
|
210
|
+
|
|
211
|
+
for (Account acc : accounts) {
|
|
212
|
+
Object value = acc.get(fieldName); // OK - Industry is queried
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### ✅ GOOD: Build Dynamic Query
|
|
217
|
+
|
|
218
|
+
```apex
|
|
219
|
+
// For truly dynamic scenarios, build the query dynamically
|
|
220
|
+
Set<String> fieldsToQuery = new Set<String>{'Id', 'Name'};
|
|
221
|
+
fieldsToQuery.addAll(dynamicFieldList); // Add dynamic fields
|
|
222
|
+
|
|
223
|
+
String query = 'SELECT ' + String.join(new List<String>(fieldsToQuery), ', ') +
|
|
224
|
+
' FROM Account WHERE Id IN :accountIds';
|
|
225
|
+
|
|
226
|
+
List<Account> accounts = Database.query(query);
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Aggregate Queries
|
|
232
|
+
|
|
233
|
+
### Rule: Aggregate queries return `AggregateResult`, not sObjects
|
|
234
|
+
|
|
235
|
+
### ❌ BAD: Treating Aggregate as sObject
|
|
236
|
+
|
|
237
|
+
```apex
|
|
238
|
+
// This returns AggregateResult, not Account
|
|
239
|
+
List<Account> accounts = [
|
|
240
|
+
SELECT Industry, COUNT(Id) cnt
|
|
241
|
+
FROM Account
|
|
242
|
+
GROUP BY Industry
|
|
243
|
+
]; // COMPILE ERROR - wrong type
|
|
244
|
+
|
|
245
|
+
// Even with correct type, can't access normal fields
|
|
246
|
+
AggregateResult[] results = [
|
|
247
|
+
SELECT Industry, COUNT(Id) cnt
|
|
248
|
+
FROM Account
|
|
249
|
+
GROUP BY Industry
|
|
250
|
+
];
|
|
251
|
+
|
|
252
|
+
for (AggregateResult ar : results) {
|
|
253
|
+
// Cannot access like sObject fields
|
|
254
|
+
String industry = ar.Industry; // COMPILE ERROR
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### ✅ GOOD: Use get() for Aggregate Results
|
|
259
|
+
|
|
260
|
+
```apex
|
|
261
|
+
AggregateResult[] results = [
|
|
262
|
+
SELECT Industry, COUNT(Id) cnt, SUM(AnnualRevenue) totalRevenue
|
|
263
|
+
FROM Account
|
|
264
|
+
GROUP BY Industry
|
|
265
|
+
];
|
|
266
|
+
|
|
267
|
+
for (AggregateResult ar : results) {
|
|
268
|
+
// Use get() with field alias
|
|
269
|
+
String industry = (String) ar.get('Industry');
|
|
270
|
+
Integer count = (Integer) ar.get('cnt');
|
|
271
|
+
Decimal totalRevenue = (Decimal) ar.get('totalRevenue');
|
|
272
|
+
|
|
273
|
+
System.debug(industry + ': ' + count + ' accounts, $' + totalRevenue);
|
|
274
|
+
}
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### Aggregate Field Aliases
|
|
278
|
+
|
|
279
|
+
| Function | Default Alias | Example |
|
|
280
|
+
|----------|---------------|---------|
|
|
281
|
+
| `COUNT(Field)` | `expr0`, `expr1`, etc. | Use explicit alias: `COUNT(Id) cnt` |
|
|
282
|
+
| `SUM(Field)` | `expr0`, `expr1`, etc. | Use explicit alias: `SUM(Amount) total` |
|
|
283
|
+
| `AVG(Field)` | `expr0`, `expr1`, etc. | Use explicit alias: `AVG(Age) avgAge` |
|
|
284
|
+
| `MIN(Field)` | `expr0`, `expr1`, etc. | Use explicit alias: `MIN(CreatedDate) earliest` |
|
|
285
|
+
| `MAX(Field)` | `expr0`, `expr1`, etc. | Use explicit alias: `MAX(Amount) largest` |
|
|
286
|
+
| `GROUP BY Field` | Field API name | Access with field name: `ar.get('Industry')` |
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## Subquery Fields
|
|
291
|
+
|
|
292
|
+
### Rule: Child relationship subqueries create nested lists
|
|
293
|
+
|
|
294
|
+
### ❌ BAD: Accessing Subquery Fields Incorrectly
|
|
295
|
+
|
|
296
|
+
```apex
|
|
297
|
+
// Query with contact subquery
|
|
298
|
+
List<Account> accounts = [
|
|
299
|
+
SELECT Id, Name,
|
|
300
|
+
(SELECT Id, Name FROM Contacts)
|
|
301
|
+
FROM Account
|
|
302
|
+
];
|
|
303
|
+
|
|
304
|
+
for (Account acc : accounts) {
|
|
305
|
+
// ERROR: Contacts is a List, not a single Contact
|
|
306
|
+
String contactName = acc.Contacts.Name;
|
|
307
|
+
|
|
308
|
+
// ERROR: Cannot access unqueried field from subquery
|
|
309
|
+
for (Contact c : acc.Contacts) {
|
|
310
|
+
String email = c.Email; // Email not in subquery SELECT!
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### ✅ GOOD: Proper Subquery Field Access
|
|
316
|
+
|
|
317
|
+
```apex
|
|
318
|
+
// Query all needed fields in subquery
|
|
319
|
+
List<Account> accounts = [
|
|
320
|
+
SELECT Id, Name,
|
|
321
|
+
(SELECT Id, Name, Email, Phone FROM Contacts)
|
|
322
|
+
FROM Account
|
|
323
|
+
];
|
|
324
|
+
|
|
325
|
+
for (Account acc : accounts) {
|
|
326
|
+
// Contacts is a List<Contact>
|
|
327
|
+
List<Contact> contacts = acc.Contacts;
|
|
328
|
+
|
|
329
|
+
if (contacts != null && !contacts.isEmpty()) {
|
|
330
|
+
for (Contact c : contacts) {
|
|
331
|
+
String name = c.Name; // OK - in subquery SELECT
|
|
332
|
+
String email = c.Email; // OK - in subquery SELECT
|
|
333
|
+
String phone = c.Phone; // OK - in subquery SELECT
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### Subquery Null Safety
|
|
340
|
+
|
|
341
|
+
```apex
|
|
342
|
+
List<Account> accounts = [
|
|
343
|
+
SELECT Id, (SELECT Id FROM Contacts)
|
|
344
|
+
FROM Account
|
|
345
|
+
];
|
|
346
|
+
|
|
347
|
+
for (Account acc : accounts) {
|
|
348
|
+
// Subquery result can be null if no child records
|
|
349
|
+
if (acc.Contacts != null) {
|
|
350
|
+
for (Contact c : acc.Contacts) {
|
|
351
|
+
// Process contact
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// Or use null-safe size check
|
|
356
|
+
Integer contactCount = acc.Contacts?.size() ?? 0;
|
|
357
|
+
}
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
---
|
|
361
|
+
|
|
362
|
+
## Validation Patterns
|
|
363
|
+
|
|
364
|
+
### Pattern 1: Field-to-Query Mapping
|
|
365
|
+
|
|
366
|
+
Create a systematic approach to track field usage:
|
|
367
|
+
|
|
368
|
+
```apex
|
|
369
|
+
public class AccountProcessor {
|
|
370
|
+
// Document required fields at the top
|
|
371
|
+
private static final Set<String> REQUIRED_FIELDS = new Set<String>{
|
|
372
|
+
'Id', 'Name', 'Industry', 'Description', 'AnnualRevenue',
|
|
373
|
+
'OwnerId', 'Owner.Name', 'Owner.Email'
|
|
374
|
+
};
|
|
375
|
+
|
|
376
|
+
// Single method for consistent querying
|
|
377
|
+
public static List<Account> queryAccounts(Set<Id> accountIds) {
|
|
378
|
+
return [
|
|
379
|
+
SELECT Id, Name, Industry, Description, AnnualRevenue,
|
|
380
|
+
OwnerId, Owner.Name, Owner.Email
|
|
381
|
+
FROM Account
|
|
382
|
+
WHERE Id IN :accountIds
|
|
383
|
+
];
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
public static void processAccounts(List<Account> accounts) {
|
|
387
|
+
for (Account acc : accounts) {
|
|
388
|
+
// All fields in REQUIRED_FIELDS are safe to access
|
|
389
|
+
if (acc.Industry == 'Technology') {
|
|
390
|
+
acc.Description = 'Tech: ' + acc.Name;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
### Pattern 2: Selector Layer
|
|
398
|
+
|
|
399
|
+
Use a selector pattern to centralize query field management:
|
|
400
|
+
|
|
401
|
+
```apex
|
|
402
|
+
public class AccountSelector {
|
|
403
|
+
|
|
404
|
+
// Default fields for most operations
|
|
405
|
+
private static final List<String> DEFAULT_FIELDS = new List<String>{
|
|
406
|
+
'Id', 'Name', 'Industry', 'Type', 'OwnerId'
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
// Extended fields for detailed views
|
|
410
|
+
private static final List<String> DETAIL_FIELDS = new List<String>{
|
|
411
|
+
'Id', 'Name', 'Industry', 'Type', 'OwnerId',
|
|
412
|
+
'Description', 'AnnualRevenue', 'NumberOfEmployees',
|
|
413
|
+
'BillingCity', 'BillingState', 'BillingCountry',
|
|
414
|
+
'Owner.Name', 'Owner.Email'
|
|
415
|
+
};
|
|
416
|
+
|
|
417
|
+
public List<Account> selectById(Set<Id> ids) {
|
|
418
|
+
return selectByIdWithFields(ids, DEFAULT_FIELDS);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
public List<Account> selectByIdDetailed(Set<Id> ids) {
|
|
422
|
+
return selectByIdWithFields(ids, DETAIL_FIELDS);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
private List<Account> selectByIdWithFields(Set<Id> ids, List<String> fields) {
|
|
426
|
+
String query = 'SELECT ' + String.join(fields, ', ') +
|
|
427
|
+
' FROM Account WHERE Id IN :ids';
|
|
428
|
+
return Database.query(query);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
### Pattern 3: Field Validation Helper
|
|
434
|
+
|
|
435
|
+
```apex
|
|
436
|
+
public class SObjectFieldValidator {
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Check if a field was queried on an sObject
|
|
440
|
+
* @param obj The sObject to check
|
|
441
|
+
* @param fieldName The API name of the field
|
|
442
|
+
* @return true if the field is populated (was queried)
|
|
443
|
+
*/
|
|
444
|
+
public static Boolean isFieldPopulated(SObject obj, String fieldName) {
|
|
445
|
+
try {
|
|
446
|
+
obj.get(fieldName);
|
|
447
|
+
return true;
|
|
448
|
+
} catch (SObjectException e) {
|
|
449
|
+
return false;
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/**
|
|
454
|
+
* Get field value with default if not queried
|
|
455
|
+
* @param obj The sObject
|
|
456
|
+
* @param fieldName The field API name
|
|
457
|
+
* @param defaultValue Value to return if field not queried
|
|
458
|
+
* @return The field value or default
|
|
459
|
+
*/
|
|
460
|
+
public static Object getFieldOrDefault(SObject obj, String fieldName, Object defaultValue) {
|
|
461
|
+
try {
|
|
462
|
+
Object value = obj.get(fieldName);
|
|
463
|
+
return value != null ? value : defaultValue;
|
|
464
|
+
} catch (SObjectException e) {
|
|
465
|
+
return defaultValue;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
---
|
|
472
|
+
|
|
473
|
+
## Quick Reference: Field Coverage Checklist
|
|
474
|
+
|
|
475
|
+
Before running code that processes SOQL results:
|
|
476
|
+
|
|
477
|
+
### Direct Fields
|
|
478
|
+
- [ ] All fields in `if` conditions are queried
|
|
479
|
+
- [ ] All fields on left side of assignments are queried
|
|
480
|
+
- [ ] All fields passed to methods are queried
|
|
481
|
+
- [ ] All fields used in map keys/values are queried
|
|
482
|
+
|
|
483
|
+
### Relationship Fields
|
|
484
|
+
- [ ] Parent fields use dot notation (e.g., `Account.Name`)
|
|
485
|
+
- [ ] Parent object null checks before field access
|
|
486
|
+
- [ ] Relationship traversal doesn't exceed 5 levels
|
|
487
|
+
|
|
488
|
+
### Subqueries
|
|
489
|
+
- [ ] Child records accessed as List, not single record
|
|
490
|
+
- [ ] Subquery SELECT includes all accessed child fields
|
|
491
|
+
- [ ] Null check before iterating subquery results
|
|
492
|
+
|
|
493
|
+
### Dynamic Access
|
|
494
|
+
- [ ] Fields accessed via `get(fieldName)` are queried
|
|
495
|
+
- [ ] Dynamic queries include all needed fields
|
|
496
|
+
|
|
497
|
+
---
|
|
498
|
+
|
|
499
|
+
## Common LLM Mistakes Summary
|
|
500
|
+
|
|
501
|
+
| Mistake | Example | Fix |
|
|
502
|
+
|---------|---------|-----|
|
|
503
|
+
| Query subset, use superset | Query `Id, Name`, use `Industry` | Add `Industry` to SELECT |
|
|
504
|
+
| Forget relationship field | Use `c.Account.Name` without querying | Add `Account.Name` to SELECT |
|
|
505
|
+
| Assume AccountId = Account | Query `AccountId`, access `Account.Name` | Query `Account.Name` explicitly |
|
|
506
|
+
| Wrong subquery access | `acc.Contacts.Email` | `for (Contact c : acc.Contacts) { c.Email }` |
|
|
507
|
+
| Missing subquery field | Subquery `SELECT Id`, use `Email` | Add `Email` to subquery SELECT |
|
|
508
|
+
|
|
509
|
+
---
|
|
510
|
+
|
|
511
|
+
## Reference
|
|
512
|
+
|
|
513
|
+
- **SOQL Anti-Patterns**: See `references/anti-patterns.md` for general SOQL mistakes
|
|
514
|
+
- **Selector Patterns**: See `references/selector-patterns.md` for query organization
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
<!-- Parent: querying-soql/SKILL.md -->
|
|
2
|
+
|
|
3
|
+
# Query Optimization & Governor Limits
|
|
4
|
+
|
|
5
|
+
## Indexing Strategy
|
|
6
|
+
|
|
7
|
+
**Indexed Fields** (Always Selective):
|
|
8
|
+
- Id, Name, OwnerId, CreatedDate, LastModifiedDate, RecordTypeId
|
|
9
|
+
- External ID fields, Master-Detail relationship fields
|
|
10
|
+
- Lookup fields (when unique)
|
|
11
|
+
|
|
12
|
+
**Standard Indexed Fields by Object**:
|
|
13
|
+
- Account: AccountNumber, Site
|
|
14
|
+
- Contact: Email
|
|
15
|
+
- Lead: Email
|
|
16
|
+
- Case: CaseNumber
|
|
17
|
+
|
|
18
|
+
## Selectivity Rules
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
A filter is selective when it returns:
|
|
22
|
+
- < 10% of total records for first 1 million
|
|
23
|
+
- < 5% of total records for additional records
|
|
24
|
+
- OR uses an indexed field
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Optimization Patterns
|
|
28
|
+
|
|
29
|
+
```sql
|
|
30
|
+
-- ❌ NON-SELECTIVE (scans all records)
|
|
31
|
+
SELECT Id FROM Lead WHERE Status = 'Open'
|
|
32
|
+
|
|
33
|
+
-- ✅ SELECTIVE (uses index + selective filter)
|
|
34
|
+
SELECT Id FROM Lead
|
|
35
|
+
WHERE Status = 'Open'
|
|
36
|
+
AND CreatedDate = LAST_N_DAYS:30
|
|
37
|
+
LIMIT 10000
|
|
38
|
+
|
|
39
|
+
-- ❌ LEADING WILDCARD (can't use index)
|
|
40
|
+
SELECT Id FROM Account WHERE Name LIKE '%corp'
|
|
41
|
+
|
|
42
|
+
-- ✅ TRAILING WILDCARD (uses index)
|
|
43
|
+
SELECT Id FROM Account WHERE Name LIKE 'Acme%'
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Query Plan Analysis
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# Get query plan
|
|
50
|
+
sf data query \
|
|
51
|
+
--query "SELECT Id FROM Account WHERE Name = 'Test'" \
|
|
52
|
+
--target-org my-org \
|
|
53
|
+
--use-tooling-api \
|
|
54
|
+
--plan
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**Plan Output Interpretation**:
|
|
58
|
+
- `Cardinality`: Estimated rows returned
|
|
59
|
+
- `Cost`: Relative query cost (lower is better)
|
|
60
|
+
- `Fields`: Index fields used
|
|
61
|
+
- `LeadingOperationType`: How the query starts (Index vs TableScan)
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Governor Limits
|
|
66
|
+
|
|
67
|
+
| Limit | Synchronous | Asynchronous |
|
|
68
|
+
|-------|-------------|--------------|
|
|
69
|
+
| Total SOQL Queries | 100 | 200 |
|
|
70
|
+
| Records Retrieved | 50,000 | 50,000 |
|
|
71
|
+
| Query Rows (queryMore) | 2,000 | 2,000 |
|
|
72
|
+
| Query Locator Rows | 10 million | 10 million |
|
|
73
|
+
|
|
74
|
+
### Efficient Patterns
|
|
75
|
+
|
|
76
|
+
```sql
|
|
77
|
+
-- ❌ Query all, filter in Apex
|
|
78
|
+
SELECT Id, Name FROM Account
|
|
79
|
+
-- Then filter 50,000 records in Apex
|
|
80
|
+
|
|
81
|
+
-- ✅ Filter in SOQL
|
|
82
|
+
SELECT Id, Name FROM Account
|
|
83
|
+
WHERE Industry = 'Technology' AND IsActive__c = true
|
|
84
|
+
LIMIT 1000
|
|
85
|
+
|
|
86
|
+
-- ❌ Multiple queries in loop
|
|
87
|
+
for (Contact c : contacts) {
|
|
88
|
+
Account a = [SELECT Name FROM Account WHERE Id = :c.AccountId];
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
-- ✅ Single query with Map
|
|
92
|
+
Map<Id, Account> accounts = new Map<Id, Account>(
|
|
93
|
+
[SELECT Id, Name FROM Account WHERE Id IN :accountIds]
|
|
94
|
+
);
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## SOQL FOR Loops
|
|
98
|
+
|
|
99
|
+
```apex
|
|
100
|
+
// For large datasets - doesn't load all into heap
|
|
101
|
+
for (Account acc : [SELECT Id, Name FROM Account WHERE Industry = 'Technology']) {
|
|
102
|
+
// Process one record at a time
|
|
103
|
+
// Governor: Uses queryMore internally (200 at a time)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// With explicit batch size
|
|
107
|
+
for (List<Account> accs : [SELECT Id, Name FROM Account]) {
|
|
108
|
+
// Process 200 records at a time
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Security Patterns
|
|
113
|
+
|
|
114
|
+
### WITH SECURITY_ENFORCED
|
|
115
|
+
|
|
116
|
+
```sql
|
|
117
|
+
-- Throws exception if user lacks FLS
|
|
118
|
+
SELECT Id, Name, Phone
|
|
119
|
+
FROM Account
|
|
120
|
+
WITH SECURITY_ENFORCED
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### WITH USER_MODE / SYSTEM_MODE
|
|
124
|
+
|
|
125
|
+
```sql
|
|
126
|
+
-- Respects sharing rules (default in Apex)
|
|
127
|
+
SELECT Id, Name FROM Account WITH USER_MODE
|
|
128
|
+
|
|
129
|
+
-- Bypasses sharing rules (use with caution)
|
|
130
|
+
SELECT Id, Name FROM Account WITH SYSTEM_MODE
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### In Apex: stripInaccessible
|
|
134
|
+
|
|
135
|
+
```apex
|
|
136
|
+
// Strip inaccessible fields instead of throwing
|
|
137
|
+
SObjectAccessDecision decision = Security.stripInaccessible(
|
|
138
|
+
AccessType.READABLE,
|
|
139
|
+
[SELECT Id, Name, SecretField__c FROM Account]
|
|
140
|
+
);
|
|
141
|
+
List<Account> safeAccounts = decision.getRecords();
|
|
142
|
+
```
|