@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,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apex Benchmarking Template
|
|
3
|
+
*
|
|
4
|
+
* Reliable performance testing using established Apex benchmarking techniques.
|
|
5
|
+
* Run in Anonymous Apex for consistent results.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Warm-up phase to normalize JIT compilation
|
|
9
|
+
* - Multiple iterations for statistical accuracy
|
|
10
|
+
* - Side-by-side comparison of two approaches
|
|
11
|
+
* - Automatic winner determination
|
|
12
|
+
*
|
|
13
|
+
* See: references/benchmarking-guide.md for methodology and benchmark data
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
17
|
+
// SIMPLE BENCHMARK (Copy into Anonymous Apex)
|
|
18
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
19
|
+
|
|
20
|
+
// Quick single-operation benchmark
|
|
21
|
+
Long startTime = System.currentTimeMillis();
|
|
22
|
+
|
|
23
|
+
for (Integer i = 0; i < 10000; i++) {
|
|
24
|
+
// Your operation here
|
|
25
|
+
String s = 'test'.toUpperCase();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
Long duration = System.currentTimeMillis() - startTime;
|
|
29
|
+
System.debug('Duration: ' + duration + 'ms');
|
|
30
|
+
System.debug('Per iteration: ' + (duration / 10000.0) + 'ms');
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
34
|
+
// COMPARISON BENCHMARK CLASS
|
|
35
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Compare two implementations side-by-side
|
|
39
|
+
*
|
|
40
|
+
* Usage in Anonymous Apex:
|
|
41
|
+
* BenchmarkComparison.run();
|
|
42
|
+
*/
|
|
43
|
+
public class BenchmarkComparison {
|
|
44
|
+
|
|
45
|
+
private static final Integer ITERATIONS = 10000;
|
|
46
|
+
private static final Integer WARMUP_ITERATIONS = 100;
|
|
47
|
+
|
|
48
|
+
public static void run() {
|
|
49
|
+
System.debug('═══════════════════════════════════════════════════════');
|
|
50
|
+
System.debug('BENCHMARK: [Description Here]');
|
|
51
|
+
System.debug('Iterations: ' + ITERATIONS);
|
|
52
|
+
System.debug('═══════════════════════════════════════════════════════');
|
|
53
|
+
|
|
54
|
+
// Warm-up phase (normalizes JIT compilation effects)
|
|
55
|
+
System.debug('\n🔥 Warm-up phase...');
|
|
56
|
+
for (Integer i = 0; i < WARMUP_ITERATIONS; i++) {
|
|
57
|
+
methodA();
|
|
58
|
+
methodB();
|
|
59
|
+
}
|
|
60
|
+
System.debug(' Warm-up complete');
|
|
61
|
+
|
|
62
|
+
// Benchmark Method A
|
|
63
|
+
System.debug('\n📊 Running Method A...');
|
|
64
|
+
Long startA = System.currentTimeMillis();
|
|
65
|
+
for (Integer i = 0; i < ITERATIONS; i++) {
|
|
66
|
+
methodA();
|
|
67
|
+
}
|
|
68
|
+
Long durationA = System.currentTimeMillis() - startA;
|
|
69
|
+
|
|
70
|
+
// Benchmark Method B
|
|
71
|
+
System.debug('📊 Running Method B...');
|
|
72
|
+
Long startB = System.currentTimeMillis();
|
|
73
|
+
for (Integer i = 0; i < ITERATIONS; i++) {
|
|
74
|
+
methodB();
|
|
75
|
+
}
|
|
76
|
+
Long durationB = System.currentTimeMillis() - startB;
|
|
77
|
+
|
|
78
|
+
// Results
|
|
79
|
+
System.debug('\n═══════════════════════════════════════════════════════');
|
|
80
|
+
System.debug('RESULTS');
|
|
81
|
+
System.debug('═══════════════════════════════════════════════════════');
|
|
82
|
+
System.debug('Method A: ' + durationA + 'ms (' + (durationA / (Decimal)ITERATIONS) + 'ms per iteration)');
|
|
83
|
+
System.debug('Method B: ' + durationB + 'ms (' + (durationB / (Decimal)ITERATIONS) + 'ms per iteration)');
|
|
84
|
+
System.debug('───────────────────────────────────────────────────────');
|
|
85
|
+
|
|
86
|
+
Long difference = Math.abs(durationA - durationB);
|
|
87
|
+
String winner = durationA < durationB ? 'Method A' : 'Method B';
|
|
88
|
+
Decimal improvement = durationA < durationB
|
|
89
|
+
? (durationB / (Decimal)durationA)
|
|
90
|
+
: (durationA / (Decimal)durationB);
|
|
91
|
+
|
|
92
|
+
System.debug('🏆 Winner: ' + winner);
|
|
93
|
+
System.debug(' Difference: ' + difference + 'ms');
|
|
94
|
+
System.debug(' Improvement: ' + improvement.setScale(1) + 'x faster');
|
|
95
|
+
|
|
96
|
+
// Governor limits status
|
|
97
|
+
System.debug('\n📈 Governor Limits Used:');
|
|
98
|
+
System.debug(' CPU Time: ' + Limits.getCpuTime() + '/' + Limits.getLimitCpuTime() + 'ms');
|
|
99
|
+
System.debug(' Heap Size: ' + Limits.getHeapSize() + '/' + Limits.getLimitHeapSize() + ' bytes');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
103
|
+
// METHODS TO COMPARE (Replace with your implementations)
|
|
104
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
105
|
+
|
|
106
|
+
private static void methodA() {
|
|
107
|
+
// Implementation A - e.g., String concatenation
|
|
108
|
+
String result = '';
|
|
109
|
+
for (Integer i = 0; i < 10; i++) {
|
|
110
|
+
result += 'item' + i + ',';
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
private static void methodB() {
|
|
115
|
+
// Implementation B - e.g., String.join()
|
|
116
|
+
List<String> items = new List<String>();
|
|
117
|
+
for (Integer i = 0; i < 10; i++) {
|
|
118
|
+
items.add('item' + i);
|
|
119
|
+
}
|
|
120
|
+
String result = String.join(items, ',');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
126
|
+
// DATA STRUCTURE BENCHMARK
|
|
127
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Compare List vs Set vs Map lookup performance
|
|
131
|
+
*
|
|
132
|
+
* Expected Results:
|
|
133
|
+
* List.contains(): O(n) - slow
|
|
134
|
+
* Set.contains(): O(1) - fast
|
|
135
|
+
* Map.containsKey(): O(1) - fast
|
|
136
|
+
*/
|
|
137
|
+
public class DataStructureBenchmark {
|
|
138
|
+
|
|
139
|
+
private static final Integer DATA_SIZE = 1000;
|
|
140
|
+
private static final Integer LOOKUPS = 5000;
|
|
141
|
+
|
|
142
|
+
public static void run() {
|
|
143
|
+
// Setup test data
|
|
144
|
+
List<String> testList = new List<String>();
|
|
145
|
+
Set<String> testSet = new Set<String>();
|
|
146
|
+
Map<String, Boolean> testMap = new Map<String, Boolean>();
|
|
147
|
+
|
|
148
|
+
for (Integer i = 0; i < DATA_SIZE; i++) {
|
|
149
|
+
String key = 'key_' + i;
|
|
150
|
+
testList.add(key);
|
|
151
|
+
testSet.add(key);
|
|
152
|
+
testMap.put(key, true);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Random lookup keys (mix of existing and non-existing)
|
|
156
|
+
List<String> lookupKeys = new List<String>();
|
|
157
|
+
for (Integer i = 0; i < LOOKUPS; i++) {
|
|
158
|
+
lookupKeys.add('key_' + Math.mod(i * 7, DATA_SIZE * 2));
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
System.debug('═══════════════════════════════════════════════════════');
|
|
162
|
+
System.debug('DATA STRUCTURE LOOKUP BENCHMARK');
|
|
163
|
+
System.debug('Data Size: ' + DATA_SIZE + ' | Lookups: ' + LOOKUPS);
|
|
164
|
+
System.debug('═══════════════════════════════════════════════════════');
|
|
165
|
+
|
|
166
|
+
// List.contains()
|
|
167
|
+
Long startList = System.currentTimeMillis();
|
|
168
|
+
for (String key : lookupKeys) {
|
|
169
|
+
Boolean found = testList.contains(key);
|
|
170
|
+
}
|
|
171
|
+
Long durationList = System.currentTimeMillis() - startList;
|
|
172
|
+
|
|
173
|
+
// Set.contains()
|
|
174
|
+
Long startSet = System.currentTimeMillis();
|
|
175
|
+
for (String key : lookupKeys) {
|
|
176
|
+
Boolean found = testSet.contains(key);
|
|
177
|
+
}
|
|
178
|
+
Long durationSet = System.currentTimeMillis() - startSet;
|
|
179
|
+
|
|
180
|
+
// Map.containsKey()
|
|
181
|
+
Long startMap = System.currentTimeMillis();
|
|
182
|
+
for (String key : lookupKeys) {
|
|
183
|
+
Boolean found = testMap.containsKey(key);
|
|
184
|
+
}
|
|
185
|
+
Long durationMap = System.currentTimeMillis() - startMap;
|
|
186
|
+
|
|
187
|
+
// Results
|
|
188
|
+
System.debug('\nRESULTS:');
|
|
189
|
+
System.debug('List.contains(): ' + durationList + 'ms');
|
|
190
|
+
System.debug('Set.contains(): ' + durationSet + 'ms');
|
|
191
|
+
System.debug('Map.containsKey(): ' + durationMap + 'ms');
|
|
192
|
+
|
|
193
|
+
if (durationList > 0) {
|
|
194
|
+
System.debug('\nSet is ' + (durationList / Math.max(1, durationSet)) + 'x faster than List');
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
201
|
+
// LOOP STYLE BENCHMARK
|
|
202
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Compare different loop constructs
|
|
206
|
+
*
|
|
207
|
+
* Expected Results (from documented Apex loop benchmarks):
|
|
208
|
+
* While loop: ~0.4s (fastest)
|
|
209
|
+
* Cached iterator: ~0.8s
|
|
210
|
+
* For loop (index): ~1.4s
|
|
211
|
+
* Enhanced for-each: ~2.4s
|
|
212
|
+
*/
|
|
213
|
+
public class LoopBenchmark {
|
|
214
|
+
|
|
215
|
+
private static final Integer ITERATIONS = 10000;
|
|
216
|
+
|
|
217
|
+
public static void run() {
|
|
218
|
+
// Create test data
|
|
219
|
+
List<Integer> numbers = new List<Integer>();
|
|
220
|
+
for (Integer i = 0; i < 1000; i++) {
|
|
221
|
+
numbers.add(i);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
System.debug('═══════════════════════════════════════════════════════');
|
|
225
|
+
System.debug('LOOP STYLE BENCHMARK');
|
|
226
|
+
System.debug('Outer Iterations: ' + ITERATIONS + ' | List Size: ' + numbers.size());
|
|
227
|
+
System.debug('═══════════════════════════════════════════════════════');
|
|
228
|
+
|
|
229
|
+
// While loop with iterator
|
|
230
|
+
Long startWhile = System.currentTimeMillis();
|
|
231
|
+
for (Integer outer = 0; outer < ITERATIONS; outer++) {
|
|
232
|
+
Iterator<Integer> iter = numbers.iterator();
|
|
233
|
+
while (iter.hasNext()) {
|
|
234
|
+
Integer num = iter.next();
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
Long durationWhile = System.currentTimeMillis() - startWhile;
|
|
238
|
+
|
|
239
|
+
// Traditional for loop
|
|
240
|
+
Long startFor = System.currentTimeMillis();
|
|
241
|
+
for (Integer outer = 0; outer < ITERATIONS; outer++) {
|
|
242
|
+
for (Integer i = 0; i < numbers.size(); i++) {
|
|
243
|
+
Integer num = numbers[i];
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
Long durationFor = System.currentTimeMillis() - startFor;
|
|
247
|
+
|
|
248
|
+
// Enhanced for-each
|
|
249
|
+
Long startEnhanced = System.currentTimeMillis();
|
|
250
|
+
for (Integer outer = 0; outer < ITERATIONS; outer++) {
|
|
251
|
+
for (Integer num : numbers) {
|
|
252
|
+
// Just iterate
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
Long durationEnhanced = System.currentTimeMillis() - startEnhanced;
|
|
256
|
+
|
|
257
|
+
// Results
|
|
258
|
+
System.debug('\nRESULTS:');
|
|
259
|
+
System.debug('While loop: ' + durationWhile + 'ms');
|
|
260
|
+
System.debug('For loop: ' + durationFor + 'ms');
|
|
261
|
+
System.debug('Enhanced for: ' + durationEnhanced + 'ms');
|
|
262
|
+
|
|
263
|
+
System.debug('\n📊 Analysis:');
|
|
264
|
+
Long fastest = Math.min(durationWhile, Math.min(durationFor, durationEnhanced));
|
|
265
|
+
if (durationWhile == fastest) {
|
|
266
|
+
System.debug('🏆 While loop is fastest');
|
|
267
|
+
} else if (durationFor == fastest) {
|
|
268
|
+
System.debug('🏆 For loop is fastest');
|
|
269
|
+
} else {
|
|
270
|
+
System.debug('🏆 Enhanced for is fastest');
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
277
|
+
// STRING BENCHMARK (demonstrates 22x improvement)
|
|
278
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* String concatenation vs String.join()
|
|
282
|
+
*
|
|
283
|
+
* Expected Results (from documented Apex benchmarks):
|
|
284
|
+
* Concatenation: 11,767ms for 1,750 items (CPU LIMIT)
|
|
285
|
+
* String.join(): 539ms for 7,500 items (still running)
|
|
286
|
+
* Improvement: ~22x faster
|
|
287
|
+
*/
|
|
288
|
+
public class StringBenchmark {
|
|
289
|
+
|
|
290
|
+
public static void run() {
|
|
291
|
+
System.debug('═══════════════════════════════════════════════════════');
|
|
292
|
+
System.debug('STRING BUILDING BENCHMARK');
|
|
293
|
+
System.debug('═══════════════════════════════════════════════════════');
|
|
294
|
+
|
|
295
|
+
// Test with safe number of items
|
|
296
|
+
Integer itemCount = 500;
|
|
297
|
+
|
|
298
|
+
// Method 1: String concatenation (BAD)
|
|
299
|
+
Long startConcat = System.currentTimeMillis();
|
|
300
|
+
String resultConcat = '';
|
|
301
|
+
for (Integer i = 0; i < itemCount; i++) {
|
|
302
|
+
resultConcat += 'Item_' + i + '_Name\n';
|
|
303
|
+
}
|
|
304
|
+
Long durationConcat = System.currentTimeMillis() - startConcat;
|
|
305
|
+
|
|
306
|
+
// Method 2: String.join() (GOOD)
|
|
307
|
+
Long startJoin = System.currentTimeMillis();
|
|
308
|
+
List<String> items = new List<String>();
|
|
309
|
+
for (Integer i = 0; i < itemCount; i++) {
|
|
310
|
+
items.add('Item_' + i + '_Name');
|
|
311
|
+
}
|
|
312
|
+
String resultJoin = String.join(items, '\n');
|
|
313
|
+
Long durationJoin = System.currentTimeMillis() - startJoin;
|
|
314
|
+
|
|
315
|
+
// Results
|
|
316
|
+
System.debug('\nRESULTS (' + itemCount + ' items):');
|
|
317
|
+
System.debug('String +=: ' + durationConcat + 'ms');
|
|
318
|
+
System.debug('String.join(): ' + durationJoin + 'ms');
|
|
319
|
+
|
|
320
|
+
if (durationJoin > 0 && durationConcat > durationJoin) {
|
|
321
|
+
System.debug('\n🏆 String.join() is ' + (durationConcat / durationJoin) + 'x faster!');
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
System.debug('\n⚠️ WARNING: With larger datasets, concatenation hits CPU limit!');
|
|
325
|
+
System.debug(' Documented benchmark: 11,767ms for 1,750 items (concat) vs 539ms for 7,500 items (join)');
|
|
326
|
+
}
|
|
327
|
+
}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CPU TIME AND HEAP SIZE OPTIMIZATION PATTERNS
|
|
3
|
+
*
|
|
4
|
+
* CPU Limits:
|
|
5
|
+
* - Synchronous: 10,000 ms
|
|
6
|
+
* - Asynchronous: 60,000 ms
|
|
7
|
+
*
|
|
8
|
+
* Heap Limits:
|
|
9
|
+
* - Synchronous: 6 MB
|
|
10
|
+
* - Asynchronous: 12 MB
|
|
11
|
+
*
|
|
12
|
+
* This template demonstrates optimization patterns for CPU and heap limits.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
16
|
+
// CPU OPTIMIZATION: ALGORITHM COMPLEXITY
|
|
17
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
18
|
+
|
|
19
|
+
public class CPUOptimization {
|
|
20
|
+
|
|
21
|
+
// BEFORE: O(n²) - Nested loops are expensive
|
|
22
|
+
public void findDuplicatesBAD(List<Contact> contacts) {
|
|
23
|
+
List<Contact> duplicates = new List<Contact>();
|
|
24
|
+
|
|
25
|
+
for (Integer i = 0; i < contacts.size(); i++) {
|
|
26
|
+
for (Integer j = i + 1; j < contacts.size(); j++) {
|
|
27
|
+
if (contacts[i].Email == contacts[j].Email) {
|
|
28
|
+
duplicates.add(contacts[j]);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// AFTER: O(n) - Use Map for lookups
|
|
35
|
+
public List<Contact> findDuplicatesGOOD(List<Contact> contacts) {
|
|
36
|
+
Map<String, Contact> emailToContact = new Map<String, Contact>();
|
|
37
|
+
List<Contact> duplicates = new List<Contact>();
|
|
38
|
+
|
|
39
|
+
for (Contact c : contacts) {
|
|
40
|
+
if (c.Email == null) continue;
|
|
41
|
+
|
|
42
|
+
String normalizedEmail = c.Email.toLowerCase();
|
|
43
|
+
if (emailToContact.containsKey(normalizedEmail)) {
|
|
44
|
+
duplicates.add(c);
|
|
45
|
+
} else {
|
|
46
|
+
emailToContact.put(normalizedEmail, c);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return duplicates;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// BEFORE: Expensive string concatenation in loop
|
|
54
|
+
public String buildReportBAD(List<Account> accounts) {
|
|
55
|
+
String report = '';
|
|
56
|
+
for (Account acc : accounts) {
|
|
57
|
+
report += acc.Name + '\n'; // Creates new string each iteration!
|
|
58
|
+
}
|
|
59
|
+
return report;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// AFTER: Use List and join
|
|
63
|
+
public String buildReportGOOD(List<Account> accounts) {
|
|
64
|
+
List<String> lines = new List<String>();
|
|
65
|
+
for (Account acc : accounts) {
|
|
66
|
+
lines.add(acc.Name);
|
|
67
|
+
}
|
|
68
|
+
return String.join(lines, '\n');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
73
|
+
// CPU OPTIMIZATION: CACHING
|
|
74
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
75
|
+
|
|
76
|
+
public class CachingPatterns {
|
|
77
|
+
|
|
78
|
+
// Cache expensive calculations
|
|
79
|
+
private static Map<String, Decimal> calculationCache = new Map<String, Decimal>();
|
|
80
|
+
|
|
81
|
+
public static Decimal getDiscountRate(String productCode, String region) {
|
|
82
|
+
String cacheKey = productCode + ':' + region;
|
|
83
|
+
|
|
84
|
+
if (calculationCache.containsKey(cacheKey)) {
|
|
85
|
+
return calculationCache.get(cacheKey); // Cache hit - no CPU cost
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Expensive calculation only happens once per unique key
|
|
89
|
+
Decimal rate = performExpensiveCalculation(productCode, region);
|
|
90
|
+
calculationCache.put(cacheKey, rate);
|
|
91
|
+
|
|
92
|
+
return rate;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private static Decimal performExpensiveCalculation(String productCode, String region) {
|
|
96
|
+
// Simulate complex calculation
|
|
97
|
+
return 0.15;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Platform Cache for cross-transaction caching
|
|
101
|
+
public static Decimal getDiscountRateWithPlatformCache(String productCode, String region) {
|
|
102
|
+
String cacheKey = 'discount_' + productCode + '_' + region;
|
|
103
|
+
|
|
104
|
+
// Try to get from Platform Cache (Org partition)
|
|
105
|
+
Cache.OrgPartition orgPart = Cache.Org.getPartition('local.DiscountCache');
|
|
106
|
+
Decimal cachedRate = (Decimal)orgPart.get(cacheKey);
|
|
107
|
+
|
|
108
|
+
if (cachedRate != null) {
|
|
109
|
+
return cachedRate;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Calculate and cache
|
|
113
|
+
Decimal rate = performExpensiveCalculation(productCode, region);
|
|
114
|
+
orgPart.put(cacheKey, rate, 3600); // Cache for 1 hour
|
|
115
|
+
|
|
116
|
+
return rate;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
121
|
+
// HEAP OPTIMIZATION: LARGE DATA PROCESSING
|
|
122
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
123
|
+
|
|
124
|
+
public class HeapOptimization {
|
|
125
|
+
|
|
126
|
+
// BEFORE: Loads all records into heap at once
|
|
127
|
+
public void processAllAccountsBAD() {
|
|
128
|
+
List<Account> allAccounts = [SELECT Id, Name FROM Account]; // Could be millions!
|
|
129
|
+
|
|
130
|
+
for (Account acc : allAccounts) {
|
|
131
|
+
// Process each account
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// AFTER: SOQL FOR loop - streams records, doesn't load all into heap
|
|
136
|
+
public void processAllAccountsGOOD() {
|
|
137
|
+
for (Account acc : [SELECT Id, Name FROM Account]) {
|
|
138
|
+
// Each record is loaded individually
|
|
139
|
+
// Previous record can be garbage collected
|
|
140
|
+
processAccount(acc);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
private void processAccount(Account acc) {
|
|
145
|
+
// Process single account
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// AFTER: Batch processing for very large datasets
|
|
149
|
+
public void processAllAccountsBATCH() {
|
|
150
|
+
// Use Database.executeBatch for millions of records
|
|
151
|
+
Database.executeBatch(new AccountProcessorBatch(), 200);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Batch class for large datasets
|
|
156
|
+
public class AccountProcessorBatch implements Database.Batchable<SObject> {
|
|
157
|
+
|
|
158
|
+
public Database.QueryLocator start(Database.BatchableContext bc) {
|
|
159
|
+
return Database.getQueryLocator('SELECT Id, Name FROM Account');
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
public void execute(Database.BatchableContext bc, List<Account> scope) {
|
|
163
|
+
// Process 200 records at a time (controlled heap usage)
|
|
164
|
+
for (Account acc : scope) {
|
|
165
|
+
// Process each account
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
public void finish(Database.BatchableContext bc) {
|
|
170
|
+
// Optional: Send completion notification
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
175
|
+
// HEAP OPTIMIZATION: CLEARING REFERENCES
|
|
176
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
177
|
+
|
|
178
|
+
public class HeapClearingPatterns {
|
|
179
|
+
|
|
180
|
+
// Clear large collections when no longer needed
|
|
181
|
+
public void processWithClearing() {
|
|
182
|
+
// Phase 1: Query and process
|
|
183
|
+
List<Account> accounts = [SELECT Id, Name FROM Account LIMIT 10000];
|
|
184
|
+
Map<Id, String> accountNames = new Map<Id, String>();
|
|
185
|
+
|
|
186
|
+
for (Account acc : accounts) {
|
|
187
|
+
accountNames.put(acc.Id, acc.Name);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Clear the original list - no longer needed
|
|
191
|
+
accounts.clear();
|
|
192
|
+
accounts = null;
|
|
193
|
+
|
|
194
|
+
// Phase 2: Use the map
|
|
195
|
+
for (Id accId : accountNames.keySet()) {
|
|
196
|
+
// Process using map
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Clear the map when done
|
|
200
|
+
accountNames.clear();
|
|
201
|
+
accountNames = null;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Use transient for Visualforce controllers
|
|
205
|
+
public class LargeDataController {
|
|
206
|
+
// transient = not stored in view state, reduces heap in page transitions
|
|
207
|
+
transient public List<Account> largeAccountList { get; set; }
|
|
208
|
+
|
|
209
|
+
public LargeDataController() {
|
|
210
|
+
largeAccountList = [SELECT Id, Name FROM Account LIMIT 5000];
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
216
|
+
// CPU OPTIMIZATION: ASYNC PROCESSING
|
|
217
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
218
|
+
|
|
219
|
+
public class AsyncProcessingPatterns {
|
|
220
|
+
|
|
221
|
+
// Move expensive operations to @future
|
|
222
|
+
@future
|
|
223
|
+
public static void processExpensiveOperation(Set<Id> recordIds) {
|
|
224
|
+
// Has 60 second CPU limit instead of 10 seconds
|
|
225
|
+
for (Id recordId : recordIds) {
|
|
226
|
+
// Expensive processing
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Use Queueable for chained processing
|
|
231
|
+
public class ExpensiveQueueable implements Queueable {
|
|
232
|
+
private List<Id> recordIds;
|
|
233
|
+
|
|
234
|
+
public ExpensiveQueueable(List<Id> recordIds) {
|
|
235
|
+
this.recordIds = recordIds;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
public void execute(QueueableContext context) {
|
|
239
|
+
// Process first batch
|
|
240
|
+
List<Id> batch = new List<Id>();
|
|
241
|
+
List<Id> remaining = new List<Id>();
|
|
242
|
+
|
|
243
|
+
for (Integer i = 0; i < recordIds.size(); i++) {
|
|
244
|
+
if (i < 100) {
|
|
245
|
+
batch.add(recordIds[i]);
|
|
246
|
+
} else {
|
|
247
|
+
remaining.add(recordIds[i]);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Process this batch
|
|
252
|
+
processBatch(batch);
|
|
253
|
+
|
|
254
|
+
// Chain next batch if needed
|
|
255
|
+
if (!remaining.isEmpty()) {
|
|
256
|
+
System.enqueueJob(new ExpensiveQueueable(remaining));
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
private void processBatch(List<Id> batch) {
|
|
261
|
+
// Process 100 records
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
267
|
+
// PATTERN: LIMITS MONITORING
|
|
268
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
269
|
+
|
|
270
|
+
public class LimitsMonitoring {
|
|
271
|
+
|
|
272
|
+
// Check limits during execution
|
|
273
|
+
public void processWithLimitChecking(List<Account> accounts) {
|
|
274
|
+
Integer cpuWarning = 8000; // 80% of 10,000ms limit
|
|
275
|
+
Integer heapWarning = 4800000; // 80% of 6MB limit
|
|
276
|
+
|
|
277
|
+
for (Account acc : accounts) {
|
|
278
|
+
// Check CPU limit
|
|
279
|
+
if (Limits.getCpuTime() > cpuWarning) {
|
|
280
|
+
System.debug(LoggingLevel.WARN,
|
|
281
|
+
'CPU limit approaching: ' + Limits.getCpuTime() + 'ms');
|
|
282
|
+
// Consider switching to async
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Check heap limit
|
|
287
|
+
if (Limits.getHeapSize() > heapWarning) {
|
|
288
|
+
System.debug(LoggingLevel.WARN,
|
|
289
|
+
'Heap limit approaching: ' + Limits.getHeapSize() + ' bytes');
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
processAccount(acc);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Debug helper: Print all limits
|
|
298
|
+
public static void debugLimits() {
|
|
299
|
+
System.debug('=== GOVERNOR LIMITS ===');
|
|
300
|
+
System.debug('SOQL Queries: ' + Limits.getQueries() + '/' + Limits.getLimitQueries());
|
|
301
|
+
System.debug('DML Statements: ' + Limits.getDmlStatements() + '/' + Limits.getLimitDmlStatements());
|
|
302
|
+
System.debug('DML Rows: ' + Limits.getDmlRows() + '/' + Limits.getLimitDmlRows());
|
|
303
|
+
System.debug('CPU Time: ' + Limits.getCpuTime() + '/' + Limits.getLimitCpuTime());
|
|
304
|
+
System.debug('Heap Size: ' + Limits.getHeapSize() + '/' + Limits.getLimitHeapSize());
|
|
305
|
+
System.debug('Callouts: ' + Limits.getCallouts() + '/' + Limits.getLimitCallouts());
|
|
306
|
+
}
|
|
307
|
+
}
|