From e4fd59ae9fb6a5ecaf197a71bab73d3e2477727b Mon Sep 17 00:00:00 2001 From: Johannes Vogt Date: Wed, 26 Nov 2025 16:54:11 +0100 Subject: [PATCH 01/47] initial cxl diagrams --- cds/assets/cxl.excalidraw.svg | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 cds/assets/cxl.excalidraw.svg diff --git a/cds/assets/cxl.excalidraw.svg b/cds/assets/cxl.excalidraw.svg new file mode 100644 index 0000000000..9d5a50ab38 --- /dev/null +++ b/cds/assets/cxl.excalidraw.svg @@ -0,0 +1,4 @@ + + +eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1dW1dcIkuyfp9f0avPedzUych7zpt3UVtcdTAwMTTvzprlQkBBuVx0XGLqWfPfT1x1MDAwNLpcdTAwMDWqsopbadNnwew9u1x1MDAxYjDNqor44ovIuPzvP378+Nl9bZV//vPHz/JLsVCrltqF/s+/6P1eud2pNlx1MDAxYvhcdTAwMTFcdTAwMWb8vdN8blx1MDAxN1x1MDAwN9+sdLutzj//53+GP1x1MDAxMVx1MDAxNJv1958q18r1cqPbwe/9XHUwMDBi//7jx/9cdTAwMGX+XHUwMDFmP6mW6GefO1f154vLk7o8L62fPLywW2b3XHUwMDA2Pzr40t+baZeL3ULjvlZcdTAwMWV+9ILvXHUwMDBixVx1MDAwM8GscsKoz1x1MDAwZl7pXHUwMDAzXHUwMDA2gTNcXCvNh1x1MDAxZvSrpW5cdTAwMDU/XHUwMDA0XHKBMlx1MDAxNkY+qpSr95UufiZtMPgp6T5en195//X//ME+3+l0283H8kaz1mzTXHUwMDFl/1x1MDAwYsr0v+FcdTAwMGVvXHUwMDBixcf7dvO5Ufr8TrddaHRahTbekuH37qq12kn3dbA63la8hT9Dv+PiY+c89H7cT+Evva80ylx1MDAxZLrt8Plus1UoVrt0e4Bccq+CdtjKllx1MDAwNk/o38M9tVx1MDAwYvVyllx1MDAxZVHjuVb7fLvaKJXpxv+8XHUwMDE1XHUwMDFiY7+uUfr4dX8/3+HDXHUwMDEzXHUwMDFm7/xnuPlymVa2xjgumNafXHUwMDFmXGZlTKnwm4fNxkDcwODz0UK54SVUO5soZ93BoneFWqc8fFx1MDAwNLSzrbBcZo7K4ZiYdcsvw+cyXCKlXHUwMDBm27WT/IPebT6dPjSKta12PXeifn5+7z9cdTAwMWZ/XHUwMDFh3r7nVqnwvlx1MDAxZtyuXHUwMDA0bTXnkonPz2vVxmP43taaxcfhJfxj5JaFdMa/m4jOjF3MQF0k2MBcbqM16lx1MDAwYlfK6nGdXHUwMDAxXHUwMDExaKaktiaqM9xcdTAwMDZcbpwzqGjSWo7KXHUwMDEz1Z1cdTAwMTF9WinLuLJs+pVl7OtcdTAwMWZawUFcdTAwMThcdTAwMDBuR+R7XHUwMDA0eiO68qlcdTAwMTYgNGhSjTnUYmxcdTAwMWaLy+5QXHUwMDE0SVx1MDAwNFx1MDAwN/B9N/JcdTAwMDSbje5J9Y02zdnYu9uFerVGt1xcja2wVqve08X/LOJ2y+2fo7egW0Wb8/mFerVUXHUwMDFhtVx1MDAxMUVcXLRQbZTb2WmMTbNdva82XG61U9+uXHUwMDBiz91mvtx533e3/VxcXHUwMDFlvVx1MDAxZuXdv3VcdTAwMDBcdTAwMDKuXHUwMDEyVDcnd5umenTP1s7Wj4/5Re7gVp5Nb+4kXHUwMDBitFx1MDAwMVx1MDAxYjJ2XHUwMDBlVICPn49ZtJWxS1N/t1x1MDAxNjZ2XFwqYMpr61DhY7WaI4GxzM6j1HPauktTdqbwcMrKvbvKNVx1MDAxY+1VMupuRlunRi9pIVvn3800to6ZgDPmXHUwMDE0Q/iK2DrHdWCkZmPEcWXrUtGV7eltnVNSXHRujPRpXHUwMDA1s3FaIZVcdTAwMTGcwVxcpu5faVxu7rJcdTAwMWG6XHRm5lx1MDAxYlxm3c7Wr19XVzuX7We93ejkjkSmv1+L6m25Vqu2OiEzJ1x1MDAwNSogXHUwMDFit1nvwil4XHUwMDAwKC2OcSF9mlx1MDAwYrSrqLJcdTAwMDJcdTAwMGKEY3qls7E6uzOtfeNx9lxywDppjfPqclx1MDAxMm1FiEZlTtObe5dAd1I8uL7sb0i3dXF5fPS6X2ruZ8dcct7fUlhot5v9XHUwMDExXHUwMDEz91fSuuVcdTAwMTfTeaw1f3VOlGqctXbr13vr6ymsu1e8q93KraNtvVnLKbH/tM03nqdbd7JJtlx1MDAxYzm8XHUwMDFj1eT5TXLyXHJcYm1yXFyxlVxuXHUwMDFjXHUwMDA3plGTjVDGiJB+IyE1XHUwMDBl7YFAw4B/4Vx1MDAxMVx1MDAwNbcqXHUwMDEwXGaUU1x1MDAxY5mR5Nz4lN2Qk2sl+lBcYlx1MDAxONroldbHaP3hwlqPj1x1MDAwMVx1MDAxZqpcdTAwMTBcdTAwMTCx1bRFXHUwMDE5wYK/1Z4zdHBBMzOP2id7q4Y74WBcdTAwMDZR/3y71ayGcWX4p1x1MDAxZkOpXHUwMDE5/OXzz//+y/ttXHUwMDBlgUDXynJcdTAwMTOSVHpZXHUwMDEzaMXEUEQnrVx1MDAxNiv39IpK/HC5XGI0dLqFdndcdTAwMWSFoNq4XHUwMDFmf9ZcdTAwMWah2uxcdTAwMTT2XHUwMDFiv11vllx1MDAwNmLbbN9WR/1cYlSFl3LpiG7l2J3EW4aM20pcdTAwMGJIxiWz+F83dkPR5DOIbHwoceVGabjtcTJJl7RGcFMpXHUwMDE3XCLyjj83+llcdTAwMTiXyrXbZn8q3Dt8vdzaL+093tqn86urTDbTO9grTklplIJgPFx1MDAxOD3QYeAmwFx1MDAwN2qYddZLaFx1MDAxMCyDMVx1MDAxZuVcdTAwMTPmXHUwMDE0OjBqxWpcdTAwMTLxLbcwvmmnnLCMXHUwMDBmr2pcYm/Whd/8RDdcdTAwMDBcdTAwMTCSMfaNbnsrf31tXHUwMDBmXHUwMDBlNuX12dWxulW152p2Y1ruoSv123Zv54bbrYPejiuL8t25SYd7XHUwMDE4MvcuLe7hv8qIXHUwMDBlRsNcdTAwMDFaQGBcdTAwMDFJXHUwMDA3oOlxXHUwMDE2QsxcdTAwMDMkRz1Dj0Oj08GNNFx1MDAxMU1ULJDKuVDIYFx1MDAxNVx1MDAwZpishUczxFx1MDAwM1x1MDAxY51OMPCFvmOjXHUwMDAxnCGbZGBH6GJqXFxCXHUwMDFhkGxcdTAwMDbRXHUwMDFkSuKHa/3fnXJtKUJcdTAwMDJcdTAwMTOsVzgkXHUwMDEw2nc6QYHzO9Yvr29f9673b2xBr1+e3D/kprWgXHUwMDEySVx1MDAwZY/GXHUwMDA0uFx1MDAxMFx1MDAwMT6kqGquTGhcdTAwMWHKe7y4i8CUVZxZ41NqULGhb6lQXHUwMDA353NcdTAwMTDmNKGH1cp9tnd0WdvoX5c2bvhhrtRk3+C+J657dFxuO9VmMdMr6NfN19bj7lv/vJueadZcXPNRXZ7fNPvv3jSmmbGAodsvleSOKVx1MDAxNVZw6Vx1MDAwMsXRKGijmNc042VcdTAwMDTcOMe5tFxuLbzSUV1fqXisiuent8+CjkW0Ul77nHCIxVx1MDAxZFDGgZxHl1x1MDAxM6JaXHUwMDA2zf5cYrDPYZ5PXHUwMDBit7XyXHUwMDBmtKGFzjJcdTAwMTjpXHRcdTAwMDYybKS9u0/HVCfDWXKQT1x1MDAwNFx1MDAwMM4qNKxGXHUwMDAxXHUwMDFiiu27wFwikUYhwo+VRdWWQ1o3XHUwMDEy42NcdTAwMWNcdTAwMWOTVjKk5J5cdTAwMTBcdTAwMWaalFx1MDAwMFx1MDAxY0KXw3/QRqxcInxxun22sPlcdTAwMDYjXHUwMDE1PUfhNd88lpVbsIxJmT4nt1xcKTNcdTAwMTcnTzu+p5RDRipcdTAwMDWaXHUwMDFkZ51cdTAwMWP9cdAsUHTXrNSSXHUwMDAyXGKTlotcdTAwMTP6wa9cbov7cLGIif+t4T20XHJcdTAwMDJNtWRcdTAwMTLUMGTy/uEs0b24XSfD41xcu84g91x1MDAxMMDJg/z8J7xzblx1MDAxOT5fI/FRWi1kwlV8UyTy5KByeJu1u1x1MDAxY3Knledm/UVcdTAwMWY281FwjslcIkJcYnZcdTAwMDE5zFx1MDAwMlx1MDAwNYs5OUJcdTAwMDDfYVx1MDAwN1QgXHUwMDFjSprlgDA9ckizyilKXHUwMDEzm89cdTAwMTfOKVx1MDAwMpDScTDe8KSQXHUwMDExxP5cdTAwMWKbXHUwMDA1pdCisn5jeLKu1m9zz7/Kleb1ZfF8q/58/WROp/WBWr1cdTAwMDPI5Sql9lY9W7mVJzebXHUwMDA1fpWCb1U7z+91XHUwMDFh2euGdFc3pnRb3Wvnz1NYd/dq5zZ3dPrWPm3nLpXZrVx1MDAxN7eO6yms23spXdzt13OHXHUwMDFkVn/rZTNcdTAwMGaVQ5XGfjtdyMJVq53lmfK1arHbl4ubYlxu6y5wXHUwMDA0XHUwMDFmMWxcdTAwMTHfVVitYVx1MDAxNlx1MDAxZZBcdTAwMDCoyVx1MDAxYk1ku2joXHJcdTAwMWFsRmSWXHUwMDBiXHUwMDE3XHUwMDBlLKMxXHUwMDBmXHUwMDEwLlx1MDAxOeqoXHUwMDExmnFPYNmawGl0j5AmgGF6yKiGgapAOoOMWqGrrI1cdTAwMWM53VxcYWpcYlNtXG7xKrT1lJfmS2RcdTAwMTE69tBcdTAwMDcpn2XS8LlcdTAwMGV9kigviTp3YpZcdTAwMTOUr6G8sZI6+DAso0tKUomHhvhcdTAwMWTu2Grk8YJcYrY1i7LUZHY257aFQ19cdTAwMDOMY4xcdDo8XHUwMDFmv1x1MDAwNLxcdTAwMDIwljOkW1x1MDAxYSFIJFxcQppcdTAwMTT18/16s1f+VX3feuei2q18iPZcdTAwMTTQ6ydcdTAwMDZcdTAwMTHojYZcclx1MDAxMVNl4IBcYixcdTAwMTJRrURcdTAwMTh5uUGXXG5ZXHUwMDBlM3E0VkBcdTAwMDDowzltXHUwMDE1XHUwMDA1qYcu3CpuOFx1MDAwNdZeTFx1MDAxZjdcdTAwMDQgb1x1MDAwMy2kL4ggRmxmXHUwMDE4U9Gt1oo7Nk9cdTAwMTghPnL4gahcdTAwMGKVtLRcbt1KplO+r48/yd9cdTAwMTY6nOBcdTAwMTOGQ4f+7adcdTAwMTM7vNytP5yt2adS57GYyW2uidtyrzK1eyq0XG6sUVxcSpAskjEjgaPv6uSqtvMrVftycddcdTAwMTSZgMVcdTAwMDfhvOnALp5FXHUwMDAxMlx1MDAwYqfnXHUwMDBiXHUwMDFjzumbPr3wh73dq4rZvStcdTAwMTVcdTAwMGUvoX1+/spmSa91QHVcIimdo/l3M4VBRC8kYEhjXHUwMDE0XHUwMDEyXHUwMDA1tIachVxmouQyXHUwMDEwknNLJ2Q+1VmZw1x1MDAxZlx1MDAwYujM1SzmkElcdTAwMDbKnypv4nXDXHUwMDE4a5xcdTAwMDCZct3L7OK79NZwglx0+k5raPZL93u504uz10z+2olOQ11UmlMmvUhlXHUwMDAzsMb4bSE6qVx1MDAwMSq7cLGVbKt6mDmV+XrhMFx1MDAwMsIno1x1MDAxYVx1MDAwNm/BJ49ccs1cInGRoEC4YVx1MDAxOCilepjLx41t6N1vb5XuXHUwMDFhx7tcdTAwMWL27OC50lx1MDAxZjeHc1x1MDAwNfleT1xcycBe/rh3Udh8655sVKotnlaQj0vLbVpcdConT8X+OXB90GOXlVq/9lxcznWmVESNziRqoEFywrhAhlx1MDAxMtJETsd9wlx0XHRU0KSjhSvc2MBRsFx1MDAxZaktY2OpwZ9qqekrIUVfKea4Yt6mXHUwMDEw33NgJZpS36GJXHUwMDE2sVx1MDAwN9poJUFcdTAwMGL3ncT02eaKh/bS3b5cdTAwMTRcdTAwMWbg8bV4qbqOT6uXL+3e7as83Th43S7082ubveahPlxcen1XSP1TapPiv3tTXHUwMDEwaT1cYixcdTAwMTmntFx1MDAwNtB8pFwi+MPs8kBcdTAwMWKGvEkwUteosoNcdTAwMTX4XHJcboZcbqnxXHUwMDBmvlx1MDAxNJaVisepeHFcdTAwMDZcIm2UY0IrXHUwMDFmkdY8NiHNKWUoXHUwMDExKe2o0szSXHUwMDFi4dF495+L3ed2uZT5iCkvXHUwMDAzm55gOcNsOulcItLh1Pl8b3f38ax+0N6p8Varc/y2d388rSlcdTAwMTfoXHUwMDA2c41Ij8Q6aso1t4HUUilcdTAwMTdryiX62eq96djAlFx1MDAwZp/40JTLQItQq5aVno/reWlhU1x1MDAwZYpcdTAwMTFX5l79NzaWZHOgdGGjv7M+65a3a792r6uv51uVLXXyq3pz1G1Oa3O/iruL0vV5p6NfcvdHuDo/l+f9+ynrvlx1MDAxMteF/kH5rJKtlXqHzZ2TrbXKYetpZ1x1MDAxOTmC/6lMw1x1MDAxMZxcdTAwMGKUsI5xhkBi7VBcdTAwMDLfUURcIopcYvzIUCrcUIOGjjlcdTAwMGKQYThcdTAwMDbAkUVo6zn1X1GEWOgoz0BcdTAwMTGE04PzaF+FOnpcdTAwMDGxXHUwMDE4QebBmCXkXGKFTqdZrFx1MDAxNrp0XHRLQFx1MDAwZSbY4jA58O4+XHUwMDFkVtBVW2zfXHUwMDFlVbpcdTAwMWP22oXsQ26v3+9Oo8yWXG7oldPgvEdOZlB5hlwixCGmxIzZQCs3qGlHrV5p82zafDe9NmvkZc7IqNrSZ1x1MDAxMH7zM6jm8NmIOVx0f2I2uuOGXHUwMDBit1Do/DS3mfvnj/VyXHUwMDE3tfBHXHUwMDAz71UqlSi18l03Qae7zVacQo/tPVJxkrDZlFx1MDAwZY9cdTAwMTOpTmIqnkGbi8rHgTJilVx1MDAxOe/4Rm0nXHUwMDAyYdAyI7lcdTAwMDcxXHUwMDFhYP00ylJcdTAwMDdAXHUwMDFlvULaTk/X0/fN6UAw9DlcdTAwMDdr4JqrVLw4rb5PIVKnLSqYlb5cdTAwMTi6i9V2jsSLXHUwMDFh96Wfhze/7U41XHUwMDBmL15O6Vx1MDAxNZHQ4XJcdTAwMTFuPWVcIl7yXHUwMDEx1o95q0XwXHUwMDFhXHUwMDA0euBcdTAwMWOVUlxmb+v7p2mUiyQzk7m2TeVcIiRcXIpLZSSiXGZcdTAwMDM9LFh937p0zOLDkdJKcFp9W8HI5/tcdTAwMGJk4yU7hEnoayVcdTAwMGaAUYxcXFLXzVCLWlxullx1MDAwNlQ8qpBkof1WXHUwMDFl9FUqwJtpjEbajfLgPOir0GtcdTAwMDJGyoj4LvDer9A3XHUwMDA2fStcdTAwMGKjr9TGMie94DuabFx1MDAxOUZfoYWW82Xs/Vx1MDAxOehcdTAwMWIrp/SKSOji6PtcdTAwMDUw5k2DlkrRXHUwMDAxJ+eOMrCiXHUwMDFin1x1MDAxMX2Pulx1MDAwN9mdXFymVjVcdTAwMTeQfc1cdTAwMWY+lTpZuei2uVx1MDAxMVxccElHsHI07vf+qaHeZ1x1MDAwNplcdTAwMWans1x1MDAxYun+IOA9vmtcdTAwMWXYnVNzVOzq0mvtpbV7+VSOXHUwMDAyrzeiXHJcblx0gVx1MDAxMIJ6wFFjxVx1MDAxMeT8YL484Joy61x1MDAxY3NWjvRiWuWJfLw7L8w+LVx1MDAxZcO2mnIl/WdYo3hcdTAwMTf2aZm1KOZcdTAwMTJST1x1MDAxNDnuv6mrRn97K18pn7VO92Uj35yyei1cdTAwMDJxUVx1MDAxMLfcjITdXHUwMDE3XG7eJkeZXHUwMDEzyYpFhbHUTFx1MDAxMZC3XHUwMDE4XGK5ipqKupBcXGvqzKekJ+Iz6GSKP02txNBKOs9cdTAwMTFcdTAwMTCjXHUwMDAxNKh6XGJXXGaEZXKlRXFa9LK4XHUwMDE2OSepybs33Vx1MDAxOHTsSZCxxlirUm9cdTAwMWS2NGwlVlDplYnK6JLSlffTOmnJ5+LcLuAs/o7OocmpOElA5cBcdTAwMDRCXCLNdFx1MDAwZVx1MDAxY1xiXGI1U1H4dJUgm89cdTAwMTiSXCKI1jhpjlx1MDAxZatFP5T6XHUwMDE3wOgpyCdQmYChhOCtXHUwMDE1ks6sR7JVVjg1hlOSTV2yXHUwMDFmn1x1MDAxNqroYMlcdTAwMWbSkvHdVPBcdTAwMDFcbnzK/CuCWsiaR+qyfls/XHUwMDE1K1x1MDAwMsZcdTAwMTCoXHUwMDEwjoFrZsaiKlx1MDAxMVx1MDAxOZ20XFys3NNLXCJiUD8qoZW2SshcdTAwMTRCZMkpMvOiXHUwMDFlNVx1MDAwNlx1MDAxZaBcdTAwMWWyPedCcaZlR73kRMHESL5lgVx1MDAxNFx1MDAwMlxm9XuzXHUwMDA2wpUs1E1cdTAwMTlcdTAwMTQyNMaRpTlfKVx1MDAwYlo9JNZcdTAwMTSKw7ukraeURVx1MDAwNGhcdTAwMTPRV0R1RDng6E6ucC9cdTAwMDb39MKwh2JsLFx1MDAxN94mUi6SiDvsU1wiXHUwMDA1OfPz9I37I9hZvJzSKyqhi+PUl4TyrSXYZlxcS1RXocKBpVx1MDAxNEL5X1x1MDAwMq9MMVxyXHUwMDA27SrKg8NHMFx1MDAxYqtcXLZcYlJyvG1yUyhG1bFcdTAwMDZcdTAwMWPCrlx1MDAxNSzcx1x1MDAwNElCgFx1MDAxNNOgoFx1MDAxYSpcIoxC7qrwNlx1MDAwNaQ101wibWzhrZOGIXvyI21Cy3pGySvKwlxcPTo/tzdTSmSpf5bt7m9sbF08nK9cdTAwMWS/7lx1MDAwYr5bf/jdqYv3zJWP+8/b7i0rL7O151x1MDAwMnOVzenWjWDyl6Yu+u9eRN99jTOEXHUwMDBiOPJoXHUwMDAwxZXULqzqwlx1MDAwNNoozcjj8Km6c4FcdTAwMDZnXHUwMDA3KTVaS18p0ypkXHUwMDFjq+IxXHUwMDFkiry5i1x1MDAxNr1+Rfzfp8wmdqhcdTAwMTZHX1x1MDAwMX2HXHUwMDExXGZYltzFalx1MDAwM+1xXHUwMDA2XHUwMDFm3FjK4e9LXpxgNMPpT/7tp5P4lG1f3Fx1MDAxZrpy8fWlV1dcdTAwMWK3my+NzqtnrFaM/Vx1MDAxZczMk0qic6xcdTAwMDRcdTAwMWTljek0zVdcdTAwMGKssNS/klx1MDAxYubzmFbmO1x1MDAwNd12XHUwMDBim2/OOGovPi5v3TBT8TmOkvptOC5SPFx1MDAwZprYOGPnjHfly+XbefNIvbypW1G9mGUsOkJcdTAwMTTV0KVkXHUwMDEw/buZwiCiXHRcZiihRymUXHUwMDAxgz7ZuO5cdTAwMDDjgSRcdTAwMTfBWr/urOzhj1x1MDAwNXRmbYbsX62s4Np5h82xhH6n+FhcdTAwMTlcdTAwMWKddJCKPZxdepfeXHUwMDFlTjBC32lcdTAwMGaTiXhS+JBcdTAwMTJcdTAwMWRcdTAwMDKBdlBKbTVcdTAwMGL3Nzbc0pGY5vj8lPNlQ2hcdTAwMTZQ+1x1MDAxY0MhZ4k205OJRpDhXGIw0CpcburLstLvXHUwMDE4/d5cXPzQXHUwMDA00Fx1MDAxYyqA0U7VI+3jbGyOhDJiMDPxXHUwMDBiXHUwMDBlTTS1XHUwMDE0nEfz041cdTAwMWYyXHUwMDE2UNd4i86AkdRcdTAwMTRt9MczWlx1MDAwZZqbXHUwMDAzMj9NSdEwcb1YyX9fLyz0w/VcIqZ+ynjkl2SJXHUwMDE5yVx1MDAxNLoq1MZVXHUwMDE4aUNzJsc+VTIpPfd7zlA+318g+vdgKmd7J687rbZrX5bz7UL2qv9cdTAwMTRFS3+XIadcdTAwMDOFXHUwMDA0iI7fKEEnXHUwMDE0XHUwMDEw4Fx1MDAxY0TAkOBcdTAwMDDN4DHWN4FnlT82XHUwMDFmOMb0OpjlQFlILpT29lx1MDAxOVx1MDAxYe1NXHUwMDExjffRcepoaCGl9LFKpfjqmk/n2V75UNev20/Hrjdl7e9fSetenOZz/Pgmc/Z6le2i8l48wtZbXG7rPnX59vHzXHUwMDE2/mhxo4GMrnBgzd1060ZAL8JcdTAwMTClXHUwMDE1XHUwMDEyhv7yQv5N/7Khe63+w3HpceP+PqOvXHUwMDBlX/n0XHUwMDAxXHUwMDAyQCmhkmMr6SCJ2XCEgDNcYui0nFx1MDAwYk3Hrp78/FWEIFx1MDAwNYWfuulBwtBcdTAwMDfhuGL+/uTAo7HCz1xiXHUwMDAxVbgqkHMlu81cdTAwMTkheOPP21x1MDAwN+I5f3D9cNe7avDqxtXJ1rSa+VVIktnY39i1me2ng5tm++CyqK7bmdNl1Hj/3YtovCfEz1x1MDAxZI1cZrJcdTAwMGWVXlx1MDAxYcsshJRcdTAwMWQtumaUXHUwMDAwXHUwMDAzfmWXqOvCOc1cclx1MDAxMl06I4jq/Mqqxyr5LO1cdFCdXHUwMDA1Ym5Mn8CoxzPMXGJTVjEtUlx1MDAwZmrMLMBDefyIXG6UX1pLXHUwMDExzJhgMMPBjPFtp1x1MDAxM8TYztz1mp1fzYObl2v3Jjb4XHUwMDAzbz9OW9ZhSFx1MDAwYlx1MDAxNaMzeW2lVeN9yChcdTAwMTGWZlx1MDAxN1xi1G5rha+h74qVz6e/MVxyXHRmYOVcdTAwMDIoSdFxn1ab+Fx1MDAxZYOA6ixopkHqRVx1MDAxZFx1MDAwYti8RFu6W147es5e7/Zlq9c7OIHCY1H0ltGWJt+AxHCiZCYwyjht/MyZQ6CR+3Jcco6DJzNGyoBq0lxyoFx1MDAxZHVKe7pcdTAwMDHKgFmGfrdDc41cZpuvUlx1MDAxMeNUc/G6VuDgnODGe6hu4jNkqOJeOjnf0LQvsbcpN1x1MDAxNYiRUnpF5HO4WkSLp1xm/CVcdTAwMWLnXHUwMDFm81x1MDAwNf604I6KbzVljVx1MDAxYTaW9I1WXHUwMDBmPVtixILKR9HhjVx1MDAxNrvMmJVY1Xvbp63SwW1po8CeXnLtXHUwMDAznSstelxy0cpcXOqBXGZWME19woAlXHIoWrawZOUkXHUwMDBiz53ObqXcfdt84k/1tb21+pT8x4KifshMgdb4ZzZ+jMO5soGm7CU3XGJdXHUwMDBl1XLVpzFdyK0uXGa5nFx0yVx1MDAxOaU2+JxcdTAwMWNcdTAwMDaxTo7DJyMlm+tcdTAwMDBn3p7L10/5jOpvXHUwMDE3tlu/9l2/03ouy53fXHUwMDFko7woZY5zO5nLcn7vtPpwdefg4lx1MDAxNJaRZfnvXkTfo1x1MDAxMVx1MDAwYseopEPQOGWgXHR8OqTsXHUwMDA2lVx1MDAxZLihKlx1MDAwMlx1MDAwYuCi2m7eXHUwMDFiKmpcdTAwMGXKcjr1iir7yuOJ1fFcdTAwMDe/jvtcIlx1MDAxNmg3kecyiJ4tvCuzilNmlDM9YFx1MDAwZktDoP5cdTAwMGVYXFzsbuVH4mq/L2IxwVxchiNcdTAwMTahfadcdTAwMTOySMaaREeJKYmOklx1MDAxMMSUkUeGWitz7lx1MDAwNkdcZkpcdTAwMDNFM4TnXHUwMDE4XHUwMDExzTHqN75cdTAwMThcdTAwMWFlwaUnemHoLJJcdTAwMDN+yqhcdTAwMGVs5PB/pdPjOl1b2G6jz2vxTntbp3KbUKzqlCNHYmlcdTAwMTQ93TGolO7HaaKkQFKptFxuJV2QXHUwMDFiXCKM1YzqKSTqxKRcdTAwMDXjxX6wYETiI/x/ZucrXHUwMDE5Z0ZcdTAwMWOXaqNTLZWn9FxcnGPvRH0w5USFvC+Fm0e/S6BcdJBGOVx1MDAxYrmKPzHtYu9l15xuXHUwMDFlvvyqXHUwMDE3XmWuXFxoXHUwMDFmb1Y8w9r8jeiBXHUwMDA1zFx1MDAxOFxyNPRcdTAwMDVcdTAwMWZ9OO3UoW9iXHQqXHUwMDAxZVxyomhJUvM+ym3g3VxmvcaRfmma8HhcdTAwMTXsTYLJ+sIwXHTKoH4q6Z0oY3R8i2lcbqjwb/Vu2puVZub07dfR5f7aRftpJ3/Qqkzt3SxhZkdcdTAwMDRcdTAwMDC/1LtJ3mhcdTAwMTI10pbaXHUwMDFmSsWcQFx1MDAxZkeJcCxD6MBcdTAwMGXKsbRV1L0sSo2EQlx1MDAwNFx1MDAwNYcwQZ28nPFFkVx1MDAxZLpAXGKtwlx1MDAxYVx1MDAwN1ZxLldKXHUwMDFmp/Q7i2u91NpcdTAwMWHttDfzSsdcdTAwMGWfXHUwMDAxRomH82ZeLT89Mlx1MDAxMGj017myXGY5gDRj7EjygEJ2lIwqhLWT1oqX+sFiXHUwMDExeV+cXHUwMDE5JVx1MDAxYvRcdTAwMWZz5qNSRN2hlaCqSlxyY1x1MDAxN5FOffzXXHUwMDEwOlx1MDAwNkjVkHhaSy21XHUwMDFk5yFKJzlcdTAwMTWKUziGml1cbpfUM3LZmFuyMUvEciNcdTAwMDNcdTAwMTiE5J0ldlx1MDAxNlx1MDAwZVWBXHUwMDBinJRSXHUwMDE54sBCRUNVXG5cdTAwMDXXOcO4kFJoJjzJNYzMXHUwMDAxKrVcdTAwMTLU8Vx1MDAwNpdcXLm5sVC+eH2BQV9OKv883lFIjZxcYqI+o4uc9oyQZUHyWDlcdTAwMWT8dERCv1x1MDAxMXxnc0vt++xcdTAwMGU0JohlLoxhUtHMVWNcdTAwMThcdTAwMWFzmdiseyok/pJzTeFAOiUpedNpaUJcdTAwMDZk7FPhaTm8vCjs90dcIijsmb8kaGRcdTAwMGI+V0Oj3KSNlCxQXHUwMDFmdsG1XHUwMDEyXGYtro56zy6QwjlrXHUwMDEwydFcIsNqZMtMoNvwY643w1ErJ62UXnTVNp4nO1x03FAgbWnQ9e/zgn8tw1nBhNBT+KxgZM/pnFx1MDAxMyQnP0zqWK154Fx1MDAwNFxiISi0XHUwMDE5OidcdTAwMDA3qDNDz1xuldc3qGVcdTAwMTX5SkWJm1x1MDAwYlx1MDAxMyc6XHUwMDA3VGMqOlRtK2NPXHUwMDAyObNcdTAwMDLQ1qbZu3pS5Gt956Caz/O1t3x/s1xiXHUwMDA3/dPzh8buN1RcZiSu+8dkT/rv3lx1MDAxNHZcdTAwMWGUQ0usLKoy/ks0O2yoVSBcdTAwMTm6mMgxgTtPq23koCtDPbeOt2Yw1ETmaWiFN2k5PoyN5NNcdTAwMDCXZq42jV9rqP+9XGaGeoKhXGZcdTAwMWLqf6dtqJNBJvFAX1x1MDAwYotmVIEwNG2Aq3Cog+tAaYU6rKXjylx1MDAxM+pwXHUwMDEwXGbmqKNvgoLFhScrXHUwMDA3dy/RiDjFaZiK0atQR6wyLz5tXHUwMDAyXXWwTHpTd6I9qT/7p3BhnZkv9Tmxj8KyRDpixZReUVx1MDAwMVx1MDAxZC5cdTAwMTexwlNGOr4rc5iGqzFuXHUwMDE553h905+5x207uZwptW2rQTExlVx1MDAxM1x1MDAxYpvcoGHZ4lx1MDAxOcnF5ElYq1x1MDAwMKFcdTAwMTZBVGtNQ+N0uNiLPjacaTdo0zBUmb+RdtAyXHUwMDFiRVdcdTAwMDNcdTAwMDMrjPJcIi3+uOLWOUGtz9UwP36FtD/Gkba9MNKCQtbrkPJ6m1Ul9HFcdTAwMWJcZnHS82VcdTAwMDX8XHUwMDExYFx1MDAxYiup9IrK6OJgm9xcdTAwMWIlPdRCMyko8Vx0bzU6O/8/+srYreNzVyy/nJ5nTLcty7fFzsa0XHROQJ3zOGNcdTAwMDJcdTAwMTDKXHUwMDA3XHUwMDA0cVxm0yydXHUwMDE0U4d3sJrmPkQxbVx1MDAxNedJXHUwMDA1zDpcdTAwMGKDmXVSXG5cdTAwMGLRwlXyXGZFbFxi11x1MDAxOWYokDdXXHUwMDFm2s/dzVx1MDAxNOa56K51mF43943L+57OvN7012/NtOGY2nl+r9PIXjeku7oxpdvqXjt/Pv5b5lx1MDAwYvNcXO3c5o5O39qn7dylMrv14tZxalx1MDAxM9VcdTAwMDQ1bFx1MDAxYbreXHUwMDBihXmSb0By7jdyaO60Q+9C27E2mSTGXHUwMDBlkUBcdTAwMTN/oV5kljFPNqNcYpzUjln0Jp1wnoFcdTAwMWRoLlx1MDAwMkPTY9GoOuO0XvXci9X4XHUwMDE0eu7RrFx1MDAxZDTD4O09bWP5XHUwMDBimj89nlx1MDAxNZVWz72ZXHUwMDA1/WvoSyZOUukl0GKhXHUwMDA2IH1HriW0XHUwMDE1auJyVOWIaoNOJzJcdTAwMWXlRkY80Ssq9IvzoWSbPidcdTAwMWZiNNnZ0vBcdTAwMDFLl/9cdTAwMDXjvE9cdTAwMGUqh7dZu8shd1p5btZf9GEzv+i2abw8epooYlx1MDAwNlx1MDAxNOJWZKIsKDqD5FSZXHUwMDA2f9Qob78ljGC5J2RcdTAwMGZcdTAwMDJcdTAwMDKnjGYolYNh3uO0zZqAmpFYh8yOjU4k+8xvXG6kcVx1MDAwZVfgXHUwMDExarZcbtlPXHUwMDA2765cdTAwMWa7vVxykYU01ngh2jNQdnj8Nuh9KebrMpImXHUwMDE1XHUwMDE5SuNH8DtYhoD9XHUwMDA0nydcdTAwMWOwXHUwMDFm2XNKXHUwMDAx+0S6mMjCOFBuokKdZVx1MDAxNH9cdTAwMThTXFyUTVx1MDAxOVx1MDAxOEtONVx1MDAwMFx1MDAxZNtGNZdcdTAwMWHGKmBcdTAwMDZcdTAwMWYjSNRdT5I5MFx1MDAxZOA3KERB2b3OrnqVxCny88IkTNOMebrRXHUwMDFlXHUwMDA15ya237miKlx1MDAwM6RcdTAwMGLpz01bXHUwMDEyXHUwMDBlxk1gKelNo61Cz9TpMbOdMVRYXHUwMDA1XHUwMDFjzY9VSnHDJ62XXHUwMDExKNSUoU1cdTAwMDVXXGZCoZ1MVOZcdTAwMTcnYV/CZqxcdTAwMDDggiGdXHUwMDE0llx1MDAwNvz8lfBpYlx1MDAxZpGpXGLZl/DIaFxcjUmFeoBcXNpoziVXSadcdTAwMTjfNNqyfqOKR792j2Tv5ZconW+1S51sJYrQ3qiY41x1MDAwMl1hXHUwMDE0I8RqlGEx3ppcdTAwMTGfkFx1MDAwYoyga5ZMXHUwMDFhz0DfVUwsXHJs7i2MzVx1MDAxNr0yJq23xVx1MDAxYoCLTX6ifo/U0e87XHUwMDA3tVx1MDAxY++1X7ZfXHUwMDFh9c399a32XHUwMDFi33i+2NvfmDZ6pSv123Zv54bbrYPejiuL8t15XHUwMDFhk9aOTmGn2ixmelx1MDAwNf26+dp63H3rn3dTWPel+nBxtV/K9V77lVx1MDAxYuuqvXz/Nq32rqidYqSyebFom/+pTOGhOSVcdTAwMDIp0Fqhi2XRzIVcdTAwMTBEqkBJsIbmQGnu6ZWyctBcdTAwMDbvzotcdTAwMWR9P3b4c6rYILDgb9ZcZizeR0NiY7VRabtoM8vvcrpoXHUwMDEzXGbwl7toXHUwMDE3qmZcdTAwMGVvqvu6kn06XVs7ezzqdz05Vf5jMWlUXHUwMDAwXFyiXHUwMDE3ZlxmumlDXHUwMDE5eFx1MDAxN1DHXHUwMDAzRvV01kmOvn2UXHUwMDAycKRcYk4z6mtcdTAwMTbVW1xygVxmf7hS4HFcdTAwMDV+SSE6LqhVvvWf7lx1MDAwM8SOpFx1MDAwMUaNm9G7/sYm7Fx1MDAwZrXc2nlui+Vf25tXuZeza9i5X5/Wmna6kIWrVjvLM+Vr1WK3L1x1MDAxNzfFXHUwMDE0rPRx+3J/57n2sGZld409vHXZ4+6Uqc+J696dXT53XHUwMDBl1G2+7cpcdTAwMWJdtfVr9/D81zKetfmfylx1MDAxNNZcdTAwMWZcdTAwMTTnXHUwMDFmYVx1MDAxYeGs0iZcdTAwMDQgQH1FXHUwMDA0aCFcdTAwMDRuOmr9XHUwMDAxnV1JXHUwMDE51cYhObA+XHUwMDEwWVx1MDAxOf9Y7HidITor1ftIQFx1MDAxZkaweFx1MDAwZkFcYur2mb7tXzw820FcdTAwMTNdaGc+olx1MDAwMMtAXHUwMDA0Jlx1MDAxOOIwXHUwMDExiLuAdFjB/lM/k2vsXFyt7zxlzdHhw9Vd9vV5WlbgXHUwMDE0o36mgI9K0ZSVXHUwMDEwq2eCU2qUXHUwMDE0XFzhg1Q6Slx1MDAwYlbt3udU6bfF6Vx1MDAwMGXAXHUwMDBiYbxcck55/KBm6mxcdTAwMDHUVDzFXHUwMDE2QO+i2HspXdzt13OHXHUwMDFkVn/rZTNcdTAwMGaVQ5VGKstcdTAwMDJm+3vNa/Jcckg+REFV44b8Y6aYk+H5kUxQL1JJ8WKKPKtoyZJhhurKKfdaSrw0Xy/SwHHDaGgpYzQ1adWqJ0Y7XHUwMDE1W1xcO1x1MDAxZEPOZIy/j6GJ7+/gtDKkofPkr/1cdTAwMTHnKLGCSq9MREaHy0V0+XeeeiBcdTAwMTVcdTAwMTaUcmtcdTAwMDUlJcBY/lxmdU93mjtcdTAwMDegOZIuY5LaI0x17JFs5ee9hsixh0DurvXgiEDihSWlzyxb6kmykUjEXpJII6xWgFx1MDAxY4dBxLfhXHUwMDAyb1x1MDAxNVxyqeNWj847XHUwMDFkXHUwMDA2R1xivJmxlilpNcP/RMHXuoBcdTAwMDZcdTAwMWRQ21xihX7Q6lx1MDAwNDtcdTAwMGV7+cLYS8NkrTTeijO8+bHQS1x1MDAxZDxcZrdzXHUwMDExoz9cdTAwMDJ6LVx1MDAwZqhcdTAwMWVcdTAwMWHVnnMhXHUwMDE0XHUwMDFia66TodT4QTm0sJJzayZ2SotcdTAwMTf7wXphiV9cdTAwMWPJk1x1MDAxZK9cdTAwMWZz9epcdTAwMDHqOEZpJ85wXHUwMDFhW8zDndJcdTAwMDBcdTAwMWPXiIWSa0pcIv5DkJyBXHUwMDAzXHUwMDFhu6lcdTAwMTRcdTAwMWFRSzM2/yAsZ9frqvOg7HqzepPhR1x1MDAwN9ft3UdPRZvfp1x1MDAxNVx1MDAxMuVOklxyU4OIRtindXwwvpryjFx1MDAwNYwkX65Ou9PFcZFcdTAwMDKHXHUwMDA2alx1MDAwMiidP+Bt4uvZJFxyjVx1MDAxZVx1MDAxYjL55Vx1MDAwMW9rzHm+tl2zhZ38dn7zrLy1k1G/O+D9x1x1MDAwNKaTb0Cy5zxIzDKGc0a9wHVI3bVGv1rTrHrHOfc09qHQtdSaZlMzpOzG01x1MDAxOVGJXHUwMDAwlKFcdTAwMWHBQeTEqpXnXHUwMDFjq/UpVIGoQYSKe1OMhYmt/KJcdTAwMDb56GrNlePyR9A3QTlcdTAwMTRcdTAwMDaoXHUwMDAzKrJbYcfom2SDdEHg9I9BL05PWi5W8OlcdTAwMTVcdTAwMTX5xenb16RcdTAwMWbS5Vx1MDAwMnXqXHUwMDFkuGdjXHUwMDE0XHUwMDE0b4lFtafyL/TTKW1z4fFrydQkNfqGsqyJqtNgXCLmRNK2l428+VxyYVx1MDAwNMo9Z4zCOJRhxHFLcVx1MDAxM1x1MDAxNapcdTAwMDFBcbVcdTAwMDFD0ddcdTAwMWGfJIl6XHUwMDA0ylc5RoN358VuOUOOXHUwMDEx5XlZpGdeasZsfC6C49SjgKXduOn/S1x1MDAxZMhcdTAwMDTX58uTjJJcdTAwMTlj8sha4IGh+KHQlk4yQkxcZp3rQCrHQTvGtPC0XHUwMDEzQapG6UnUWl3ReILhXHUwMDAyIz2qkVx1MDAxNtBcdTAwMDRcdTAwMGJcdTAwMTBOSiNgRcVi1VktzsTwWZJaRas+6ENcdTAwMWKbSFxiQFFcdTAwMDcu52qj+kdQsVhRpVfGI6WLs6epmcdsjarpiFxulGBIumm+1DhcclGgqHDP0qRpxoxblD19RVx1MDAwMI9iXcRcYiw1dFx1MDAwNC6Uk+HTXHUwMDE4Q93kXHUwMDA23Vx1MDAwMq2R/E/qVZ2cXHUwMDA3n1x1MDAwNMconFx1MDAwMaItMktcdNKMtvZ5R2OlqMZbXG6hyVx1MDAxY3uKPlB2XHUwMDAzZqlcdTAwMDVcdTAwMWZKsKJxQ1E4XHUwMDA2lFx1MDAxZlx1MDAwYkZZaYXDZUZaXGat0HhcdTAwMWONdVxu4TApwZGoe9DYRSD6XHUwMDEzjLWlrG4m01x1MDAwN+P5XHUwMDEzu9NcdTAwMWQjXHUwMDFlK6mDTyMyujhcdTAwMTZcdTAwMWa+Xm7tl/ZcdTAwMWVv7dP51VUmm+lcdTAwMWTsXHUwMDE1fTg2i1x1MDAxN4g+OFx1MDAxM1pKRnHpKFx1MDAxNKfQzSA5g33ObXNcdTAwMGJMcemsXHUwMDEw+Fx1MDAxMNDczbTvZVx1MDAwM9zkXHUwMDAyoUTApelcdTAwMDBWg0RzJCSS4HHARcNcdTAwMTQwLpxDimw4eM5cdTAwMWTwoVx1MDAwN+je0tBqR133RuJfw0mkXGZ/h5VuMF/cjVx1MDAxNoKt8HZcdTAwMWNvzeJ4a1x1MDAxNDWM85fRiHhcdTAwMGaXXHUwMDFhzFG4Kf045LLgLXpy3FjqmGeoXHUwMDAzr1x1MDAxZa9cXNYykFx1MDAwZVx1MDAwNFx1MDAwMzeYjS3MxPViXHUwMDA1f7BeROZcdTAwMTfH7/M71i+vb1/3rvdvbEGvX57cP+TSj+IhsZaS0/mxRrNjXHUwMDE2Pjv+XHUwMDEy/PY0XHUwMDE1JCdeg2HUXHUwMDEwVcg/XHS+k+swk+DbWVx1MDAxYnBGp1x1MDAwZYDPzITaWFB7XHUwMDFhZVE4XHThreOeXHUwMDFhaVx1MDAxYf5i8K45hjfPcs+pMZ08W7CUNia1YmpcdTAwMDXeceBtXHUwMDE3XHUwMDA2b1xuP4ixUMFI+qWOPTlG7JFM2y9cdFxcoEpccu/Mb8NuXHUwMDEzaG2kkdRZWjM5XHUwMDBltcpcdTAwMDZOME3HaJSeOZa46F8vVuxcdTAwMDfrRSR+cej+XHUwMDEyXGZEzVx1MDAxNmhguFFcblx1MDAxZKzQXHUwMDE50izMe6n7qlx1MDAxZfff1FWjv72Vr5TPWqf7spFvTtnjXHUwMDA3rUCAXHUwMDBllORcXHOKXHUwMDE3hFIktVx1MDAxNoFCx8VZdFCFXHUwMDEy0VaL4ESgKa2X2vBcdTAwMGUmaHqiXHRM0vmPcOhcdTAwMDXhKlx1MDAwZVZd+eNcdTAwMDDSLc5uJdB5MfOOyFx1MDAwMogvXHUwMDFmUVYjlMn0e0VcdTAwMDOnaXi/P7aLkkq5jFxm98RcdTAwMDHGu1xuZiw6edTPXG4xXHUwMDAxiaoyYtJq8YI/WC8q89NDZFx1MDAxOE4mg+fxXfPA7pyao2JXl15rL63dy6fyouBcdFxcKqFQ84VlzI2T92/1/9+h71x1MDAxZlx1MDAxZnfsZ6HVOumihH3ej5+9arm/XHUwMDFlxYX/ulx1MDAxYrwo+WmwMcKE8kCd/vOP//xcdTAwMWa3nK5hIn0=refref$selfTable Aliaspath-segmentpath-segmentstructured-elementassociationTODO: Better namesinfix-filterinfix-filterexprWHERE[]..scalar-element. \ No newline at end of file From f2b2611184c451ff8e2489dd328e1e877d8cb41f Mon Sep 17 00:00:00 2001 From: Patrice Bender Date: Fri, 28 Nov 2025 11:38:16 +0100 Subject: [PATCH 02/47] add some first drawings --- assets/cxl/infix-filter.drawio.svg | 154 ++++++++++++++++++ assets/cxl/path-segment.drawio.svg | 133 ++++++++++++++++ assets/cxl/ref.drawio.svg | 243 +++++++++++++++++++++++++++++ cds/cxl.md | 25 +++ 4 files changed, 555 insertions(+) create mode 100644 assets/cxl/infix-filter.drawio.svg create mode 100644 assets/cxl/path-segment.drawio.svg create mode 100644 assets/cxl/ref.drawio.svg create mode 100644 cds/cxl.md diff --git a/assets/cxl/infix-filter.drawio.svg b/assets/cxl/infix-filter.drawio.svg new file mode 100644 index 0000000000..1caea55518 --- /dev/null +++ b/assets/cxl/infix-filter.drawio.svg @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + WHERE + +
+
+
+
+ + WHERE + +
+
+
+ + + + + + + +
+
+
+ infix filter +
+
+
+
+ + infix filter + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ [ +
+
+
+
+ + [ + +
+
+
+ + + + + + + + + + + +
+
+
+ ] +
+
+
+
+ + ] + +
+
+
+ + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+ + + + + + + + +
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/assets/cxl/path-segment.drawio.svg b/assets/cxl/path-segment.drawio.svg new file mode 100644 index 0000000000..3a414bf0ad --- /dev/null +++ b/assets/cxl/path-segment.drawio.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + structured-element + +
+
+
+
+ + structured-eleme... + +
+
+
+ + + + + + + + + + + +
+
+
+ association +
+
+
+
+ + association + +
+
+
+ + + + + + + +
+
+
+ path-segment +
+
+
+
+ + path-segment + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ infix filter +
+
+
+
+ + infix filter + +
+
+
+ + + + + + + + +
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/assets/cxl/ref.drawio.svg b/assets/cxl/ref.drawio.svg new file mode 100644 index 0000000000..9cf49b3b8f --- /dev/null +++ b/assets/cxl/ref.drawio.svg @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ . +
+
+
+
+ + . + +
+
+
+ + + + + + + +
+
+
+ . +
+
+
+
+ + . + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ . +
+
+
+
+ + . + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + $self + +
+
+
+
+ + $self + +
+
+
+ + + + + + + +
+
+
+ Table Alias +
+
+
+
+ + Table Alias + +
+
+
+ + + + + + + +
+
+
+ + scalar element + +
+
+
+
+ + scalar element + +
+
+
+ + + + + + + +
+
+
+ ref +
+
+
+
+ + ref + +
+
+
+ + + + + + + +
+
+
+ path-segment +
+
+
+
+ + path-segment + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/cds/cxl.md b/cds/cxl.md new file mode 100644 index 0000000000..f48b45576c --- /dev/null +++ b/cds/cxl.md @@ -0,0 +1,25 @@ +--- +# layout: cds-ref +shorty: Expressions +synopsis: > + Specification of the Core Expression Notation (CXN) used to capture expressions as plain JavaScript objects. +status: draft +uacp: Used as link target from Help Portal at https://help.sap.com/products/BTP/65de2977205c403bbc107264b8eccf4b/855e00bd559742a3b8276fbed4af1008.html +--- + +# Expression Notation (CXN) { #expressions} + + +> big sequence diagram which describes expressions + + +## ref + + +## path segment + + +## infix filter + + +## Sub Queries From 06639e7182fa0acb50ee14df4208ffa512220bdd Mon Sep 17 00:00:00 2001 From: Patrice Bender Date: Fri, 28 Nov 2025 14:19:35 +0100 Subject: [PATCH 03/47] more diagrams --- assets/cxl/expr.drawio.svg | 1334 ++++++++++++++++++++++++++++ assets/cxl/infix-filter.drawio.svg | 62 +- assets/cxl/path-segment.drawio.svg | 56 +- assets/cxl/ref.drawio.svg | 20 +- 4 files changed, 1403 insertions(+), 69 deletions(-) create mode 100644 assets/cxl/expr.drawio.svg diff --git a/assets/cxl/expr.drawio.svg b/assets/cxl/expr.drawio.svg new file mode 100644 index 0000000000..b446ead6b7 --- /dev/null +++ b/assets/cxl/expr.drawio.svg @@ -0,0 +1,1334 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ unary operator +
+
+
+
+ + unary operator + +
+
+
+ + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+ + + + + + + +
+
+
+ literal value +
+
+
+
+ + literal value + +
+
+
+ + + + + + + +
+
+
+ ref +
+
+
+
+ + ref + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+ + + + + + + + + + + +
+
+
+ binary operator +
+
+
+
+ + binary operator + +
+
+
+ + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ function name +
+
+
+
+ + function name + +
+
+
+ + + + + + + + + + + +
+
+
+ ( +
+
+
+
+ + ( + +
+
+
+ + + + + + + + + + + +
+
+
+ function args +
+
+
+
+ + function args + +
+
+
+ + + + + + + + + + + +
+
+
+ over-clause +
+
+
+
+ + over-clause + +
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+ + + + + + + +
+
+
+ ) +
+
+
+
+ + ) + +
+
+
+ + + + + + + + + + + +
+
+
+ ( +
+
+
+
+ + ( + +
+
+
+ + + + + + + +
+
+
+ , +
+
+
+
+ + , + +
+
+
+ + + + + + + +
+
+
+ ) +
+
+
+
+ + ) + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ ( +
+
+
+
+ + ( + +
+
+
+ + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+ + + + + + + + + + + +
+
+
+ + as + +
+
+
+
+ + as + +
+
+
+ + + + + + + + + + + +
+
+
+ type-name +
+
+
+
+ + type-name + +
+
+
+ + + + + + + +
+
+
+ ) +
+
+
+
+ + ) + +
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+ + + + + + + +
+
+
+ CAST +
+
+
+
+ + CAST + +
+
+
+ + + + + + + + + + + + + + + + + + +
+
+
+ LIKE +
+
+
+
+ + LIKE + +
+
+
+ + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+ + + + + + + +
+
+
+ NULL +
+
+
+
+ + NULL + +
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+ + + + + + + + + + + +
+
+
+ NOT +
+
+
+
+ + NOT + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ BETWEEN +
+
+
+
+ + BETWEEN + +
+
+
+ + + + + + + +
+
+
+ NOT +
+
+
+
+ + NOT + +
+
+
+ + + + + + + + + + + +
+
+
+ IS +
+
+
+
+ + IS + +
+
+
+ + + + + + + + + + + +
+
+
+ NOT +
+
+
+
+ + NOT + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+ + + + + + + + + + + +
+
+
+ AND +
+
+
+
+ + AND + +
+
+
+ + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+ + + + + + + + + + +
+
+
+ NOT +
+
+
+
+ + NOT + +
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+ select-stmt +
+
+
+
+ + select-stmt + +
+
+
+ + + + + + + + + + + +
+
+
+ ( +
+
+
+
+ + ( + +
+
+
+ + + + + + + +
+
+
+ ) +
+
+
+
+ + ) + +
+
+
+ + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+ + + + + + + + + + + +
+
+
+ , +
+
+
+
+ + , + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ NOT +
+
+
+
+ + NOT + +
+
+
+ + + + + + + + + + + +
+
+
+ EXISTS +
+
+
+
+ + EXISTS + +
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+ select-stmt +
+
+
+
+ + select-stmt + +
+
+
+ + + + + + + + + + + +
+
+
+ ( +
+
+
+
+ + ( + +
+
+
+ + + + + + + +
+
+
+ ) +
+
+
+
+ + ) + +
+
+
+ + + + + + + +
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/assets/cxl/infix-filter.drawio.svg b/assets/cxl/infix-filter.drawio.svg index 1caea55518..f9dc1eabd7 100644 --- a/assets/cxl/infix-filter.drawio.svg +++ b/assets/cxl/infix-filter.drawio.svg @@ -1,25 +1,25 @@ - + - + - - + + - + - + -
+
@@ -29,20 +29,20 @@
- + WHERE - + -
+
infix filter @@ -50,27 +50,27 @@
- + infix filter - + - - + + - + -
+
[ @@ -78,24 +78,24 @@
- + [ - - + + - + -
+
] @@ -103,24 +103,24 @@
- + ] - - + + - + -
+
expr @@ -128,19 +128,19 @@
- + expr - - + + - - + + diff --git a/assets/cxl/path-segment.drawio.svg b/assets/cxl/path-segment.drawio.svg index 3a414bf0ad..419d0c1c37 100644 --- a/assets/cxl/path-segment.drawio.svg +++ b/assets/cxl/path-segment.drawio.svg @@ -1,29 +1,29 @@ - + - + - - + + - + - - + + - + -
+
@@ -33,24 +33,24 @@
- + structured-eleme... - - + + - + -
+
association @@ -58,20 +58,20 @@
- + association - + -
+
path-segment @@ -79,27 +79,27 @@
- + path-segment - + - - + + - + -
+
infix filter @@ -107,19 +107,19 @@
- + infix filter - - + + - - + + diff --git a/assets/cxl/ref.drawio.svg b/assets/cxl/ref.drawio.svg index 9cf49b3b8f..faf8df4956 100644 --- a/assets/cxl/ref.drawio.svg +++ b/assets/cxl/ref.drawio.svg @@ -1,8 +1,8 @@ - + - + @@ -20,10 +20,6 @@ - - - - @@ -107,7 +103,7 @@ - + @@ -146,13 +142,13 @@ - + -
+
Table Alias @@ -160,7 +156,7 @@
- + Table Alias @@ -231,6 +227,10 @@ + + + + From 589aa4287d43d29f84de4e56b52b9a679a04a7c0 Mon Sep 17 00:00:00 2001 From: Patrice Bender Date: Fri, 28 Nov 2025 16:43:30 +0100 Subject: [PATCH 04/47] add links and clickable diagrams to CXL --- assets/cxl/expr.drawio.svg | 1484 +++++++++++++++++----------- assets/cxl/infix-filter.drawio.svg | 72 +- assets/cxl/path-segment.drawio.svg | 79 +- assets/cxl/ref.drawio.svg | 120 +-- cds/cxl.md | 69 +- menu.md | 1 + 6 files changed, 1075 insertions(+), 750 deletions(-) diff --git a/assets/cxl/expr.drawio.svg b/assets/cxl/expr.drawio.svg index b446ead6b7..e10aa211e7 100644 --- a/assets/cxl/expr.drawio.svg +++ b/assets/cxl/expr.drawio.svg @@ -1,1326 +1,1614 @@ - + - + - - + + - + - - + + - - + + - + - - + + - + -
+
-
+
unary operator
- + unary operator - - - - - - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + -
- - - - - - - -
-
-
- literal value + + + + +
+
+
+ literal value +
-
- - - literal value - - + + + literal value + + + - - - - - - - - -
-
- - - - ref - - + + + ref + + + - - - - - + - - + + - + + - - - - -
-
- - - - expr - - + + + expr + + + - - - - - + - - + + - - + + - + + - - - - -
-
- - - - expr - - + + + expr + + + - + - - + + - + -
+
-
+
binary operator
- - binary operator + + binary operat... - - - - - - - -
-
- - - - expr - - + + + expr + + + - + - - + + - - + + - + -
+
-
+
function name
- + function name - - + + - + -
+
-
+
(
- + ( - - + + - - - - - - - -
-
- - - - function args - - + + + function args + + + - - - - - + - + + - - - - -
-
- - - - over-clause - - + + + over-clause + + + - - - - - + - - + + - - + + - + + - - - - -
-
- - - - expr - - + + + expr + + + - + - + -
+
-
+
)
- + ) - - + + - + -
+
-
+
(
- + ( - + -
+
-
+
,
- + , - + -
+
-
+
)
- + ) - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + -
+
-
+
(
- + ( - - - - - + + - - - - -
-
- - - - expr - - + + + expr + + + - + - - + + - + -
+
-
- - as - +
+ as
- + as - - - - - + + - - - - -
-
- - - - type-name - - + + + type-name + + + - + - + -
+
-
+
)
- + ) - - + + - - + + - - + + - - - - - - - -
-
- - - - expr - - + + + expr + + + - + - + -
+
-
+
CAST
- + CAST - - + + - + - - + + - + -
+
-
+
LIKE
- + LIKE - - + + - - - - - - - -
-
- - - - expr - - + + + expr + + + - - - - - + - - + + - + + - - - - -
-
- - - - expr - - + + + expr + + + - + - + -
+
-
+
NULL
- + NULL - - - - - - + + - - + + - + + - - - - -
-
- - - - expr - - + + + expr + + + - + - - + + - + -
+
-
+
NOT
- + NOT - - + + - - + + - + -
+
-
+
BETWEEN
- + BETWEEN - + -
+
-
+
NOT
- + NOT - - + + - + -
+
-
+
IS
- + IS - - + + - + -
+
-
+
NOT
- + NOT - - + + - - + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+
- + + + + + -
+
-
- expr +
+ AND
- - expr + + AND + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+
+ + + + + + + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+
- - + - + -
+
-
- AND +
+ NOT
- - AND + + NOT - + + + + + + + + + + + + + + + + + + + +
+
+
+ select-stmt +
+
+
+
+ + select-stmt + +
+
+
+
+ + + + + + -
+
-
- expr +
+ (
- - expr + + ( - - - - - - - - - + -
+
-
- expr +
+ )
- - expr + + ) + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+
- + + - + -
+
-
- NOT +
+ ,
- - NOT + + , - - + + + + + + - - + + - - + + - + + + + + + + + -
+
-
- select-stmt +
+ NOT
- - select-stmt + + NOT - - + + - + -
+
-
- ( +
+ EXISTS
- - ( + + EXISTS - + + + + + + + + + + + + + + + + + + + +
+
+
+ select-stmt +
+
+
+
+ + select-stmt + +
+
+
+
+ + + + + + -
+
-
- ) +
+ (
- - ) + + ( - + -
+
-
- expr +
+ )
- - expr + + ) - - + + + + + + - + -
+
-
- , +
+ IN
- - , + + IN - - + + - - - - - - - - - - - - - - - - - - - - + -
+
-
- NOT +
+ CASE
- - NOT + + CASE - - + + - + -
+
-
- EXISTS +
+ WHEN
- - EXISTS + + WHEN - - + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+
- - + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+
- - + + - + -
+
-
- select-stmt +
+ THEN
- - select-stmt + + THEN - - + + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+
+ + + + + + + - + -
+
-
- ( +
+ ELSE
- - ( + + ELSE - + + + + + + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+
+ + -
+
-
- ) +
+ END
- - ) + + END - - + + + + + + - + + diff --git a/assets/cxl/infix-filter.drawio.svg b/assets/cxl/infix-filter.drawio.svg index f9dc1eabd7..3e9248b045 100644 --- a/assets/cxl/infix-filter.drawio.svg +++ b/assets/cxl/infix-filter.drawio.svg @@ -1,27 +1,27 @@ - + - + - - + + - + - + -
+
-
+
WHERE @@ -29,118 +29,118 @@
- + WHERE - + -
+
-
+
infix filter
- + infix filter - + - - + + - + -
+
-
+
[
- + [ - - + + - + -
+
-
+
]
- + ] - - + + - + -
+
-
+
expr
- + expr - - + + - - + + diff --git a/assets/cxl/path-segment.drawio.svg b/assets/cxl/path-segment.drawio.svg index 419d0c1c37..8ee19253ba 100644 --- a/assets/cxl/path-segment.drawio.svg +++ b/assets/cxl/path-segment.drawio.svg @@ -1,31 +1,31 @@ - + - + - - + + - + - - + + - + -
+
-
+
structured-element @@ -33,93 +33,72 @@
- - structured-eleme... + + structured-ele... - - + + - + -
+
-
+
association
- + association - + - - - -
-
-
- path-segment -
-
-
-
- - path-segment - -
-
-
- - - - - - + + - + -
+
-
+
infix filter
- + infix filter - - + + - - + + diff --git a/assets/cxl/ref.drawio.svg b/assets/cxl/ref.drawio.svg index faf8df4956..27c3c32068 100644 --- a/assets/cxl/ref.drawio.svg +++ b/assets/cxl/ref.drawio.svg @@ -1,133 +1,133 @@ - + - + - - + + - + - - + + - - + + - - + + - - + + - + -
+
-
+
.
- + . - + -
+
-
+
.
- + . - + - - + + - + -
+
-
+
.
- + . - - + + - - + + - - + + - - + + - - + + - + -
+
-
+
$self @@ -135,43 +135,43 @@
- + $self - + -
+
-
+
Table Alias
- + Table Alias - + -
+
-
+
scalar element @@ -179,57 +179,57 @@
- + scalar element - + -
+
-
+
ref
- + ref - + -
+
-
+
path-segment
- + path-segment - - + + diff --git a/cds/cxl.md b/cds/cxl.md index f48b45576c..c912d20a08 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -7,19 +7,76 @@ status: draft uacp: Used as link target from Help Portal at https://help.sap.com/products/BTP/65de2977205c403bbc107264b8eccf4b/855e00bd559742a3b8276fbed4af1008.html --- -# Expression Notation (CXN) { #expressions} + +# Core Expression Language (CXL) { #expressions } -> big sequence diagram which describes expressions +## expr { #expr } +
-## ref +TODO: some text +## ref { #ref } -## path segment +
+TODO: some text -## infix filter +## path segment { #path-segment } +
+ +TODO: some text + +## infix filter { #infix-filter } + +
+ +TODO: some text + +## literal value { #literal-value } + +TODO + +## function args { #function-args } + +TODO + +## over-clause { #over-clause } + +TODO + +## type-name { #type-name } + +TODO + +## select-statement { #select-statement } + +TODO + + -## Sub Queries diff --git a/menu.md b/menu.md index 959b213a55..7edb184d94 100644 --- a/menu.md +++ b/menu.md @@ -126,6 +126,7 @@ ## [Query Language (CQL)](cds/cql) ## [Query Notation (CQN)](cds/cqn) ## [Expressions (CXN)](cds/cxn) +## [Expression Language (CXL)](cds/cxl) ## [Core / Built-in Types](cds/types) ## [Common Reuse Types](cds/common) ## [Common Annotations](cds/annotations) From 5f579bfb9474d16a13920e275628262f81485297 Mon Sep 17 00:00:00 2001 From: Patrice Bender Date: Mon, 1 Dec 2025 16:09:08 +0100 Subject: [PATCH 05/47] more diagrams --- assets/cxl/binary-operator.drawio.svg | 462 ++++++++++++++++++++++++ assets/cxl/binding-parameter.drawio.svg | 137 +++++++ assets/cxl/expr.drawio.svg | 402 ++++++++++++--------- assets/cxl/function-args.drawio.svg | 307 ++++++++++++++++ assets/cxl/infix-filter.drawio.svg | 109 +++--- assets/cxl/literal-value.drawio.svg | 259 +++++++++++++ assets/cxl/ordering-term.drawio.svg | 220 +++++++++++ assets/cxl/over-clause.drawio.svg | 206 +++++++++++ assets/cxl/path-segment.drawio.svg | 218 +++++++++-- assets/cxl/ref.drawio.svg | 149 ++++---- assets/cxl/unary-operator.drawio.svg | 232 ++++++++++++ cds/cxl.md | 46 ++- 12 files changed, 2400 insertions(+), 347 deletions(-) create mode 100644 assets/cxl/binary-operator.drawio.svg create mode 100644 assets/cxl/binding-parameter.drawio.svg create mode 100644 assets/cxl/function-args.drawio.svg create mode 100644 assets/cxl/literal-value.drawio.svg create mode 100644 assets/cxl/ordering-term.drawio.svg create mode 100644 assets/cxl/over-clause.drawio.svg create mode 100644 assets/cxl/unary-operator.drawio.svg diff --git a/assets/cxl/binary-operator.drawio.svg b/assets/cxl/binary-operator.drawio.svg new file mode 100644 index 0000000000..e61dde63c4 --- /dev/null +++ b/assets/cxl/binary-operator.drawio.svg @@ -0,0 +1,462 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + - + +
+
+
+
+ + - + +
+
+
+ + + + + + + +
+
+
+ * +
+
+
+
+ + * + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ + + + +
+
+
+
+ + + + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ / +
+
+
+
+ + / + +
+
+
+ + + + + + + +
+
+
+ = +
+
+
+
+ + = + +
+
+
+ + + + + + + +
+
+
+ != +
+
+
+
+ + != + +
+
+
+ + + + + + + +
+
+
+ == +
+
+
+
+ + == + +
+
+
+ + + + + + + +
+
+
+ <> +
+
+
+
+ + <> + +
+
+
+ + + + + + + +
+
+
+ > +
+
+
+
+ + > + +
+
+
+ + + + + + + +
+
+
+ >= +
+
+
+
+ + >= + +
+
+
+ + + + + + + +
+
+
+ < +
+
+
+
+ + < + +
+
+
+ + + + + + + +
+
+
+ <= +
+
+
+
+ + <= + +
+
+
+ + + + + + + +
+
+
+ AND +
+
+
+
+ + AND + +
+
+
+ + + + + + + +
+
+
+ OR +
+
+
+
+ + OR + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ || +
+
+
+
+ + || + +
+
+
+ + + + + + + + +
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/assets/cxl/binding-parameter.drawio.svg b/assets/cxl/binding-parameter.drawio.svg new file mode 100644 index 0000000000..2f2dd81742 --- /dev/null +++ b/assets/cxl/binding-parameter.drawio.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + ? + +
+
+
+
+ + ? + +
+
+
+ + + + + + + + + + + +
+
+
+ : +
+
+
+
+ + : + +
+
+
+ + + + + + + + + + + +
+
+
+ string-literal +
+
+
+
+ + string-literal + +
+
+
+ + + + + + + +
+
+
+ numeric-literal +
+
+
+
+ + numeric-liter... + +
+
+
+ + + + + + + + + + + + +
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/assets/cxl/expr.drawio.svg b/assets/cxl/expr.drawio.svg index e10aa211e7..07e2888ced 100644 --- a/assets/cxl/expr.drawio.svg +++ b/assets/cxl/expr.drawio.svg @@ -1,8 +1,8 @@ - + - + @@ -27,27 +27,6 @@ - - - - - - - -
-
-
- unary operator -
-
-
-
- - unary operator - -
-
-
@@ -95,8 +74,8 @@ - - + + @@ -126,16 +105,16 @@ - - + + - - + + @@ -160,31 +139,6 @@
- - - - - - - - - - - -
-
-
- binary operator -
-
-
-
- - binary operat... - -
-
-
@@ -209,8 +163,8 @@ - - + + @@ -290,8 +244,8 @@ - - + + @@ -317,26 +271,26 @@ - - + + - - + + - + - + -
+
expr @@ -344,7 +298,7 @@
- + expr @@ -373,8 +327,8 @@ - - + + @@ -440,24 +394,24 @@ - + - - + + - - + + - - + + - - + + @@ -468,8 +422,8 @@ - - + + @@ -493,8 +447,8 @@ - - + + @@ -593,12 +547,12 @@ - - + + - - + + @@ -653,7 +607,7 @@ - + @@ -681,7 +635,7 @@ - + @@ -708,8 +662,8 @@ - - + + @@ -760,8 +714,8 @@ - - + + @@ -895,7 +849,7 @@ - + @@ -920,7 +874,7 @@ - + @@ -999,8 +953,8 @@ - - + + @@ -1054,16 +1008,16 @@ - - + + - - + + @@ -1158,7 +1112,7 @@ - + @@ -1183,24 +1137,24 @@ - + - + - + - - + + - - + + @@ -1252,16 +1206,16 @@ - - + + - - + + - - + + @@ -1333,8 +1287,8 @@ - - + + @@ -1362,17 +1316,17 @@ - - + + - + -
+
CASE @@ -1380,24 +1334,24 @@
- + CASE - - + + - + -
+
WHEN @@ -1405,25 +1359,25 @@
- + WHEN - - + +
- + -
+
expr @@ -1431,7 +1385,7 @@
- + expr @@ -1439,18 +1393,18 @@
- - + + - + -
+
expr @@ -1458,7 +1412,7 @@
- + expr @@ -1466,17 +1420,17 @@
- - + + - + -
+
THEN @@ -1484,25 +1438,25 @@
- + THEN - - + + - + -
+
expr @@ -1510,7 +1464,7 @@
- + expr @@ -1518,21 +1472,21 @@
- - + + - - + + - + -
+
ELSE @@ -1540,29 +1494,29 @@
- + ELSE - - + + - - + + - + -
+
expr @@ -1570,7 +1524,7 @@
- + expr @@ -1578,13 +1532,13 @@
- + -
+
END @@ -1592,23 +1546,135 @@
- + END - - + + - - + + - - + + + + + + + + + + + +
+
+
+ unary operator +
+
+
+
+ + unary operator + +
+
+
+
+ + + + + + + + + + + + +
+
+
+ binary operator +
+
+
+
+ + binary operat... + +
+
+
+
+ + + + + + + + +
+
+
+ binding-parameter +
+
+
+
+ + binding-param... + +
+
+
+
+ + + + + + + + + + + + + + + + +
+
+
+ ref +
+
+
+
+ + ref + +
+
+
+
+ + + + + + + diff --git a/assets/cxl/function-args.drawio.svg b/assets/cxl/function-args.drawio.svg new file mode 100644 index 0000000000..158e5fb2bf --- /dev/null +++ b/assets/cxl/function-args.drawio.svg @@ -0,0 +1,307 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+
+ + + + + + + +
+
+
+ , +
+
+
+
+ + , + +
+
+
+ + + + + + + + + + + + + + + + +
+
+
+ ordering-term +
+
+
+
+ + ordering-term + +
+
+
+
+ + + + + + + + + + + +
+
+
+ ORDER +
+
+
+
+ + ORDER + +
+
+
+ + + + + + + + + + + +
+
+
+ BY +
+
+
+
+ + BY + +
+
+
+ + + + + + + + + + + +
+
+
+ , +
+
+
+
+ + , + +
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+ param name +
+
+
+
+ + param name + +
+
+
+ + + + + + + +
+
+
+ : +
+
+
+
+ + : + +
+
+
+ + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+ , +
+
+
+
+ + , + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/assets/cxl/infix-filter.drawio.svg b/assets/cxl/infix-filter.drawio.svg index 3e9248b045..9b10babb0c 100644 --- a/assets/cxl/infix-filter.drawio.svg +++ b/assets/cxl/infix-filter.drawio.svg @@ -1,25 +1,25 @@ - + - + - - + + - + - + -
+
@@ -29,48 +29,27 @@
- + WHERE - + - - - -
-
-
- infix filter -
-
-
-
- - infix filter - -
-
-
- - - - - - + + - + -
+
[ @@ -78,24 +57,24 @@
- + [ - - + + - + -
+
] @@ -103,44 +82,46 @@
- + ] - - + + - - - - - - - -
-
- - - - expr - - + + + expr + + + - + - - + + - - + + diff --git a/assets/cxl/literal-value.drawio.svg b/assets/cxl/literal-value.drawio.svg new file mode 100644 index 0000000000..ef77ef51cb --- /dev/null +++ b/assets/cxl/literal-value.drawio.svg @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + string-literal + +
+
+
+
+ + string-literal + +
+
+
+ + + + + + + +
+
+
+ NULL +
+
+
+
+ + NULL + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ + numeric-literal + +
+
+
+
+ + numeric-literal + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ TRUE +
+
+
+
+ + TRUE + +
+
+
+ + + + + + + +
+
+
+ FALSE +
+
+
+
+ + FALSE + +
+
+
+ + + + + + + +
+
+
+ CURRENT_TIMESTAMP +
+
+
+
+ + CURRENT_TIMESTAMP + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ CURRENT_DATE +
+
+
+
+ + CURRENT_DATE + +
+
+
+ + + + + + + +
+
+
+ CURRENT_TIME +
+
+
+
+ + CURRENT_TIME + +
+
+
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/assets/cxl/ordering-term.drawio.svg b/assets/cxl/ordering-term.drawio.svg new file mode 100644 index 0000000000..01a1664494 --- /dev/null +++ b/assets/cxl/ordering-term.drawio.svg @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+
+ + + + + + + +
+
+
+ ASC +
+
+
+
+ + ASC + +
+
+
+ + + + + + + +
+
+
+ DESC +
+
+
+
+ + DESC + +
+
+
+ + + + + + + +
+
+
+ NULLS +
+
+
+
+ + NULLS + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ NULLS +
+
+
+
+ + NULLS + +
+
+
+ + + + + + + + + + + +
+
+
+ FIRST +
+
+
+
+ + FIRST + +
+
+
+ + + + + + + +
+
+
+ LAST +
+
+
+
+ + LAST + +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/assets/cxl/over-clause.drawio.svg b/assets/cxl/over-clause.drawio.svg new file mode 100644 index 0000000000..4c55809335 --- /dev/null +++ b/assets/cxl/over-clause.drawio.svg @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ ASC +
+
+
+
+ + ASC + +
+
+
+ + + + + + + +
+
+
+ DESC +
+
+
+
+ + DESC + +
+
+
+ + + + + + + +
+
+
+ NULLS +
+
+
+
+ + NULLS + +
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+ NULLS +
+
+
+
+ + NULLS + +
+
+
+ + + + + + + + + + + +
+
+
+ FIRST +
+
+
+
+ + FIRST + +
+
+
+ + + + + + + +
+
+
+ LAST +
+
+
+
+ + LAST + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ OVER +
+
+
+
+ + OVER + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/assets/cxl/path-segment.drawio.svg b/assets/cxl/path-segment.drawio.svg index 8ee19253ba..9076f35cbf 100644 --- a/assets/cxl/path-segment.drawio.svg +++ b/assets/cxl/path-segment.drawio.svg @@ -1,29 +1,29 @@ - + - + - - + + - - + + - + -
+
@@ -33,24 +33,20 @@
- + structured-ele... - - - - - + -
+
association @@ -58,47 +54,213 @@
- + association - + + + + + + + + + + + + + + +
+
+
+ infix filter +
+
+
+
+ + infix filter + +
+
+
+
+ + + + + + + +
+
+
+ param name +
+
+
+
+ + param name + +
+
+
+ + + + + + + +
+
+
+ : +
+
+
+
+ + : + +
+
+
+ + + + + + + + + + + + +
+
+
+ expr +
+
+
+
+ + expr + +
+
+
+
+ + + + + + + + + + + + + + + +
+
+
+ , +
+
+
+
+ + , + +
+
+
+ + + - - + + - + -
+
- infix filter + (
- - infix filter + + ( - - + + + + + + +
+
+
+ ) +
+
+
+
+ + ) + +
+
+
+ + + + + + + + + + + + + + + + + + + - - + + diff --git a/assets/cxl/ref.drawio.svg b/assets/cxl/ref.drawio.svg index 27c3c32068..8e13d29991 100644 --- a/assets/cxl/ref.drawio.svg +++ b/assets/cxl/ref.drawio.svg @@ -1,41 +1,41 @@ - + - + - - + + - + - - + + - - + + - - + + - - + + - + -
+
. @@ -43,20 +43,20 @@
- + . - + -
+
. @@ -64,27 +64,27 @@
- + . - + - - + + - + -
+
. @@ -92,40 +92,40 @@
- + . - - + + - - + + - - + + - - + + - - + + - + -
+
@@ -135,20 +135,20 @@
- + $self - + -
+
Table Alias @@ -156,20 +156,20 @@
- + Table Alias - + -
+
@@ -179,57 +179,38 @@
- + scalar element - - - - - - - -
-
-
- ref -
-
-
-
- - ref - -
+ + + -
- - - - - - - -
-
-
- path-segment + + + + +
+
+
+ path-segment +
-
- - - path-segment - - + + + path-segment + + + - +
- - + + diff --git a/assets/cxl/unary-operator.drawio.svg b/assets/cxl/unary-operator.drawio.svg new file mode 100644 index 0000000000..b6f5ff9164 --- /dev/null +++ b/assets/cxl/unary-operator.drawio.svg @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + - + +
+
+
+
+ + - + +
+
+
+ + + + + + + +
+
+
+ NOT +
+
+
+
+ + NOT + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ + + + +
+
+
+
+ + + + +
+
+
+ + + + + + + + +
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/cds/cxl.md b/cds/cxl.md index c912d20a08..fb43063041 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -12,6 +12,13 @@ import expr from '/assets/cxl/expr.drawio.svg?raw' import ref from '/assets/cxl/ref.drawio.svg?raw' import pathSegment from '/assets/cxl/path-segment.drawio.svg?raw' import infixFilter from '/assets/cxl/infix-filter.drawio.svg?raw' +import unaryOperator from '/assets/cxl/unary-operator.drawio.svg?raw' +import binaryOperator from '/assets/cxl/binary-operator.drawio.svg?raw' +import literalValue from '/assets/cxl/literal-value.drawio.svg?raw' +import bindingParameter from '/assets/cxl/binding-parameter.drawio.svg?raw' +import functionArgs from '/assets/cxl/function-args.drawio.svg?raw' +import orderingTerm from '/assets/cxl/ordering-term.drawio.svg?raw' +import overClause from '/assets/cxl/over-clause.drawio.svg?raw' # Core Expression Language (CXL) { #expressions } @@ -40,17 +47,50 @@ TODO: some text TODO: some text -## literal value { #literal-value } +## unary operator { #unary-operator } + +
+ +TODO: some text + +## binary operator { #binary-operator } + +
+ +TODO: some text + +## literal value { #literal-value } + +
TODO +## binding parameter { #binding-parameter } + +
+ +TODO: some text + +💡 string and numeric literal as well as `?` are parsed as `ref` + ## function args { #function-args } -TODO +
+ +TODO: some text + +❓ REVISIT: I dont get the `ordering term` logic - it can only be applied to exactly one parameter. +I would have expected that it can only be provided for the last parameter. + +## ordering term { #ordering-term } + +
+ +TODO: some text ## over-clause { #over-clause } -TODO +
## type-name { #type-name } From db134382333fb07c768939ae83b27aa23764d1f1 Mon Sep 17 00:00:00 2001 From: Johannes Vogt Date: Mon, 1 Dec 2025 18:29:15 +0100 Subject: [PATCH 06/47] some text --- cds/cxl.md | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/cds/cxl.md b/cds/cxl.md index c912d20a08..faad6020d4 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -16,11 +16,36 @@ import infixFilter from '/assets/cxl/infix-filter.drawio.svg?raw' # Core Expression Language (CXL) { #expressions } +Expressions are represented using the Core Expression Language (CXL). It is based on SQL expressions, so many syntax elements from SQL are also available in CXL. + +CXL can be used in various places (TODO: Links): +- In queries as part of the select list or where clause +- In calculated elements +- In annotations, where supported + ## expr { #expr } +An expression can hold various elements, such as references, literals, function calls, operators, and more. A few examples, in the context of a select list: +```cds +select from Books { + 42 as answer, // literal + title, // ref + price * quantity as totalPrice, // binary operator + substring(title, 1, 3) as shortTitle, // function call + author.name as authorName, // ref with path segment + chapters[number < 3] as earlyChapters, // infix filter + exists chapters as hasChapters, // exists + count(chapters) as chapterCount, // aggregate function +} +``` + +Syntax: +
-TODO: some text + + +TODO: some text and more examples ## ref { #ref } From 4522abfed6d0b2d256a35dfba9e041fc12d91143 Mon Sep 17 00:00:00 2001 From: Patrice Bender Date: Tue, 2 Dec 2025 11:15:38 +0100 Subject: [PATCH 07/47] recangular entities --- assets/cxl/expr.drawio.svg | 224 ++++++++++++++-------------- assets/cxl/function-args.drawio.svg | 46 +++--- assets/cxl/infix-filter.drawio.svg | 4 +- assets/cxl/ordering-term.drawio.svg | 4 +- assets/cxl/path-segment.drawio.svg | 6 +- assets/cxl/ref.drawio.svg | 4 +- 6 files changed, 144 insertions(+), 144 deletions(-) diff --git a/assets/cxl/expr.drawio.svg b/assets/cxl/expr.drawio.svg index 07e2888ced..04f563840f 100644 --- a/assets/cxl/expr.drawio.svg +++ b/assets/cxl/expr.drawio.svg @@ -1,4 +1,4 @@ - + @@ -29,7 +29,7 @@ - + @@ -52,7 +52,7 @@ - + @@ -74,16 +74,16 @@ - - + + - - + + - + @@ -105,12 +105,12 @@ - - + + - - + + @@ -118,7 +118,7 @@ - + @@ -141,7 +141,7 @@ - + @@ -163,8 +163,8 @@ - - + + @@ -222,7 +222,7 @@ - + @@ -244,12 +244,12 @@ - - + + - + @@ -271,12 +271,12 @@ - - + + - - + + @@ -284,7 +284,7 @@ - + @@ -394,24 +394,24 @@ - - + + - - + + - - + + - - + + - - + + @@ -452,7 +452,7 @@ - + @@ -504,7 +504,7 @@ - + @@ -547,12 +547,12 @@ - - + + - - + + @@ -560,7 +560,7 @@ - + @@ -603,8 +603,8 @@ - - + + @@ -635,12 +635,12 @@ - - + + - + @@ -662,8 +662,8 @@ - - + + @@ -671,7 +671,7 @@ - + @@ -714,12 +714,12 @@ - - + + - - + + @@ -727,7 +727,7 @@ - + @@ -849,8 +849,8 @@ - - + + @@ -874,8 +874,8 @@ - - + + @@ -883,7 +883,7 @@ - + @@ -931,7 +931,7 @@ - + @@ -953,16 +953,16 @@ - - + + - - + + - + @@ -1008,8 +1008,8 @@ - - + + @@ -1021,7 +1021,7 @@ - + @@ -1090,7 +1090,7 @@ - + @@ -1112,8 +1112,8 @@ - - + + @@ -1137,24 +1137,24 @@ - - + + - - + + - - + + - - + + - - + + @@ -1206,12 +1206,12 @@ - - + + - - + + @@ -1219,7 +1219,7 @@ - + @@ -1287,8 +1287,8 @@ - - + + @@ -1371,7 +1371,7 @@ - + @@ -1398,7 +1398,7 @@ - + @@ -1445,12 +1445,12 @@ - - + + - + @@ -1472,7 +1472,7 @@ - + @@ -1510,7 +1510,7 @@ - + @@ -1553,20 +1553,20 @@ - + - - + + - - + + - + @@ -1593,7 +1593,7 @@ - + @@ -1616,7 +1616,7 @@ - + @@ -1638,16 +1638,16 @@ - - + + - - + + - + @@ -1669,12 +1669,12 @@ - + - - + + diff --git a/assets/cxl/function-args.drawio.svg b/assets/cxl/function-args.drawio.svg index 158e5fb2bf..45df8caab0 100644 --- a/assets/cxl/function-args.drawio.svg +++ b/assets/cxl/function-args.drawio.svg @@ -1,4 +1,4 @@ - + @@ -21,7 +21,7 @@ - + @@ -64,16 +64,16 @@ - - + + - - + + - + @@ -170,16 +170,16 @@ - - + + - - + + - - + + @@ -225,7 +225,7 @@ - + @@ -255,7 +255,7 @@ - + @@ -280,20 +280,20 @@ - - + + - - + + - - + + - - + + diff --git a/assets/cxl/infix-filter.drawio.svg b/assets/cxl/infix-filter.drawio.svg index 9b10babb0c..d087567407 100644 --- a/assets/cxl/infix-filter.drawio.svg +++ b/assets/cxl/infix-filter.drawio.svg @@ -1,4 +1,4 @@ - + @@ -94,7 +94,7 @@ - + diff --git a/assets/cxl/ordering-term.drawio.svg b/assets/cxl/ordering-term.drawio.svg index 01a1664494..558107a7db 100644 --- a/assets/cxl/ordering-term.drawio.svg +++ b/assets/cxl/ordering-term.drawio.svg @@ -1,4 +1,4 @@ - + @@ -17,7 +17,7 @@ - + diff --git a/assets/cxl/path-segment.drawio.svg b/assets/cxl/path-segment.drawio.svg index 9076f35cbf..b9fa17b032 100644 --- a/assets/cxl/path-segment.drawio.svg +++ b/assets/cxl/path-segment.drawio.svg @@ -1,4 +1,4 @@ - + @@ -69,7 +69,7 @@ - + @@ -138,7 +138,7 @@ - + diff --git a/assets/cxl/ref.drawio.svg b/assets/cxl/ref.drawio.svg index 8e13d29991..f047b97a59 100644 --- a/assets/cxl/ref.drawio.svg +++ b/assets/cxl/ref.drawio.svg @@ -1,4 +1,4 @@ - + @@ -187,7 +187,7 @@ - + From ca9858bb530e88872401f2f95abaabce0da6230f Mon Sep 17 00:00:00 2001 From: Johannes Vogt Date: Tue, 2 Dec 2025 16:01:30 +0100 Subject: [PATCH 08/47] functions with method style --- assets/cxl/expr.drawio.svg | 276 +++++++++------------------- assets/cxl/function-args.drawio.svg | 36 ++-- assets/cxl/function-def.drawio.svg | 264 ++++++++++++++++++++++++++ cds/cxl.md | 7 + 4 files changed, 372 insertions(+), 211 deletions(-) create mode 100644 assets/cxl/function-def.drawio.svg diff --git a/assets/cxl/expr.drawio.svg b/assets/cxl/expr.drawio.svg index 04f563840f..a4964e901c 100644 --- a/assets/cxl/expr.drawio.svg +++ b/assets/cxl/expr.drawio.svg @@ -1,4 +1,4 @@ - + @@ -74,12 +74,12 @@ - + - - + + @@ -105,12 +105,12 @@ - + - - + + @@ -163,117 +163,13 @@ - + - - - - - - - - - - -
-
-
- function name -
-
-
-
- - function name - -
-
-
- - - - - - - - - - - -
-
-
- ( -
-
-
-
- - ( - -
-
-
- - - - - - - - - - - - -
-
-
- function args -
-
-
-
- - function args - -
-
-
-
- - + - - - - - - - - -
-
-
- over-clause -
-
-
-
- - over-clause - -
-
-
-
- - - - @@ -305,27 +201,6 @@
- - - - - - - -
-
-
- ) -
-
-
-
- - ) - -
-
-
@@ -394,25 +269,21 @@
- - + + - + - + - - - - @@ -422,8 +293,8 @@ - - + + @@ -447,8 +318,8 @@
- - + + @@ -547,7 +418,7 @@
- + @@ -603,8 +474,8 @@
- - + + @@ -635,8 +506,8 @@
- - + + @@ -662,7 +533,7 @@ - + @@ -714,12 +585,12 @@
- + - - + + @@ -849,8 +720,8 @@
- - + + @@ -874,8 +745,8 @@
- - + + @@ -953,12 +824,12 @@
- + - - + + @@ -1008,7 +879,7 @@ - + @@ -1016,8 +887,8 @@ - - + + @@ -1112,8 +983,8 @@ - - + + @@ -1137,19 +1008,19 @@ - - + + - - + + - - + + - + @@ -1210,12 +1081,12 @@ - + - - + + @@ -1287,7 +1158,7 @@ - + @@ -1445,8 +1316,8 @@ - - + + @@ -1472,8 +1343,8 @@ - - + + @@ -1553,15 +1424,15 @@ - - + + - - + + - + @@ -1638,11 +1509,11 @@ - - + + - + @@ -1673,9 +1544,32 @@ - + + + + + + + + + +
+
+
+ function +
+
+
+
+ + function + +
+
+
+
diff --git a/assets/cxl/function-args.drawio.svg b/assets/cxl/function-args.drawio.svg index 45df8caab0..cee93792f4 100644 --- a/assets/cxl/function-args.drawio.svg +++ b/assets/cxl/function-args.drawio.svg @@ -1,10 +1,6 @@ - + - - - - @@ -64,11 +60,11 @@ - - + + - + @@ -170,15 +166,15 @@ - + - - + + - + @@ -212,13 +208,13 @@
- : + =>
- : + =>
@@ -255,7 +251,7 @@ - + @@ -280,19 +276,19 @@ - + - - + + - + - + diff --git a/assets/cxl/function-def.drawio.svg b/assets/cxl/function-def.drawio.svg new file mode 100644 index 0000000000..fced41c403 --- /dev/null +++ b/assets/cxl/function-def.drawio.svg @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ function name +
+
+
+
+ + function name + +
+
+
+ + + + + + + + + + + +
+
+
+ ( +
+
+
+
+ + ( + +
+
+
+ + + + + + + + + + + + +
+
+
+ function args +
+
+
+
+ + function args + +
+
+
+
+ + + + + + + + +
+
+
+ over-clause +
+
+
+
+ + over-clause + +
+
+
+
+ + + + + + + + + + + +
+
+
+ ) +
+
+
+
+ + ) + +
+
+
+ + + + + + + + +
+
+
+ function +
+
+
+
+ + function + +
+
+
+
+ + + + + + + +
+
+
+ . +
+
+
+
+ + . + +
+
+
+ + + + + + + +
+
+
+ function name +
+
+
+
+ + function name + +
+
+
+ + + + + + + + + + + + + + + + +
+
+
+ function +
+
+
+
+ + function + +
+
+
+
+ + + + + + + + + + + + +
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/cds/cxl.md b/cds/cxl.md index bf26d43561..2aa1a519fd 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -16,6 +16,7 @@ import unaryOperator from '/assets/cxl/unary-operator.drawio.svg?raw' import binaryOperator from '/assets/cxl/binary-operator.drawio.svg?raw' import literalValue from '/assets/cxl/literal-value.drawio.svg?raw' import bindingParameter from '/assets/cxl/binding-parameter.drawio.svg?raw' +import functionDef from '/assets/cxl/function-def.drawio.svg?raw' import functionArgs from '/assets/cxl/function-args.drawio.svg?raw' import orderingTerm from '/assets/cxl/ordering-term.drawio.svg?raw' import overClause from '/assets/cxl/over-clause.drawio.svg?raw' @@ -98,6 +99,12 @@ TODO: some text 💡 string and numeric literal as well as `?` are parsed as `ref` +## function { #function } + +
+ +TODO: some text + ## function args { #function-args }
From 45bf61b2d75e56a163478529a4ccf3d1219d713d Mon Sep 17 00:00:00 2001 From: Patrice Bender Date: Wed, 3 Dec 2025 19:07:28 +0100 Subject: [PATCH 09/47] add intro and some samples for ref --- assets/cxl/intro.drawio.svg | 252 ++++++++++++++++++++++++++++++++ assets/cxl/ref.drawio.svg | 69 +++++---- cds/cxl.md | 282 ++++++++++++++++++++++++++++++++++-- 3 files changed, 561 insertions(+), 42 deletions(-) create mode 100644 assets/cxl/intro.drawio.svg diff --git a/assets/cxl/intro.drawio.svg b/assets/cxl/intro.drawio.svg new file mode 100644 index 0000000000..643a412afe --- /dev/null +++ b/assets/cxl/intro.drawio.svg @@ -0,0 +1,252 @@ + + + + + + + + + + + + + + + + + + + + + Some shapes have tooltips with some explanation, try it out! 🚀 + + + + + + + Some shapes have tooltips with some explanation, try it out! 🚀 + + + +
+
+
+ alternative 1 +
+
+
+
+ + alternative 1 + +
+
+
+ + + + + + + +
+
+
+ alternative + + 2 + +
+
+
+
+ + alternative 2 + +
+
+
+ + + + + + + + +
+
+
+ language construct +
+
+
+
+ + language construct + +
+
+
+
+ + + + + + + + + + + + +
+
+
+ you start here 🫵 +
+
+
+
+ + you start here 🫵 + +
+
+
+ + + + + + + + + + + + + + + + +
+
+
+ 💡clickable +
+
+
+
+ + 💡clickable + +
+
+
+ + + + + + + + + + + + +
+
+
+ finish 🏁 +
+
+
+
+ + finish 🏁 + +
+
+
+ + + + + + + + +
+
+
+ 💡tooltip +
+
+
+
+ + 💡tooltip + +
+
+
+ + + + + + + +
+
+
+ + Round shapes refer to terminal symbols such as `exists` or `null`, which can't be further divided + +
+
+
+
+ + Round shapes refer to ter... + +
+
+
+ + + + + + + +
+
+
+ + language constructs can be broken down further and get their own syntax diagram + +
+
+
+
+ + language constructs can b... + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/assets/cxl/ref.drawio.svg b/assets/cxl/ref.drawio.svg index f047b97a59..7997f888bc 100644 --- a/assets/cxl/ref.drawio.svg +++ b/assets/cxl/ref.drawio.svg @@ -1,4 +1,4 @@ - + @@ -13,29 +13,25 @@ - - + + - - + + - - - - - + -
+
. @@ -43,7 +39,7 @@
- + . @@ -71,20 +67,20 @@ - + - - + + - + -
+
. @@ -92,19 +88,19 @@
- + . - - + + - - + + @@ -115,8 +111,8 @@ - - + + @@ -163,13 +159,20 @@ - + + + a scalar element is a primitive field (e.g., String, Integer, Decimal, Boolean, Date/Time, UUID) without nested structure or associations + + + + a scalar element is a primitive field (e.g., String, Integer, Decimal, Boolean, Date/Time, UUID) without nested structure or associations + -
+
@@ -179,7 +182,7 @@
- + scalar element @@ -212,6 +215,18 @@ + + + + + + + + + + + + diff --git a/cds/cxl.md b/cds/cxl.md index 2aa1a519fd..f5f9b8d1a5 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -20,18 +20,60 @@ import functionDef from '/assets/cxl/function-def.drawio.svg?raw' import functionArgs from '/assets/cxl/function-args.drawio.svg?raw' import orderingTerm from '/assets/cxl/ordering-term.drawio.svg?raw' import overClause from '/assets/cxl/over-clause.drawio.svg?raw' +import intro from '/assets/cxl/intro.drawio.svg?raw' # Core Expression Language (CXL) { #expressions } -Expressions are represented using the Core Expression Language (CXL). It is based on SQL expressions, so many syntax elements from SQL are also available in CXL. +Expressions are represented using the Core Expression Language (CXL). +It is based on SQL expressions, so many syntax elements from SQL are also available in CXL. CXL can be used in various places (TODO: Links): - In queries as part of the select list or where clause - In calculated elements - In annotations, where supported -## expr { #expr } + +## How to read this guide { #how-to } + + +In the following chapters we illustrate the CXN syntax based on simple and more complex examples. +For a complete reference of the syntax, there are additionally clickable syntax diagrams for each language construct. + +### samples + +To try the samples by yourself, create a simple CAP app: + +```sh +cds init bookshop --add sample && cd bookshop +``` + +We encourage you to play around with the snippets. +Just create the sample app as described above and start a repl session within the newly created app by running: + +```sh +cds repl --run . +``` + +:::info 💡 All of the example expressions follow the same pattern: +1. A `CXL` snippet is shown as part of a query - either in the columns or in a query modifier. +2. The corresponding **CAP Style CXL** representation is shown as `JSON`. +3. The resulting **SQL Style CXL** is shown as `JSON`. +4. The resulting **SQL output** is shown in SQL syntax. +::: + +### diagrams + +Each language construct is illustrated by a clickable syntax diagram. +They show the syntax of CAPs expression language as a sequence of building blocks. +By clicking on the individual blocks, you can get more information about the respective building block. + +The following diagram illustrates how to read the diagrams: + +
+ + +## expr { #expr } An expression can hold various elements, such as references, literals, function calls, operators, and more. A few examples, in the context of a select list: ```cds @@ -47,7 +89,7 @@ select from Books { } ``` -Syntax: +### syntax
@@ -55,11 +97,225 @@ Syntax: TODO: some text and more examples -## ref { #ref } +## ref (path expression) { #ref } + +A `ref` (short for reference) is used to refer to an element within the model. +It can be used to navigate along [path-segments](#path-segment). Such a navigation is often +referred to as a **path expression**. + +⬇️ [Jump to syntax diagram](#ref-syntax). + +### scalar element with and without table alias + +In it's most simple form, a `ref` just contains the name of the element being referenced: + +:::code-group +```js +> q = cds.ql`SELECT from Books as B { title, B.price }`// [!code focus] +cds.ql { + SELECT: { + from: { ref: [ 'Books' ], as: 'B' }, + columns: [ { ref: [ 'title' ] }, { ref: [ 'B', 'price' ] } ] + } +} +> await q +[ + { title: 'Wuthering Heights', price: 11.11 }, + { title: 'Jane Eyre', price: 12.34 }, + { title: 'The Raven', price: 13.13 }, + { title: 'Eleonora', price: 14 }, + { title: 'Catweazle', price: 150 } +] +``` +::: + +In this case, the CAP Style and SQL Style CXL representations are almost identical: + +:::code-group +```json5 [CAP Style expression] +cds.ql { + SELECT: { + from: { ref: [ 'sap.capire.bookshop.Books' ], as: 'B' }, + columns: [ { ref: [ 'title' ] }, { ref: [ 'B', 'price' ] } ] + } +} +``` + +```json5 [SQL Style expression] +cds.ql { + SELECT: { + from: { ref: [ 'sap.capire.bookshop.Books' ], as: 'B' }, + columns: [ { ref: [ 'B', 'title' ] }, { ref: [ 'B', 'price' ] } ] + } +} +``` + +```sql [SQL output] +SELECT B.title, B.price FROM sap_capire_bookshop_Books as B +``` +::: + +The CAP runtime only prefixes the `ref` of the `title` element with the table alias `B` when generating the SQL output. + +### navigation to foreign key with multiple path-segments + +A `ref` can also contain multiple [path-segments](#path-segment), e.g. to navigate associations: + +:::code-group +```js +> q = cds.ql`SELECT from Books as B { author.ID, genre }` // [!code focus] +cds.ql { + SELECT: { + from: { ref: [ 'Books' ], as: 'B' }, + columns: [ { ref: [ 'author', 'ID' ] }, { ref: [ 'genre' ] } ] + } +} +> await q +[ + { author_ID: 101, genre_ID: 11 }, + { author_ID: 107, genre_ID: 11 }, + { author_ID: 150, genre_ID: 16 }, + { author_ID: 150, genre_ID: 16 }, + { author_ID: 170, genre_ID: 13 } +] +``` +::: + +In this case, we navigate along the association `author` and select the `ID`. +As `ID` is the implicit foreign key field of the `author` association, the resulting SQL Style CXL representation +contains the foreign key field `author_ID`. +For `genre` the path ends on the association, in such a case the foreign key field `genre_ID` is selected. + +Both formats only deviate slightly: + +:::code-group +```json5 [CAP Style expression] +cds.ql { + SELECT: { + from: { ref: [ 'sap.capire.bookshop.Books' ], as: 'B' }, + columns: [ { ref: [ 'author', 'ID' ] }, { ref: [ 'genre' ] } ] + } +} +``` + +```json5 [SQL Style expression] +cds.ql { + SELECT: { + from: { ref: [ 'sap.capire.bookshop.Books' ], as: 'B' }, + columns: [ { ref: [ 'B', 'author_ID' ] }, { ref: [ 'B', 'genre_ID' ] } ] + } +} +``` + +```sql [SQL output] +SELECT B.author_ID, B.genre_ID FROM sap_capire_bookshop_Books as B +``` +::: -
-TODO: some text + +### navigation to non foreign key with multiple path-segments + +A `ref` can also end on a non-foreign key element after navigating associations + +:::code-group +```js +> q = cds.ql`SELECT from Books as B { author.name, genre.name }` // [!code focus] +cds.ql { + SELECT: { + from: { ref: [ 'Books' ], as: 'B' }, + columns: [ { ref: [ 'author', 'name' ] }, { ref: [ 'genre', 'name' ] } ] + } +} +> await q +[ + { author_name: 'Emily Brontë', genre_name: 'Drama' }, + { author_name: 'Charlotte Brontë', genre_name: 'Drama' }, + { author_name: 'Edgar Allen Poe', genre_name: 'Mystery' }, + { author_name: 'Edgar Allen Poe', genre_name: 'Mystery' }, + { author_name: 'Richard Carpenter', genre_name: 'Fantasy' } +] +``` +::: + + +In this case, a little more happens under the hood. As the `ref` ends on non-foreign key elements (`name` of `author` and `genre`), +the CAP runtime automatically adds the necessary joins to the SQL Style CXL representation and the resulting SQL output. + +:::code-group +```json5 [CAP Style expression] +cds.ql { + SELECT: { + from: { ref: [ 'sap.capire.bookshop.Books' ], as: 'B' }, + columns: [ { ref: [ 'author', 'name' ] }, { ref: [ 'genre', 'name' ] } ] + } +} +``` + +```json5 [SQL Style expression] +cds.ql { + SELECT: { + from: { + join: 'left', + args: [ + { + join: 'left', + args: [ + { ref: [ 'sap.capire.bookshop.Books' ], as: 'B' }, + { ref: [ 'sap.capire.bookshop.Authors' ], as: 'author' } + ], + on: [ + { ref: [ 'author', 'ID' ] }, + '=', + { ref: [ 'B', 'author_ID' ] } + ] + }, + { ref: [ 'sap.capire.bookshop.Genres' ], as: 'genre' } + ], + on: [ { ref: [ 'genre', 'ID' ] }, '=', { ref: [ 'B', 'genre_ID' ] } ] + }, + columns: [ + { ref: [ 'author', 'name' ], as: 'author_name' }, + { ref: [ 'genre', 'name' ], as: 'genre_name' } + ] + } +} +``` + + +```sql [SQL output] +SELECT + author.name as author_name, + genre.name as genre_name +FROM + sap_capire_bookshop_Books as B + left JOIN sap_capire_bookshop_Authors as author ON author.ID = B.author_ID + left JOIN sap_capire_bookshop_Genres as genre ON genre.ID = B.genre_ID +``` +::: + +### TODO: maybe one or two more examples with structure navigation + +… + +### syntax diagram for `ref` { #ref-syntax } + +
+ +
+
+ +### conclusion + +A `ref` can be used to reference an element. +It is possible to navigate along [path-segments](#path-segment) to reference elements within the model. +This is not limited to an entities own elements, but can also be used to navigate associations to elements of related entities. + +This is only the tip of the iceberg. +A path expression can be much more complex. For example, the individual [path-segments](#path-segment) +themselves can contain expressions by applying [infix-filters](#infix-filter). +More samples are shown in the upcoming sections. + ## path segment { #path-segment } @@ -133,7 +389,6 @@ TODO TODO From 784e99c82a717c315d14e495616d1d56709d475e Mon Sep 17 00:00:00 2001 From: Patrice Bender Date: Wed, 3 Dec 2025 19:09:46 +0100 Subject: [PATCH 10/47] spelling --- cds/cxl.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cds/cxl.md b/cds/cxl.md index f5f9b8d1a5..0831771812 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -26,7 +26,7 @@ import intro from '/assets/cxl/intro.drawio.svg?raw' # Core Expression Language (CXL) { #expressions } Expressions are represented using the Core Expression Language (CXL). -It is based on SQL expressions, so many syntax elements from SQL are also available in CXL. +It is based on SQL expressions, so many syntax elements from SQL are also available in `CXL`. CXL can be used in various places (TODO: Links): - In queries as part of the select list or where clause @@ -37,7 +37,7 @@ CXL can be used in various places (TODO: Links): ## How to read this guide { #how-to } -In the following chapters we illustrate the CXN syntax based on simple and more complex examples. +In the following chapters we illustrate the `CXL` syntax based on simple and more complex examples. For a complete reference of the syntax, there are additionally clickable syntax diagrams for each language construct. ### samples @@ -57,8 +57,8 @@ cds repl --run . :::info 💡 All of the example expressions follow the same pattern: 1. A `CXL` snippet is shown as part of a query - either in the columns or in a query modifier. -2. The corresponding **CAP Style CXL** representation is shown as `JSON`. -3. The resulting **SQL Style CXL** is shown as `JSON`. +2. The corresponding **CAP Style `CXL`** representation is shown as `JSON`. +3. The resulting **SQL Style `CXL`** is shown as `JSON`. 4. The resulting **SQL output** is shown in SQL syntax. ::: @@ -129,7 +129,7 @@ cds.ql { ``` ::: -In this case, the CAP Style and SQL Style CXL representations are almost identical: +In this case, the CAP Style and SQL Style `CXL` representations are almost identical: :::code-group ```json5 [CAP Style expression] @@ -182,7 +182,7 @@ cds.ql { ::: In this case, we navigate along the association `author` and select the `ID`. -As `ID` is the implicit foreign key field of the `author` association, the resulting SQL Style CXL representation +As `ID` is the implicit foreign key field of the `author` association, the resulting SQL Style `CXL` representation contains the foreign key field `author_ID`. For `genre` the path ends on the association, in such a case the foreign key field `genre_ID` is selected. @@ -240,7 +240,7 @@ cds.ql { In this case, a little more happens under the hood. As the `ref` ends on non-foreign key elements (`name` of `author` and `genre`), -the CAP runtime automatically adds the necessary joins to the SQL Style CXL representation and the resulting SQL output. +the CAP runtime automatically adds the necessary joins to the SQL Style `CXL` representation and the resulting SQL output. :::code-group ```json5 [CAP Style expression] From 493b3eeaf8472ffa29a2fffc2ae73d8183ac2146 Mon Sep 17 00:00:00 2001 From: Johannes Vogt Date: Thu, 4 Dec 2025 10:05:58 +0100 Subject: [PATCH 11/47] update --- cds/cxl.md | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/cds/cxl.md b/cds/cxl.md index 0831771812..bb2c2d1699 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -110,7 +110,15 @@ referred to as a **path expression**. In it's most simple form, a `ref` just contains the name of the element being referenced: :::code-group -```js +```cds +using {sap.capire.bookshop.Books} from './db/schema'; + +entity Ref as select from Books as B { + title, // [!code focus] + B.price // [!code focus] +} +``` +```js [repl] > q = cds.ql`SELECT from Books as B { title, B.price }`// [!code focus] cds.ql { SELECT: { @@ -323,6 +331,39 @@ More samples are shown in the upcoming sections. TODO: some text +### Structured element + +```cds +extend Author with { + address: { + street: String; + city: String; + } +} +``` + + +:::code-group +```cds +entity Structured select from Authors { + address.street, // [!code focus] + address.city // [!code focus] +} +``` +```js +> q = cds.ql`SELECT from Books as B { author.name, genre.name }` // [!code focus] +``` +::: + +### Path segment with parameterized navigation + + + + +### Path segment with infix filter + + + ## infix filter { #infix-filter }
From ac6159e03e0e7178832324d1ee16da1afec01b36 Mon Sep 17 00:00:00 2001 From: Patrice Bender Date: Thu, 4 Dec 2025 16:57:51 +0100 Subject: [PATCH 12/47] minor changes to diagram --- assets/cxl/ref.drawio.svg | 24 ++++++++++++------------ cds/cxl.md | 12 ++++-------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/assets/cxl/ref.drawio.svg b/assets/cxl/ref.drawio.svg index 7997f888bc..c2f64a230a 100644 --- a/assets/cxl/ref.drawio.svg +++ b/assets/cxl/ref.drawio.svg @@ -1,4 +1,4 @@ - + @@ -6,8 +6,8 @@ - - + + @@ -21,7 +21,7 @@ - + @@ -103,15 +103,15 @@ - + - - + + - + @@ -190,13 +190,13 @@ - + -
+
path-segment @@ -224,8 +224,8 @@ - - + + diff --git a/cds/cxl.md b/cds/cxl.md index bb2c2d1699..92aacbd968 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -103,7 +103,10 @@ A `ref` (short for reference) is used to refer to an element within the model. It can be used to navigate along [path-segments](#path-segment). Such a navigation is often referred to as a **path expression**. -⬇️ [Jump to syntax diagram](#ref-syntax). +
+ +
+
### scalar element with and without table alias @@ -306,13 +309,6 @@ FROM … -### syntax diagram for `ref` { #ref-syntax } - -
- -
-
- ### conclusion A `ref` can be used to reference an element. From db644c21377701358d2345e5b497303a1f9dd9bb Mon Sep 17 00:00:00 2001 From: Johannes Vogt Date: Thu, 4 Dec 2025 18:29:23 +0100 Subject: [PATCH 13/47] small infix filter update --- assets/cxl/path-segment.drawio.svg | 96 +++++++++++++++--------------- cds/cxl.md | 14 +++++ 2 files changed, 62 insertions(+), 48 deletions(-) diff --git a/assets/cxl/path-segment.drawio.svg b/assets/cxl/path-segment.drawio.svg index b9fa17b032..d4d7b7029f 100644 --- a/assets/cxl/path-segment.drawio.svg +++ b/assets/cxl/path-segment.drawio.svg @@ -1,8 +1,8 @@ - + - + @@ -61,21 +61,21 @@ - + - - + + - + -
+
infix filter @@ -83,7 +83,7 @@
- + infix filter @@ -91,13 +91,13 @@ - + -
+
param name @@ -105,20 +105,20 @@
- + param name - + -
+
: @@ -126,25 +126,25 @@
- + : - - + + - + -
+
expr @@ -152,7 +152,7 @@
- + expr @@ -160,21 +160,21 @@
- - + + - - + + - + -
+
, @@ -182,28 +182,28 @@
- + , - - + + - - + + - + -
+
( @@ -211,20 +211,20 @@
- + ( - + -
+
) @@ -232,35 +232,35 @@
- + ) - - + + - - + + - - + + - - + + - - + + - - + + diff --git a/cds/cxl.md b/cds/cxl.md index 92aacbd968..cf60849cf6 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -360,6 +360,20 @@ entity Structured select from Authors { +Note: Some examples of infix-filters: + +```cds +entity InfixFilter select from Authors { + books[price > 20], as expensiveBooks // [!code focus] + exists books[price > 20] as hasDramaBooks // [!code focus] +} +``` + +```js +await cds.ql `select from Authors { books[exists genre[name = 'Mystery']] { title, genre.name } }` +await cds.ql `select from Authors { books[exists genre[exists parent [name = 'Fiction']]] { title, genre.name } } +``` + ## infix filter { #infix-filter }
From 709f3550ce242b5348d5aaf36dc2478d9b98a889 Mon Sep 17 00:00:00 2001 From: Patrice Bender Date: Mon, 8 Dec 2025 15:42:35 +0100 Subject: [PATCH 14/47] adjustements --- assets/cxl/binding-parameter.drawio.svg | 28 +-- assets/cxl/expr.drawio.svg | 218 ++++++++++++------------ assets/cxl/function-args.drawio.svg | 28 +-- assets/cxl/function-def.drawio.svg | 98 +++++------ assets/cxl/infix-filter.drawio.svg | 6 +- assets/cxl/intro.drawio.svg | 128 ++++++++------ assets/cxl/path-segment.drawio.svg | 90 +++++----- assets/cxl/ref.drawio.svg | 34 ++-- cds/cxl.md | 25 ++- 9 files changed, 339 insertions(+), 316 deletions(-) diff --git a/assets/cxl/binding-parameter.drawio.svg b/assets/cxl/binding-parameter.drawio.svg index 2f2dd81742..5bc91b27b2 100644 --- a/assets/cxl/binding-parameter.drawio.svg +++ b/assets/cxl/binding-parameter.drawio.svg @@ -1,4 +1,4 @@ - + @@ -43,8 +43,8 @@ - - + + @@ -72,13 +72,13 @@ - + -
+
string-literal @@ -86,20 +86,20 @@
- + string-literal - + -
+
numeric-literal @@ -107,22 +107,22 @@
- - numeric-liter... + + numeric-literal - - + + - + - + diff --git a/assets/cxl/expr.drawio.svg b/assets/cxl/expr.drawio.svg index a4964e901c..95efe37118 100644 --- a/assets/cxl/expr.drawio.svg +++ b/assets/cxl/expr.drawio.svg @@ -1,4 +1,4 @@ - + @@ -24,8 +24,8 @@ - - + + @@ -52,7 +52,7 @@ - + @@ -78,18 +78,18 @@ - - + + - + -
+
expr @@ -97,7 +97,7 @@
- + expr @@ -105,26 +105,26 @@ - + - - + + - - + + - + -
+
expr @@ -132,7 +132,7 @@
- + expr @@ -163,7 +163,7 @@
- + @@ -171,7 +171,7 @@ - + @@ -212,7 +212,7 @@ -
+
( @@ -220,7 +220,7 @@
- + ( @@ -254,7 +254,7 @@ -
+
) @@ -262,26 +262,26 @@
- + ) - + - - + + - + - + @@ -293,8 +293,8 @@ - - + + @@ -303,7 +303,7 @@ -
+
( @@ -311,15 +311,15 @@
- + ( - - + + @@ -355,7 +355,7 @@ -
+
as @@ -363,7 +363,7 @@
- + as @@ -403,7 +403,7 @@ -
+
) @@ -411,7 +411,7 @@
- + ) @@ -422,7 +422,7 @@ - + @@ -474,8 +474,8 @@ - - + + @@ -506,8 +506,8 @@ - - + +
@@ -533,7 +533,7 @@ - + @@ -585,12 +585,12 @@ - + - - + + @@ -630,7 +630,7 @@ -
+
NOT @@ -720,8 +720,8 @@ - - + + @@ -745,8 +745,8 @@ - - + + @@ -794,7 +794,7 @@
- + AND @@ -824,12 +824,12 @@ - + - - + + @@ -872,14 +872,14 @@
- + NOT
- + @@ -887,8 +887,8 @@ - - + + @@ -924,7 +924,7 @@ -
+
( @@ -932,7 +932,7 @@
- + ( @@ -945,7 +945,7 @@ -
+
) @@ -953,7 +953,7 @@
- + ) @@ -983,8 +983,8 @@
- - + + @@ -1008,23 +1008,23 @@ - + - - + + - + - + - + @@ -1077,16 +1077,16 @@ - + - + - - + + @@ -1122,7 +1122,7 @@ -
+
( @@ -1130,7 +1130,7 @@
- + ( @@ -1143,7 +1143,7 @@ -
+
) @@ -1151,14 +1151,14 @@
- + ) - + @@ -1172,7 +1172,7 @@ -
+
- + ELSE @@ -1424,26 +1424,26 @@ - - + + - - + + - + - + -
+
unary operator @@ -1451,7 +1451,7 @@
- + unary operator @@ -1459,18 +1459,18 @@
- + - + -
+
binary operator @@ -1478,8 +1478,8 @@
- - binary operat... + + binary operator @@ -1487,13 +1487,13 @@
- + -
+
binding-parameter @@ -1501,24 +1501,24 @@
- - binding-param... + + binding-parameter
- - + + - + - + @@ -1540,7 +1540,7 @@ - + diff --git a/assets/cxl/function-args.drawio.svg b/assets/cxl/function-args.drawio.svg index cee93792f4..11cc8fd9fb 100644 --- a/assets/cxl/function-args.drawio.svg +++ b/assets/cxl/function-args.drawio.svg @@ -1,4 +1,4 @@ - + @@ -178,13 +178,13 @@ - + -
+
param name @@ -192,7 +192,7 @@
- + param name @@ -243,7 +243,7 @@ - + @@ -251,17 +251,17 @@ - - + + - + -
+
, @@ -269,19 +269,19 @@
- + , - - + + - - + + diff --git a/assets/cxl/function-def.drawio.svg b/assets/cxl/function-def.drawio.svg index fced41c403..b38131899d 100644 --- a/assets/cxl/function-def.drawio.svg +++ b/assets/cxl/function-def.drawio.svg @@ -1,12 +1,12 @@ - + - - + + @@ -20,17 +20,17 @@ - + - + -
+
function name @@ -38,7 +38,7 @@
- + function name @@ -55,7 +55,7 @@ -
+
( @@ -63,25 +63,25 @@
- + ( - + - + -
+
function args @@ -89,7 +89,7 @@
- + function args @@ -120,7 +120,7 @@
- + @@ -130,7 +130,7 @@ -
+
) @@ -138,7 +138,7 @@
- + ) @@ -146,13 +146,13 @@ - + -
+
function @@ -160,7 +160,7 @@
- + function @@ -174,7 +174,7 @@ -
+
. @@ -189,33 +189,8 @@ - - - - - - -
-
-
- function name -
-
-
-
- - function name - -
-
-
- - - - - - - + +
@@ -245,13 +220,38 @@ - + - + + + + + + + + +
+
+
+ function name +
+
+
+
+ + function name + +
+
+
+ + + + diff --git a/assets/cxl/infix-filter.drawio.svg b/assets/cxl/infix-filter.drawio.svg index d087567407..f988c264c4 100644 --- a/assets/cxl/infix-filter.drawio.svg +++ b/assets/cxl/infix-filter.drawio.svg @@ -1,4 +1,4 @@ - + @@ -49,7 +49,7 @@ -
+
[ @@ -74,7 +74,7 @@ -
+
] diff --git a/assets/cxl/intro.drawio.svg b/assets/cxl/intro.drawio.svg index 643a412afe..8a78798a03 100644 --- a/assets/cxl/intro.drawio.svg +++ b/assets/cxl/intro.drawio.svg @@ -1,22 +1,22 @@ - + - + - - + + - + - + - + Some shapes have tooltips with some explanation, try it out! 🚀 @@ -29,7 +29,7 @@ -
+
alternative 1 @@ -37,20 +37,20 @@
- + alternative 1 - + -
+
alternative @@ -61,7 +61,7 @@
- + alternative 2 @@ -69,13 +69,13 @@ - + -
+
language construct @@ -83,7 +83,7 @@
- + language construct @@ -91,18 +91,18 @@
- - + + - - + + -
+
you start here 🫵 @@ -110,29 +110,29 @@
- + you start here 🫵 - - + + - - + + - - + + -
+
💡clickable @@ -140,15 +140,15 @@
- + 💡clickable - - + + @@ -173,69 +173,97 @@ - - + -
+
- 💡tooltip + + Round shapes refer to terminal symbols such as `exists` or `null`, which can't be further divided +
- - 💡tooltip + + Round shapes refer to ter... - + -
+
- Round shapes refer to terminal symbols such as `exists` or `null`, which can't be further divided + language constructs can be broken down further and get their own syntax diagram
- - Round shapes refer to ter... + + language constructs can b... + + + + + + + + +
+
+
+ … +
+
+
+
+ + … + +
+
+
+
+ + + - + -
+
-
- - language constructs can be broken down further and get their own syntax diagram - +
+ Green Boxes indicate proprietary CAP expressions +
+ they extend standard SQL Expressions in some way +
- - language constructs can b... + + Green Boxes indicate proprietary CAP expressions... diff --git a/assets/cxl/path-segment.drawio.svg b/assets/cxl/path-segment.drawio.svg index d4d7b7029f..d98bb8ec91 100644 --- a/assets/cxl/path-segment.drawio.svg +++ b/assets/cxl/path-segment.drawio.svg @@ -1,4 +1,4 @@ - + @@ -6,24 +6,24 @@ - - + + - - + + - + -
+
@@ -33,20 +33,20 @@
- - structured-ele... + + structured-element - + -
+
association @@ -54,7 +54,7 @@
- + association @@ -64,12 +64,12 @@ - - + + - + @@ -91,13 +91,13 @@ - + -
+
param name @@ -105,20 +105,20 @@
- + param name - + -
+
: @@ -126,25 +126,25 @@
- + : - - + + - + -
+
expr @@ -152,7 +152,7 @@
- + expr @@ -160,12 +160,12 @@
- - + + - - + + @@ -174,7 +174,7 @@ -
+
, @@ -182,7 +182,7 @@
- + , @@ -193,17 +193,17 @@ - + - + -
+
( @@ -211,20 +211,20 @@
- + ( - + -
+
) @@ -232,7 +232,7 @@
- + ) @@ -243,23 +243,23 @@ - - + + - + - + - + - + diff --git a/assets/cxl/ref.drawio.svg b/assets/cxl/ref.drawio.svg index c2f64a230a..b8ec692ac0 100644 --- a/assets/cxl/ref.drawio.svg +++ b/assets/cxl/ref.drawio.svg @@ -1,4 +1,4 @@ - + @@ -21,8 +21,8 @@ - - + + @@ -31,7 +31,7 @@ -
+
. @@ -39,7 +39,7 @@
- + . @@ -52,7 +52,7 @@ -
+
. @@ -60,14 +60,14 @@
- + . - + @@ -80,7 +80,7 @@ -
+
. @@ -88,15 +88,15 @@
- + . - - + + @@ -115,7 +115,7 @@ - + @@ -159,7 +159,7 @@ - + a scalar element is a primitive field (e.g., String, Integer, Decimal, Boolean, Date/Time, UUID) without nested structure or associations @@ -172,7 +172,7 @@ -
+
@@ -182,7 +182,7 @@
- + scalar element @@ -190,7 +190,7 @@ - + diff --git a/cds/cxl.md b/cds/cxl.md index cf60849cf6..fc2c4b0f26 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -57,8 +57,8 @@ cds repl --run . :::info 💡 All of the example expressions follow the same pattern: 1. A `CXL` snippet is shown as part of a query - either in the columns or in a query modifier. -2. The corresponding **CAP Style `CXL`** representation is shown as `JSON`. -3. The resulting **SQL Style `CXL`** is shown as `JSON`. +2. The corresponding **CAP Style `CXL`** is shown. +3. The equivalent **SQL Style `CXL`** is shown. 4. The resulting **SQL output** is shown in SQL syntax. ::: @@ -106,6 +106,8 @@ referred to as a **path expression**.
+ +
### scalar element with and without table alias @@ -174,20 +176,13 @@ A `ref` can also contain multiple [path-segments](#path-segment), e.g. to naviga :::code-group ```js -> q = cds.ql`SELECT from Books as B { author.ID, genre }` // [!code focus] -cds.ql { - SELECT: { - from: { ref: [ 'Books' ], as: 'B' }, - columns: [ { ref: [ 'author', 'ID' ] }, { ref: [ 'genre' ] } ] - } -} -> await q +> await cds.ql`SELECT from Books as B { author.ID, genre }` // [!code focus] [ - { author_ID: 101, genre_ID: 11 }, - { author_ID: 107, genre_ID: 11 }, - { author_ID: 150, genre_ID: 16 }, - { author_ID: 150, genre_ID: 16 }, - { author_ID: 170, genre_ID: 13 } + { author_ID: 101, genre_ID: '11aaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' }, + { author_ID: 107, genre_ID: '11aaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' }, + { author_ID: 150, genre_ID: '16aaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' }, + { author_ID: 150, genre_ID: '15aaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' }, + { author_ID: 170, genre_ID: '13aaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' } ] ``` ::: From e9bec18783bcc7cc6f9de79d37a6fee168d475ac Mon Sep 17 00:00:00 2001 From: Johannes Vogt Date: Tue, 9 Dec 2025 11:04:23 +0100 Subject: [PATCH 15/47] make imports relative --- cds/cxl.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/cds/cxl.md b/cds/cxl.md index fc2c4b0f26..f85f7679f0 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -8,19 +8,19 @@ uacp: Used as link target from Help Portal at https://help.sap.com/products/BTP/ --- # Core Expression Language (CXL) { #expressions } From 6e25e921120bc82cebe70e9bdd36c5135fb632f3 Mon Sep 17 00:00:00 2001 From: Johannes Vogt Date: Tue, 9 Dec 2025 11:17:08 +0100 Subject: [PATCH 16/47] fix formatting -> disable word-wrap and text formatting --- assets/cxl/binary-operator.drawio.svg | 297 ++---- assets/cxl/binding-parameter.drawio.svg | 88 +- assets/cxl/expr.drawio.svg | 1196 ++++++----------------- assets/cxl/function-args.drawio.svg | 200 +--- assets/cxl/function-def.drawio.svg | 181 +--- assets/cxl/infix-filter.drawio.svg | 88 +- assets/cxl/intro.drawio.svg | 171 +--- assets/cxl/literal-value.drawio.svg | 216 ++-- assets/cxl/ordering-term.drawio.svg | 143 +-- assets/cxl/over-clause.drawio.svg | 143 +-- assets/cxl/path-segment.drawio.svg | 183 +--- assets/cxl/ref.drawio.svg | 147 +-- assets/cxl/unary-operator.drawio.svg | 71 +- 13 files changed, 689 insertions(+), 2435 deletions(-) diff --git a/assets/cxl/binary-operator.drawio.svg b/assets/cxl/binary-operator.drawio.svg index e61dde63c4..383856acca 100644 --- a/assets/cxl/binary-operator.drawio.svg +++ b/assets/cxl/binary-operator.drawio.svg @@ -1,4 +1,4 @@ - + @@ -23,44 +23,20 @@ - - - -
-
-
- - - - -
-
-
-
- - - - -
+ + + - +
- - - -
-
-
- * -
-
-
-
- - * - -
+ + + * +
@@ -75,23 +51,10 @@ - - - -
-
-
- - + - -
-
-
-
- - + - -
+ + + + +
@@ -106,231 +69,110 @@ - - - -
-
-
- / -
-
-
-
- - / - -
+ + + / +
- - - -
-
-
- = -
-
-
-
- - = - -
+ + + = +
- - - -
-
-
- != -
-
-
-
- - != - -
+ + + != +
- - - -
-
-
- == -
-
-
-
- - == - -
+ + + == +
- - - -
-
-
- <> -
-
-
-
- - <> - -
+ + + <> +
- - - -
-
-
- > -
-
-
-
- - > - -
+ + + > +
- - - -
-
-
- >= -
-
-
-
- - >= - -
+ + + >= +
- - - -
-
-
- < -
-
-
-
- - < - -
+ + + < +
- - - -
-
-
- <= -
-
-
-
- - <= - -
+ + + <= +
- - - -
-
-
- AND -
-
-
-
- - AND - -
+ + + AND +
- - - -
-
-
- OR -
-
-
-
- - OR - -
+ + + OR +
@@ -425,22 +267,7 @@ - - - -
-
-
- || -
-
-
-
- - || - -
-
+
@@ -451,12 +278,4 @@
- - - - - Text is not SVG - cannot display - - -
\ No newline at end of file diff --git a/assets/cxl/binding-parameter.drawio.svg b/assets/cxl/binding-parameter.drawio.svg index 5bc91b27b2..9ed3b13328 100644 --- a/assets/cxl/binding-parameter.drawio.svg +++ b/assets/cxl/binding-parameter.drawio.svg @@ -1,4 +1,4 @@ - + @@ -23,23 +23,10 @@ - - - -
-
-
- - ? - -
-
-
-
- - ? - -
+ + + ? +
@@ -50,21 +37,10 @@ - - - -
-
-
- : -
-
-
-
- - : - -
+ + + : +
@@ -75,42 +51,20 @@ - - - -
-
-
- string-literal -
-
-
-
- - string-literal - -
+ + + string-literal +
- - - -
-
-
- numeric-literal -
-
-
-
- - numeric-literal - -
+ + + numeric-literal +
@@ -126,12 +80,4 @@
- - - - - Text is not SVG - cannot display - - -
\ No newline at end of file diff --git a/assets/cxl/expr.drawio.svg b/assets/cxl/expr.drawio.svg index 95efe37118..1cc792e8b4 100644 --- a/assets/cxl/expr.drawio.svg +++ b/assets/cxl/expr.drawio.svg @@ -1,4 +1,4 @@ - + @@ -32,21 +32,10 @@ - - - -
-
-
- literal value -
-
-
-
- - literal value - -
+ + + literal value +
@@ -55,21 +44,10 @@ - - - -
-
-
- ref -
-
-
-
- - ref - -
+ + + ref +
@@ -78,39 +56,28 @@
- - + + - - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
- + - - + + @@ -121,21 +88,10 @@ - - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
@@ -144,26 +100,15 @@
- - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
- + @@ -171,7 +116,7 @@ - + @@ -183,21 +128,10 @@ - - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
@@ -209,79 +143,46 @@
- - - -
-
-
- ( -
-
-
-
- - ( - -
+ + + ( +
- - - -
-
-
- , -
-
-
-
- - , - -
+ + + , +
- - - -
-
-
- ) -
-
-
-
- - ) - -
+ + + ) +
- + - - + + - + - + @@ -293,54 +194,32 @@ - - + + - - - -
-
-
- ( -
-
-
-
- - ( - -
+ + + ( +
- - + + - - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
@@ -352,21 +231,10 @@
- - - -
-
-
- as -
-
-
-
- - as - -
+ + + as +
@@ -378,21 +246,10 @@ - - - -
-
-
- type-name -
-
-
-
- - type-name - -
+ + + type-name +
@@ -400,21 +257,10 @@
- - - -
-
-
- ) -
-
-
-
- - ) - -
+ + + ) +
@@ -422,7 +268,7 @@ - + @@ -434,21 +280,10 @@ - - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
@@ -456,26 +291,15 @@
- - - -
-
-
- CAST -
-
-
-
- - CAST - -
+ + + CAST +
- - + + @@ -488,52 +312,30 @@ - - - -
-
-
- LIKE -
-
-
-
- - LIKE - -
+ + + LIKE +
- - + + - - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
- + @@ -545,21 +347,10 @@ - - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
@@ -567,30 +358,19 @@
- - - -
-
-
- NULL -
-
-
-
- - NULL - -
+ + + NULL +
- + - - + + @@ -601,21 +381,10 @@ - - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
@@ -627,21 +396,10 @@
- - - -
-
-
- NOT -
-
-
-
- - NOT - -
+ + + NOT +
@@ -656,42 +414,20 @@ - - - -
-
-
- BETWEEN -
-
-
-
- - BETWEEN - -
+ + + BETWEEN +
- - - -
-
-
- NOT -
-
-
-
- - NOT - -
+ + + NOT +
@@ -702,51 +438,29 @@ - - - -
-
-
- IS -
-
-
-
- - IS - -
+ + + IS +
- - + + - - - -
-
-
- NOT -
-
-
-
- - NOT - -
+ + + NOT +
- - + + @@ -757,21 +471,10 @@ - - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
@@ -783,21 +486,10 @@
- - - -
-
-
- AND -
-
-
-
- - AND - -
+ + + AND +
@@ -805,52 +497,30 @@
- - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
- + - - + + - - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
@@ -861,25 +531,14 @@
- - - -
-
-
- NOT -
-
-
-
- - NOT - -
+ + + NOT +
- + @@ -887,29 +546,18 @@ - - + + - - - -
-
-
- select-stmt -
-
-
-
- - select-stmt - -
+ + + select-stmt +
@@ -921,42 +569,20 @@
- - - -
-
-
- ( -
-
-
-
- - ( - -
+ + + ( +
- - - -
-
-
- ) -
-
-
-
- - ) - -
+ + + ) +
@@ -964,67 +590,45 @@
- - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
- - + + - - - -
-
-
- , -
-
-
-
- - , - -
+ + + , +
- + - - + + - + - + - + @@ -1034,21 +638,10 @@ - - - -
-
-
- NOT -
-
-
-
- - NOT - -
+ + + NOT +
@@ -1059,55 +652,33 @@ - - - -
-
-
- EXISTS -
-
-
-
- - EXISTS - -
+ + + EXISTS +
- + - + - - + + - - - -
-
-
- select-stmt -
-
-
-
- - select-stmt - -
+ + + select-stmt +
@@ -1119,46 +690,24 @@
- - - -
-
-
- ( -
-
-
-
- - ( - -
+ + + ( +
- - - -
-
-
- ) -
-
-
-
- - ) - -
+ + + ) +
- + @@ -1169,21 +718,10 @@ - - - -
-
-
- IN -
-
-
-
- - IN - -
+ + + IN +
@@ -1194,21 +732,10 @@ - - - -
-
-
- CASE -
-
-
-
- - CASE - -
+ + + CASE +
@@ -1219,21 +746,10 @@ - - - -
-
-
- WHEN -
-
-
-
- - WHEN - -
+ + + WHEN +
@@ -1245,21 +761,10 @@ - - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
@@ -1272,21 +777,10 @@
- - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
@@ -1298,53 +792,31 @@
- - - -
-
-
- THEN -
-
-
-
- - THEN - -
+ + + THEN +
- - + + - - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
- - + + @@ -1354,21 +826,10 @@ - - - -
-
-
- ELSE -
-
-
-
- - ELSE - -
+ + + ELSE +
@@ -1384,21 +845,10 @@ - - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
@@ -1406,33 +856,22 @@
- - - -
-
-
- END -
-
-
-
- - END - -
+ + + END +
- - + + - - + + - + @@ -1440,21 +879,10 @@
- - - -
-
-
- unary operator -
-
-
-
- - unary operator - -
+ + + unary operator +
@@ -1467,21 +895,10 @@
- - - -
-
-
- binary operator -
-
-
-
- - binary operator - -
+ + + binary operator +
@@ -1490,30 +907,19 @@
- - - -
-
-
- binding-parameter -
-
-
-
- - binding-parameter - -
+ + + binding-parameter +
- - + + - + @@ -1521,26 +927,15 @@
- - - -
-
-
- ref -
-
-
-
- - ref - -
+ + + ref +
- + @@ -1552,31 +947,12 @@ - - - -
-
-
- function -
-
-
-
- - function - -
+ + + function +
- - - - - Text is not SVG - cannot display - - - \ No newline at end of file diff --git a/assets/cxl/function-args.drawio.svg b/assets/cxl/function-args.drawio.svg index 11cc8fd9fb..3147fcb304 100644 --- a/assets/cxl/function-args.drawio.svg +++ b/assets/cxl/function-args.drawio.svg @@ -1,4 +1,4 @@ - + @@ -20,21 +20,10 @@ - - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
@@ -42,21 +31,10 @@
- - - -
-
-
- , -
-
-
-
- - , - -
+ + + , +
@@ -72,21 +50,10 @@ - - - -
-
-
- ordering-term -
-
-
-
- - ordering-term - -
+ + + ordering-term +
@@ -98,21 +65,10 @@
- - - -
-
-
- ORDER -
-
-
-
- - ORDER - -
+ + + ORDER +
@@ -123,21 +79,10 @@ - - - -
-
-
- BY -
-
-
-
- - BY - -
+ + + BY +
@@ -148,21 +93,10 @@ - - - -
-
-
- , -
-
-
-
- - , - -
+ + + , +
@@ -181,42 +115,20 @@ - - - -
-
-
- param name -
-
-
-
- - param name - -
+ + + param name +
- - - -
-
-
- => -
-
-
-
- - => - -
+ + + => +
@@ -224,21 +136,10 @@
- - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
@@ -258,21 +159,10 @@
- - - -
-
-
- , -
-
-
-
- - , - -
+ + + , +
@@ -292,12 +182,4 @@
- - - - - Text is not SVG - cannot display - - -
\ No newline at end of file diff --git a/assets/cxl/function-def.drawio.svg b/assets/cxl/function-def.drawio.svg index b38131899d..9fcfab4dfa 100644 --- a/assets/cxl/function-def.drawio.svg +++ b/assets/cxl/function-def.drawio.svg @@ -1,4 +1,4 @@ - + @@ -27,21 +27,10 @@ - - - -
-
-
- function name -
-
-
-
- - function name - -
+ + + function name +
@@ -52,21 +41,10 @@ - - - -
-
-
- ( -
-
-
-
- - ( - -
+ + + ( +
@@ -78,21 +56,10 @@ - - - -
-
-
- function args -
-
-
-
- - function args - -
+ + + function args +
@@ -101,21 +68,10 @@
- - - -
-
-
- over-clause -
-
-
-
- - over-clause - -
+ + + over-clause +
@@ -127,21 +83,10 @@
- - - -
-
-
- ) -
-
-
-
- - ) - -
+ + + ) +
@@ -149,21 +94,10 @@
- - - -
-
-
- function -
-
-
-
- - function - -
+ + + function +
@@ -171,21 +105,10 @@
- - - -
-
-
- . -
-
-
-
- - . - -
+ + + . +
@@ -197,21 +120,10 @@ - - - -
-
-
- function -
-
-
-
- - function - -
+ + + function +
@@ -231,21 +143,10 @@
- - - -
-
-
- function name -
-
-
-
- - function name - -
+ + + function name +
@@ -253,12 +154,4 @@
- - - - - Text is not SVG - cannot display - - -
\ No newline at end of file diff --git a/assets/cxl/infix-filter.drawio.svg b/assets/cxl/infix-filter.drawio.svg index f988c264c4..84a377d987 100644 --- a/assets/cxl/infix-filter.drawio.svg +++ b/assets/cxl/infix-filter.drawio.svg @@ -1,4 +1,4 @@ - + @@ -16,23 +16,10 @@ - - - -
-
-
- - WHERE - -
-
-
-
- - WHERE - -
+ + + WHERE +
@@ -46,21 +33,10 @@ - - - -
-
-
- [ -
-
-
-
- - [ - -
+ + + [ +
@@ -71,21 +47,10 @@ - - - -
-
-
- ] -
-
-
-
- - ] - -
+ + + ] +
@@ -97,21 +62,10 @@ - - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
@@ -124,12 +78,4 @@
- - - - - Text is not SVG - cannot display - - -
\ No newline at end of file diff --git a/assets/cxl/intro.drawio.svg b/assets/cxl/intro.drawio.svg index 8a78798a03..81899c5b4b 100644 --- a/assets/cxl/intro.drawio.svg +++ b/assets/cxl/intro.drawio.svg @@ -1,4 +1,4 @@ - + @@ -23,48 +23,23 @@ - + Some shapes have tooltips with some explanation, try it out! 🚀 - - -
-
-
- alternative 1 -
-
-
-
- - alternative 1 - -
+ + alternative 1 +
- - - -
-
-
- alternative - - 2 - -
-
-
-
- - alternative 2 - -
+ + + alternative 2 +
@@ -72,21 +47,10 @@
- - - -
-
-
- language construct -
-
-
-
- - language construct - -
+ + + language construct +
@@ -99,21 +63,10 @@
- - - -
-
-
- you start here 🫵 -
-
-
-
- - you start here 🫵 - -
+ + + you start here 🫵 +
@@ -129,21 +82,10 @@ - - - -
-
-
- 💡clickable -
-
-
-
- - 💡clickable - -
+ + + 💡clickable +
@@ -155,21 +97,10 @@ - - - -
-
-
- finish 🏁 -
-
-
-
- - finish 🏁 - -
+ + + finish 🏁 +
@@ -182,9 +113,7 @@
- - Round shapes refer to terminal symbols such as `exists` or `null`, which can't be further divided - + Round shapes refer to terminal symbols such as `exists` or `null`, which can't be further divided
@@ -205,9 +134,7 @@
- - language constructs can be broken down further and get their own syntax diagram - + language constructs can be broken down further and get their own syntax diagram
@@ -223,21 +150,10 @@
- - - -
-
-
- … -
-
-
-
- - … - -
+ + + … +
@@ -248,24 +164,13 @@
- - - -
-
-
- Green Boxes indicate proprietary CAP expressions -
- they extend standard SQL Expressions in some way -
-
-
-
-
- - Green Boxes indicate proprietary CAP expressions... - -
+ + + Green Boxes indicate proprietary CAP expressions + + + they extend standard SQL Expressions in some way +
diff --git a/assets/cxl/literal-value.drawio.svg b/assets/cxl/literal-value.drawio.svg index ef77ef51cb..860c84d13a 100644 --- a/assets/cxl/literal-value.drawio.svg +++ b/assets/cxl/literal-value.drawio.svg @@ -1,4 +1,4 @@ - + @@ -23,49 +23,25 @@ - - - -
-
-
- - string-literal - -
-
-
-
- - string-literal - -
+ + + string-literal +
- - - -
-
-
- NULL -
-
-
-
- - NULL - -
+ + + NULL +
- - + + @@ -75,185 +51,109 @@ - - - -
-
-
- - numeric-literal - -
-
-
-
- - numeric-literal - -
+ + + numeric-literal +
- - + + - - + + - - - -
-
-
- TRUE -
-
-
-
- - TRUE - -
+ + + TRUE +
- - - -
-
-
- FALSE -
-
-
-
- - FALSE - -
+ + + FALSE +
- - - -
-
-
- CURRENT_TIMESTAMP -
-
-
-
- - CURRENT_TIMESTAMP - -
+ + + CURRENT_TIMESTAMP +
- + - - + + - - + + - - + + - - + + - - - -
-
-
- CURRENT_DATE -
-
-
-
- - CURRENT_DATE - -
+ + + CURRENT_DATE +
- - - -
-
-
- CURRENT_TIME -
-
-
-
- - CURRENT_TIME - -
+ + + CURRENT_TIME +
- - + + - - + + - - + + - - + + - - + +
- - - - - Text is not SVG - cannot display - - -
\ No newline at end of file diff --git a/assets/cxl/ordering-term.drawio.svg b/assets/cxl/ordering-term.drawio.svg index 558107a7db..a3d24a97a9 100644 --- a/assets/cxl/ordering-term.drawio.svg +++ b/assets/cxl/ordering-term.drawio.svg @@ -1,4 +1,4 @@ - + @@ -20,21 +20,10 @@ - - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
@@ -42,63 +31,30 @@
- - - -
-
-
- ASC -
-
-
-
- - ASC - -
+ + + ASC +
- - - -
-
-
- DESC -
-
-
-
- - DESC - -
+ + + DESC +
- - - -
-
-
- NULLS -
-
-
-
- - NULLS - -
+ + + NULLS +
@@ -129,21 +85,10 @@ - - - -
-
-
- NULLS -
-
-
-
- - NULLS - -
+ + + NULLS +
@@ -154,42 +99,20 @@ - - - -
-
-
- FIRST -
-
-
-
- - FIRST - -
+ + + FIRST +
- - - -
-
-
- LAST -
-
-
-
- - LAST - -
+ + + LAST +
@@ -209,12 +132,4 @@
- - - - - Text is not SVG - cannot display - - -
\ No newline at end of file diff --git a/assets/cxl/over-clause.drawio.svg b/assets/cxl/over-clause.drawio.svg index 4c55809335..f715b05f9b 100644 --- a/assets/cxl/over-clause.drawio.svg +++ b/assets/cxl/over-clause.drawio.svg @@ -1,4 +1,4 @@ - + @@ -19,63 +19,30 @@ - - - -
-
-
- ASC -
-
-
-
- - ASC - -
+ + + ASC +
- - - -
-
-
- DESC -
-
-
-
- - DESC - -
+ + + DESC +
- - - -
-
-
- NULLS -
-
-
-
- - NULLS - -
+ + + NULLS +
@@ -94,21 +61,10 @@ - - - -
-
-
- NULLS -
-
-
-
- - NULLS - -
+ + + NULLS +
@@ -119,42 +75,20 @@ - - - -
-
-
- FIRST -
-
-
-
- - FIRST - -
+ + + FIRST +
- - - -
-
-
- LAST -
-
-
-
- - LAST - -
+ + + LAST +
@@ -177,30 +111,11 @@ - - - -
-
-
- OVER -
-
-
-
- - OVER - -
+ + + OVER +
- - - - - Text is not SVG - cannot display - - -
\ No newline at end of file diff --git a/assets/cxl/path-segment.drawio.svg b/assets/cxl/path-segment.drawio.svg index d98bb8ec91..398707f8c8 100644 --- a/assets/cxl/path-segment.drawio.svg +++ b/assets/cxl/path-segment.drawio.svg @@ -1,4 +1,4 @@ - + @@ -20,44 +20,20 @@ - - - -
-
-
- - structured-element - -
-
-
-
- - structured-element - -
+ + + structured-element +
- - - -
-
-
- association -
-
-
-
- - association - -
+ + + association +
@@ -72,21 +48,10 @@ - - - -
-
-
- infix filter -
-
-
-
- - infix filter - -
+ + + infix filter +
@@ -94,42 +59,20 @@
- - - -
-
-
- param name -
-
-
-
- - param name - -
+ + + param name +
- - - -
-
-
- : -
-
-
-
- - : - -
+ + + : +
@@ -141,21 +84,10 @@ - - - -
-
-
- expr -
-
-
-
- - expr - -
+ + + expr +
@@ -171,21 +103,10 @@
- - - -
-
-
- , -
-
-
-
- - , - -
+ + + , +
@@ -200,42 +121,20 @@ - - - -
-
-
- ( -
-
-
-
- - ( - -
+ + + ( +
- - - -
-
-
- ) -
-
-
-
- - ) - -
+ + + ) +
@@ -263,12 +162,4 @@
- - - - - Text is not SVG - cannot display - - -
\ No newline at end of file diff --git a/assets/cxl/ref.drawio.svg b/assets/cxl/ref.drawio.svg index b8ec692ac0..8c531a8070 100644 --- a/assets/cxl/ref.drawio.svg +++ b/assets/cxl/ref.drawio.svg @@ -1,4 +1,4 @@ - + @@ -28,42 +28,20 @@ - - - -
-
-
- . -
-
-
-
- - . - -
+ + + . +
- - - -
-
-
- . -
-
-
-
- - . - -
+ + + . +
@@ -77,21 +55,10 @@ - - - -
-
-
- . -
-
-
-
- - . - -
+ + + . +
@@ -118,44 +85,20 @@ - - - -
-
-
- - $self - -
-
-
-
- - $self - -
+ + + $self +
- - - -
-
-
- Table Alias -
-
-
-
- - Table Alias - -
+ + + Table Alias +
@@ -166,26 +109,13 @@ - + a scalar element is a primitive field (e.g., String, Integer, Decimal, Boolean, Date/Time, UUID) without nested structure or associations - - -
-
-
- - scalar element - -
-
-
-
- - scalar element - -
+ + scalar element +
@@ -193,21 +123,10 @@
- - - -
-
-
- path-segment -
-
-
-
- - path-segment - -
+ + + path-segment +
@@ -228,12 +147,4 @@
- - - - - Text is not SVG - cannot display - - -
\ No newline at end of file diff --git a/assets/cxl/unary-operator.drawio.svg b/assets/cxl/unary-operator.drawio.svg index b6f5ff9164..4f57f2ece0 100644 --- a/assets/cxl/unary-operator.drawio.svg +++ b/assets/cxl/unary-operator.drawio.svg @@ -1,4 +1,4 @@ - +
- - - -
-
-
- - - - -
-
-
-
- - - - -
+ + + - +
- - - -
-
-
- NOT -
-
-
-
- - NOT - -
+ + + NOT +
@@ -193,23 +169,10 @@ mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] { - - - -
-
-
- - + - -
-
-
-
- - + - -
+ + + + +
@@ -221,12 +184,4 @@ mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {
- - - - - Text is not SVG - cannot display - - - \ No newline at end of file From c6fffef03cceead3772bb8410b02521ab2855e02 Mon Sep 17 00:00:00 2001 From: Patrice Bender Date: Tue, 9 Dec 2025 12:30:35 +0100 Subject: [PATCH 17/47] some more samples --- assets/cxl/infix-filter.drawio.svg | 25 +- assets/cxl/ref.drawio.svg | 14 +- cds/cxl.md | 355 +++++++++++------------------ 3 files changed, 168 insertions(+), 226 deletions(-) diff --git a/assets/cxl/infix-filter.drawio.svg b/assets/cxl/infix-filter.drawio.svg index f988c264c4..12bfb7bd9f 100644 --- a/assets/cxl/infix-filter.drawio.svg +++ b/assets/cxl/infix-filter.drawio.svg @@ -1,8 +1,8 @@ - + - + @@ -123,6 +123,27 @@ + + + + + + + +
+
+
+ WHERE is implicitly part of each infix filter +
+
+
+
+ + WHERE is implic... + +
+
+
diff --git a/assets/cxl/ref.drawio.svg b/assets/cxl/ref.drawio.svg index b8ec692ac0..26ece3d998 100644 --- a/assets/cxl/ref.drawio.svg +++ b/assets/cxl/ref.drawio.svg @@ -1,4 +1,4 @@ - + @@ -31,7 +31,7 @@ -
+
. @@ -39,7 +39,7 @@
- + . @@ -216,16 +216,16 @@ - + - + - - + + diff --git a/cds/cxl.md b/cds/cxl.md index fc2c4b0f26..998c93fc56 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -106,189 +106,45 @@ referred to as a **path expression**.
- -
-### scalar element with and without table alias - -In it's most simple form, a `ref` just contains the name of the element being referenced: - -:::code-group -```cds -using {sap.capire.bookshop.Books} from './db/schema'; - -entity Ref as select from Books as B { - title, // [!code focus] - B.price // [!code focus] -} -``` -```js [repl] -> q = cds.ql`SELECT from Books as B { title, B.price }`// [!code focus] -cds.ql { - SELECT: { - from: { ref: [ 'Books' ], as: 'B' }, - columns: [ { ref: [ 'title' ] }, { ref: [ 'B', 'price' ] } ] - } -} -> await q -[ - { title: 'Wuthering Heights', price: 11.11 }, - { title: 'Jane Eyre', price: 12.34 }, - { title: 'The Raven', price: 13.13 }, - { title: 'Eleonora', price: 14 }, - { title: 'Catweazle', price: 150 } -] -``` -::: - -In this case, the CAP Style and SQL Style `CXL` representations are almost identical: - -:::code-group -```json5 [CAP Style expression] -cds.ql { - SELECT: { - from: { ref: [ 'sap.capire.bookshop.Books' ], as: 'B' }, - columns: [ { ref: [ 'title' ] }, { ref: [ 'B', 'price' ] } ] - } -} -``` - -```json5 [SQL Style expression] -cds.ql { - SELECT: { - from: { ref: [ 'sap.capire.bookshop.Books' ], as: 'B' }, - columns: [ { ref: [ 'B', 'title' ] }, { ref: [ 'B', 'price' ] } ] - } -} -``` - -```sql [SQL output] -SELECT B.title, B.price FROM sap_capire_bookshop_Books as B -``` -::: - -The CAP runtime only prefixes the `ref` of the `title` element with the table alias `B` when generating the SQL output. - -### navigation to foreign key with multiple path-segments -A `ref` can also contain multiple [path-segments](#path-segment), e.g. to navigate associations: - -:::code-group -```js -> await cds.ql`SELECT from Books as B { author.ID, genre }` // [!code focus] -[ - { author_ID: 101, genre_ID: '11aaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' }, - { author_ID: 107, genre_ID: '11aaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' }, - { author_ID: 150, genre_ID: '16aaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' }, - { author_ID: 150, genre_ID: '15aaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' }, - { author_ID: 170, genre_ID: '13aaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' } -] -``` -::: - -In this case, we navigate along the association `author` and select the `ID`. -As `ID` is the implicit foreign key field of the `author` association, the resulting SQL Style `CXL` representation -contains the foreign key field `author_ID`. -For `genre` the path ends on the association, in such a case the foreign key field `genre_ID` is selected. - -Both formats only deviate slightly: - -:::code-group -```json5 [CAP Style expression] -cds.ql { - SELECT: { - from: { ref: [ 'sap.capire.bookshop.Books' ], as: 'B' }, - columns: [ { ref: [ 'author', 'ID' ] }, { ref: [ 'genre' ] } ] - } -} -``` - -```json5 [SQL Style expression] -cds.ql { - SELECT: { - from: { ref: [ 'sap.capire.bookshop.Books' ], as: 'B' }, - columns: [ { ref: [ 'B', 'author_ID' ] }, { ref: [ 'B', 'genre_ID' ] } ] - } -} -``` - -```sql [SQL output] -SELECT B.author_ID, B.genre_ID FROM sap_capire_bookshop_Books as B -``` -::: +## path segment { #path-segment } +A path-segment in the context of a path-expression is used to navigate along +an association, or to access a structured element. +
+ +
+
-### navigation to non foreign key with multiple path-segments +### path expression in the select list -A `ref` can also end on a non-foreign key element after navigating associations +A path-expression can be used to navigate to any element of the associations target: :::code-group -```js -> q = cds.ql`SELECT from Books as B { author.name, genre.name }` // [!code focus] -cds.ql { - SELECT: { - from: { ref: [ 'Books' ], as: 'B' }, - columns: [ { ref: [ 'author', 'name' ] }, { ref: [ 'genre', 'name' ] } ] - } -} -> await q +```js [CAP Style] +> await cds.ql`SELECT from Books as B { author.name, genre.name }` // [!code focus] [ { author_name: 'Emily Brontë', genre_name: 'Drama' }, { author_name: 'Charlotte Brontë', genre_name: 'Drama' }, { author_name: 'Edgar Allen Poe', genre_name: 'Mystery' }, - { author_name: 'Edgar Allen Poe', genre_name: 'Mystery' }, + { author_name: 'Edgar Allen Poe', genre_name: 'Romance' }, { author_name: 'Richard Carpenter', genre_name: 'Fantasy' } ] ``` -::: - - -In this case, a little more happens under the hood. As the `ref` ends on non-foreign key elements (`name` of `author` and `genre`), -the CAP runtime automatically adds the necessary joins to the SQL Style `CXL` representation and the resulting SQL output. -:::code-group -```json5 [CAP Style expression] -cds.ql { - SELECT: { - from: { ref: [ 'sap.capire.bookshop.Books' ], as: 'B' }, - columns: [ { ref: [ 'author', 'name' ] }, { ref: [ 'genre', 'name' ] } ] - } -} +```js [SQL Style] +> await cds.ql` + SELECT + author.name as author_name, + genre.name as genre_name + from ${Books} as B + left join ${Authors} as author on B.author_ID = author.ID + left join ${Genres} as genre on B.genre_ID = genre.ID` ``` -```json5 [SQL Style expression] -cds.ql { - SELECT: { - from: { - join: 'left', - args: [ - { - join: 'left', - args: [ - { ref: [ 'sap.capire.bookshop.Books' ], as: 'B' }, - { ref: [ 'sap.capire.bookshop.Authors' ], as: 'author' } - ], - on: [ - { ref: [ 'author', 'ID' ] }, - '=', - { ref: [ 'B', 'author_ID' ] } - ] - }, - { ref: [ 'sap.capire.bookshop.Genres' ], as: 'genre' } - ], - on: [ { ref: [ 'genre', 'ID' ] }, '=', { ref: [ 'B', 'genre_ID' ] } ] - }, - columns: [ - { ref: [ 'author', 'name' ], as: 'author_name' }, - { ref: [ 'genre', 'name' ], as: 'genre_name' } - ] - } -} -``` - - ```sql [SQL output] SELECT author.name as author_name, @@ -300,9 +156,55 @@ FROM ``` ::: -### TODO: maybe one or two more examples with structure navigation +In this example, we select the names of the authors and genres of books. +Both `author` and `genre` are associations on the `Books` entity. + +::: info 💡 Associations are **forward declared joins** +Those joins are declared **before** they are used (e.g. in an entity definition) +Once an association is traversed in a query, the respective join is added automatically. +::: + +### path-expression after `exists` predicate -… +path-expressions can also be used after the `exists` predicate to check for the existence. +This is especially useful for to-many relations. + +In the example a path-expression combined with an [infix-filter](#infix-filter), +allows to select all authors that have written at least one book in the `Fantasy` genre. + +:::code-group +```js [CAP Style] +> await cds.ql` + SELECT from Authors + where exists books.genre[name = 'Fantasy']` // [!code focus] + +[ + { + ID: 170, + createdAt: '2025-12-08T12:51:45.294Z', + createdBy: 'anonymous', + modifiedAt: '2025-12-08T12:51:45.294Z', + modifiedBy: 'anonymous', + name: 'Richard Carpenter', + dateOfBirth: '1929-08-14', + dateOfDeath: '2012-02-26', + placeOfBirth: 'King’s Lynn, Norfolk', + placeOfDeath: 'Hertfordshire, England' + } +] +``` +```js [SQL Style] +> await cds.ql` + SELECT from ${Authors} as A + where exists ( + SELECT from ${Books} as B + where B.author_ID = A.ID and exists ( + SELECT from ${Genres} as G + where B.genre_ID = G.ID and G.name = 'Fantasy' + ) + )` +``` +::: ### conclusion @@ -316,64 +218,87 @@ themselves can contain expressions by applying [infix-filters](#infix-filter). More samples are shown in the upcoming sections. -## path segment { #path-segment } +## infix filter { #infix-filter } -
+An infix in linguistics refer to a letter or group of letters that are added in the middle of a word to make a new word. -TODO: some text +If we apply this terminology to [path-expressions](#ref), an infix filter condition is an expression +that is applied to a [path-segment](#path-segment) of a [path-expression](#ref). +This allows to filter the target of an association based on certain criteria. -### Structured element +
+ +
+
-```cds -extend Author with { - address: { - street: String; - city: String; - } -} -``` +### enhancing path-expression with filter conditions +In this case we want to select all books where the author's name starts with `Emily` +and the author is younger than 40 years. :::code-group -```cds -entity Structured select from Authors { - address.street, // [!code focus] - address.city // [!code focus] -} -``` -```js -> q = cds.ql`SELECT from Books as B { author.name, genre.name }` // [!code focus] +```js [CAP Style] +> await cds.ql` + SELECT from ${Books} { title } + where startswith( + author[ years_between(dateOfBirth, dateOfDeath) < 40 ].name, + 'Emily' + )` + +[ { title: 'Wuthering Heights' } ] ``` -::: - -### Path segment with parameterized navigation - - - - -### Path segment with infix filter - - -Note: Some examples of infix-filters: - -```cds -entity InfixFilter select from Authors { - books[price > 20], as expensiveBooks // [!code focus] - exists books[price > 20] as hasDramaBooks // [!code focus] -} +```js [SQL Style] +> await cds.ql` + SELECT + title + from ${Books} as B + left join ${Authors} as author + on B.author_ID = author.ID and years_between(author.dateOfBirth, author.dateOfDeath) < 40 + where startswith( + author.name, + 'Emily' + )` ``` -```js -await cds.ql `select from Authors { books[exists genre[name = 'Mystery']] { title, genre.name } }` -await cds.ql `select from Authors { books[exists genre[exists parent [name = 'Fiction']]] { title, genre.name } } +```sql [SQL output] +SELECT + title +FROM + sap_capire_bookshop_Books AS B + LEFT JOIN sap_capire_bookshop_Authors AS author + ON B.author_ID = author.ID + AND FLOOR( + ( + ( + (CAST(STRFTIME('%Y', author.dateOfDeath) AS INTEGER) - CAST(STRFTIME('%Y', author.dateOfBirth) AS INTEGER)) * 12 + ) + ( + CAST(STRFTIME('%m', author.dateOfDeath) AS INTEGER) - CAST(STRFTIME('%m', author.dateOfBirth) AS INTEGER) + ) + ( + CASE + WHEN (CAST(STRFTIME('%Y%m', author.dateOfDeath) AS INTEGER) < CAST(STRFTIME('%Y%m', author.dateOfBirth) AS INTEGER)) THEN + (CAST(STRFTIME('%d%H%M%S%f0000', author.dateOfDeath) AS INTEGER) > CAST(STRFTIME('%d%H%M%S%f0000', author.dateOfBirth) AS INTEGER)) + ELSE + (CAST(STRFTIME('%d%H%M%S%f0000', author.dateOfDeath) AS INTEGER) < CAST(STRFTIME('%d%H%M%S%f0000', author.dateOfBirth) AS INTEGER)) * -1 + END + ) + ) / 12 + ) < ? +WHERE + COALESCE(INSTR(author.name, ?) = 1, FALSE); ``` +::: -## infix filter { #infix-filter } +The path expression `author[ years_between(dateOfBirth, dateOfDeath) < 40 ].name` +navigates along the `author` association of the `Books` entity. -
+The join for this path-expression is generated as usual and enhanced with the infix filter condition `years_between(dateOfBirth, dateOfDeath) < 40`. + + +::: info 💡 Standard functions +the `years_between` and `startswith` functions are in the [set of CAPs standard functions](../guides/databases.md#standard-database-functions) and are translated to the respective SQL to get the desired result. +::: -TODO: some text ## unary operator { #unary-operator } @@ -435,17 +360,13 @@ TODO TODO From 1fe6bec74d1c089a29b0c580326f6f88e9af36a1 Mon Sep 17 00:00:00 2001 From: Johannes Vogt Date: Tue, 9 Dec 2025 14:56:03 +0100 Subject: [PATCH 18/47] fix --- assets/cxl/infix-filter.drawio.svg | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/assets/cxl/infix-filter.drawio.svg b/assets/cxl/infix-filter.drawio.svg index 6027729ca0..c46cbea71f 100644 --- a/assets/cxl/infix-filter.drawio.svg +++ b/assets/cxl/infix-filter.drawio.svg @@ -1,8 +1,4 @@ -<<<<<<< HEAD - -======= - ->>>>>>> origin/cxl + @@ -38,7 +34,7 @@ - + [ @@ -52,7 +48,7 @@ - + ] @@ -103,4 +99,12 @@ + + + + + Text is not SVG - cannot display + + + \ No newline at end of file From 8f56dd6a3299cb8d8045184013d17a1e243169dd Mon Sep 17 00:00:00 2001 From: Patrice Bender Date: Tue, 9 Dec 2025 15:07:18 +0100 Subject: [PATCH 19/47] adjustements to drawings and more samples --- assets/cxl/binding-parameter.drawio.svg | 2 +- assets/cxl/ordering-term.drawio.svg | 26 +-- assets/cxl/over-clause.drawio.svg | 109 +----------- assets/cxl/ref.drawio.svg | 215 ++++++++++++++++-------- assets/cxl/unary-operator.drawio.svg | 4 +- cds/cxl.md | 109 +++++++++--- 6 files changed, 248 insertions(+), 217 deletions(-) diff --git a/assets/cxl/binding-parameter.drawio.svg b/assets/cxl/binding-parameter.drawio.svg index 9ed3b13328..01589833bf 100644 --- a/assets/cxl/binding-parameter.drawio.svg +++ b/assets/cxl/binding-parameter.drawio.svg @@ -1,4 +1,4 @@ - + diff --git a/assets/cxl/ordering-term.drawio.svg b/assets/cxl/ordering-term.drawio.svg index a3d24a97a9..b349dda9fd 100644 --- a/assets/cxl/ordering-term.drawio.svg +++ b/assets/cxl/ordering-term.drawio.svg @@ -1,8 +1,8 @@ - + - + @@ -13,7 +13,7 @@ - + @@ -58,8 +58,8 @@ - - + + @@ -70,12 +70,12 @@ - - + + - - + + @@ -124,12 +124,12 @@ - - + + - - + + \ No newline at end of file diff --git a/assets/cxl/over-clause.drawio.svg b/assets/cxl/over-clause.drawio.svg index f715b05f9b..6c89b7f33a 100644 --- a/assets/cxl/over-clause.drawio.svg +++ b/assets/cxl/over-clause.drawio.svg @@ -1,118 +1,23 @@ - + - + - - + + - + - - - - - - - - - ASC - - - - - - - - - - DESC - - - - - - - - - - NULLS - - - - - - - - - - - - - - - - - - - - - - NULLS - - - - - - - - - - - - - - FIRST - - - - - - - - - - LAST - - - - - - - - - - - - - - - - - - - - - + - + OVER diff --git a/assets/cxl/ref.drawio.svg b/assets/cxl/ref.drawio.svg index 2a05fd251b..97b920459e 100644 --- a/assets/cxl/ref.drawio.svg +++ b/assets/cxl/ref.drawio.svg @@ -1,38 +1,37 @@ - + - + - - + + - + - - + + - - + + - - + + - + -<<<<<<< HEAD -
+
. @@ -40,129 +39,201 @@
- + . -======= - - - . - ->>>>>>> origin/cxl - + - - - . - + + + +
+
+
+ . +
+
+
+
+ + . + +
- + - - + + - + - - - . - + + + +
+
+
+ . +
+
+
+
+ + . + +
- - + + - - + + - - + + - - + + - - + + - + - - - $self - + + + +
+
+
+ + $self + +
+
+
+
+ + $self + +
- + - - - Table Alias - + + + +
+
+
+ Table Alias +
+
+
+
+ + Table Alias + +
- + a scalar element is a primitive field (e.g., String, Integer, Decimal, Boolean, Date/Time, UUID) without nested structure or associations - + a scalar element is a primitive field (e.g., String, Integer, Decimal, Boolean, Date/Time, UUID) without nested structure or associations - - scalar element - + + +
+
+
+ + scalar element + +
+
+
+
+ + scalar element + +
- + - - - path-segment - + + + +
+
+
+ path-segment +
+
+
+
+ + path-segment + +
- - + + - - + + - - + + - - + +
+ + + + + Text is not SVG - cannot display + + + \ No newline at end of file diff --git a/assets/cxl/unary-operator.drawio.svg b/assets/cxl/unary-operator.drawio.svg index 4f57f2ece0..9158f4579c 100644 --- a/assets/cxl/unary-operator.drawio.svg +++ b/assets/cxl/unary-operator.drawio.svg @@ -1,4 +1,4 @@ - + - + diff --git a/cds/cxl.md b/cds/cxl.md index a001b3e9cc..e3a0c6b6c8 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -24,21 +24,27 @@ import intro from '../assets/cxl/intro.drawio.svg?raw' # Core Expression Language (CXL) { #expressions } +The Core Expression Language (`CXL`) is a language to express calculations, conditions, +and other expressions in the context of CDS models and queries. +**`CXL` extends the SQL expression language**, so many syntax elements from SQL are also available in `CXL`. -Expressions are represented using the Core Expression Language (CXL). -It is based on SQL expressions, so many syntax elements from SQL are also available in `CXL`. - -CXL can be used in various places (TODO: Links): +`CXL` can be used in various places (TODO: Links): - In queries as part of the select list or where clause - In calculated elements - In annotations, where supported +::: info 💡 expressions in CAP are materialized in the context of queries +No matter where `CXL` is used, it always manifests in queries. +For example, [a calculated element](./cdl/#calculated-elements) defined in an entity will be resolved +to the respective calculation in the generated query when the entity is queried. +::: + ## How to read this guide { #how-to } In the following chapters we illustrate the `CXL` syntax based on simple and more complex examples. -For a complete reference of the syntax, there are additionally clickable syntax diagrams for each language construct. +For a complete reference of the syntax, there are clickable syntax diagrams for each language construct. ### samples @@ -56,10 +62,10 @@ cds repl --run . ``` :::info 💡 All of the example expressions follow the same pattern: -1. A `CXL` snippet is shown as part of a query - either in the columns or in a query modifier. +1. A `CXL` snippet is shown in the context of a query. 2. The corresponding **CAP Style `CXL`** is shown. 3. The equivalent **SQL Style `CXL`** is shown. -4. The resulting **SQL output** is shown in SQL syntax. +4. The resulting **SQL output** is shown. ::: ### diagrams @@ -100,7 +106,7 @@ TODO: some text and more examples ## ref (path expression) { #ref } A `ref` (short for reference) is used to refer to an element within the model. -It can be used to navigate along [path-segments](#path-segment). Such a navigation is often +It can be used to navigate along [path segments](#path-segment). Such a navigation is often referred to as a **path expression**.
@@ -108,10 +114,10 @@ referred to as a **path expression**.
- ## path segment { #path-segment } -A path-segment in the context of a path-expression is used to navigate along +[Path expressions](#ref) can't be explained without the corresponding path segments. +In the context of a path expression path-segements can be used to navigate along an association, or to access a structured element.
@@ -121,7 +127,7 @@ an association, or to access a structured element. ### path expression in the select list -A path-expression can be used to navigate to any element of the associations target: +A path expression can be used to navigate to any element of the associations target: :::code-group ```js [CAP Style] @@ -164,12 +170,12 @@ Those joins are declared **before** they are used (e.g. in an entity definition) Once an association is traversed in a query, the respective join is added automatically. ::: -### path-expression after `exists` predicate +### path expression after `exists` predicate path-expressions can also be used after the `exists` predicate to check for the existence. This is especially useful for to-many relations. -In the example a path-expression combined with an [infix-filter](#infix-filter), +In the example a path expression combined with an [infix-filter](#infix-filter), allows to select all authors that have written at least one book in the `Fantasy` genre. :::code-group @@ -209,11 +215,11 @@ allows to select all authors that have written at least one book in the `Fantasy ### conclusion A `ref` can be used to reference an element. -It is possible to navigate along [path-segments](#path-segment) to reference elements within the model. +It is possible to navigate along [path segments](#path-segment) to reference elements within the model. This is not limited to an entities own elements, but can also be used to navigate associations to elements of related entities. This is only the tip of the iceberg. -A path expression can be much more complex. For example, the individual [path-segments](#path-segment) +A path expression can be much more complex. For example, the individual [path segments](#path-segment) themselves can contain expressions by applying [infix-filters](#infix-filter). More samples are shown in the upcoming sections. @@ -231,7 +237,7 @@ This allows to filter the target of an association based on certain criteria.
-### enhancing path-expression with filter conditions +### enhancing path expression with filter conditions In this case we want to select all books where the author's name starts with `Emily` and the author is younger than 40 years. @@ -292,7 +298,7 @@ WHERE The path expression `author[ years_between(dateOfBirth, dateOfDeath) < 40 ].name` navigates along the `author` association of the `Books` entity. -The join for this path-expression is generated as usual and enhanced with the infix filter condition `years_between(dateOfBirth, dateOfDeath) < 40`. +The join for this path expression is generated as usual and enhanced with the infix filter condition `years_between(dateOfBirth, dateOfDeath) < 40`. ::: info 💡 Standard functions @@ -300,17 +306,31 @@ the `years_between` and `startswith` functions are in the [set of CAPs standard ::: -## unary operator { #unary-operator } +### use an infix-filter to make an association more specific -
-TODO: some text +## operators -## binary operator { #binary-operator } +### unary operator { #unary-operator } -
+
+
+
-TODO: some text + +A unary operator is an operator that operates on only one operand. +E.g. in the expression `-price`, the `-` operator is a unary operator +that operates on the single operand `price`. It negates the value of `price`. + +### binary operator { #binary-operator } + +
+
+
+A binary operator is an operator that operates on two operands. + +E.g. in the expression `price * quantity`, the `*` operator is a binary operator +that operates on the two operands `price` and `quantity`. ## literal value { #literal-value } @@ -336,10 +356,45 @@ TODO: some text
-TODO: some text +### aggregate function with [ordering term](#ordering-term) -❓ REVISIT: I dont get the `ordering term` logic - it can only be applied to exactly one parameter. -I would have expected that it can only be provided for the last parameter. +::: code-group +```js [CAP Style] +> await cds.ql` + SELECT from Authors { + name, + string_agg(books.title, ', ' ORDER BY books.title DESC) as titles + } + GROUP BY books.author.ID` + +[ + { name: 'Emily Brontë', titles: 'Wuthering Heights' }, + { name: 'Charlotte Brontë', titles: 'Jane Eyre' }, + { name: 'Edgar Allen Poe', titles: 'The Raven, Eleonora' }, + { name: 'Richard Carpenter', titles: 'Catweazle' } +] +``` + +```js [SQL Style] +await cds.ql` + SELECT + name, + string_agg(books.title, ', ' ORDER BY books.title DESC) as titles + from ${Authors} as A + left join ${Books} as books on books.author_ID = A.ID + GROUP BY books.author_ID +``` + +```sql [SQL output] +SELECT + "$A".name, + string_agg(books.title, ? ORDER BY books.title DESC) AS titles +FROM sap_capire_bookshop_Authors AS "$A" +LEFT JOIN sap_capire_bookshop_Books AS books + ON books.author_ID = "$A".ID +GROUP BY books.author_ID; +``` +::: ## ordering term { #ordering-term } @@ -366,7 +421,7 @@ TODO } .diagram { - overflow: auto; + padding-top: 1em; } From c22f480b5fa6d9172c7c3416fe309ffaf0fbee72 Mon Sep 17 00:00:00 2001 From: Johannes Vogt Date: Tue, 9 Dec 2025 15:29:08 +0100 Subject: [PATCH 20/47] css --- cds/cxl.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cds/cxl.md b/cds/cxl.md index e3a0c6b6c8..511e6deea4 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -422,6 +422,17 @@ TODO .diagram { padding-top: 1em; + width: 100%; +} + +.diagram > div > svg { + width: 100%; + height: auto; +} + +.diagram > svg { + width: 100%; + height: auto; } From 925d0af639fbcec011a03e312491599fb81ce352 Mon Sep 17 00:00:00 2001 From: Patrice Bender Date: Tue, 9 Dec 2025 15:39:13 +0100 Subject: [PATCH 21/47] more finetuning --- assets/cxl/binary-operator.drawio.svg | 186 ++++++++++++------------ assets/cxl/binding-parameter.drawio.svg | 4 +- assets/cxl/literal-value.drawio.svg | 4 +- cds/cxl.md | 65 +++++---- 4 files changed, 134 insertions(+), 125 deletions(-) diff --git a/assets/cxl/binary-operator.drawio.svg b/assets/cxl/binary-operator.drawio.svg index 383856acca..ec3cf8deca 100644 --- a/assets/cxl/binary-operator.drawio.svg +++ b/assets/cxl/binary-operator.drawio.svg @@ -1,281 +1,281 @@ - + - + - - + + - + - - + + - + - + - + - - + - + * - - + + - - + + - + - + + - - + + - - + + - + - + / - + - + = - + - + != - + - + == - + - + <> - + - + > - + - + >= - + - + < - + - + <= - + - + AND - + - + OR - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + \ No newline at end of file diff --git a/assets/cxl/binding-parameter.drawio.svg b/assets/cxl/binding-parameter.drawio.svg index 01589833bf..cdb44e74bd 100644 --- a/assets/cxl/binding-parameter.drawio.svg +++ b/assets/cxl/binding-parameter.drawio.svg @@ -1,8 +1,8 @@ - + - + diff --git a/assets/cxl/literal-value.drawio.svg b/assets/cxl/literal-value.drawio.svg index 860c84d13a..131ff81b13 100644 --- a/assets/cxl/literal-value.drawio.svg +++ b/assets/cxl/literal-value.drawio.svg @@ -1,8 +1,8 @@ - + - + diff --git a/cds/cxl.md b/cds/cxl.md index 511e6deea4..0816d2894e 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -62,10 +62,9 @@ cds repl --run . ``` :::info 💡 All of the example expressions follow the same pattern: -1. A `CXL` snippet is shown in the context of a query. -2. The corresponding **CAP Style `CXL`** is shown. -3. The equivalent **SQL Style `CXL`** is shown. -4. The resulting **SQL output** is shown. +1. A **CAP Style `CXL`** is shown in the context of a query. +2. The equivalent **SQL Style `CXL`** is shown. +3. The resulting **SQL output** is shown. ::: ### diagrams @@ -117,7 +116,7 @@ referred to as a **path expression**. ## path segment { #path-segment } [Path expressions](#ref) can't be explained without the corresponding path segments. -In the context of a path expression path-segements can be used to navigate along +In the context of a path expression path segments can be used to navigate along an association, or to access a structured element.
@@ -181,35 +180,40 @@ allows to select all authors that have written at least one book in the `Fantasy :::code-group ```js [CAP Style] > await cds.ql` - SELECT from Authors + SELECT from ${Authors} as FantasyAuthors { name } where exists books.genre[name = 'Fantasy']` // [!code focus] -[ - { - ID: 170, - createdAt: '2025-12-08T12:51:45.294Z', - createdBy: 'anonymous', - modifiedAt: '2025-12-08T12:51:45.294Z', - modifiedBy: 'anonymous', - name: 'Richard Carpenter', - dateOfBirth: '1929-08-14', - dateOfDeath: '2012-02-26', - placeOfBirth: 'King’s Lynn, Norfolk', - placeOfDeath: 'Hertfordshire, England' - } -] +[ { name: 'Richard Carpenter' } ] ``` ```js [SQL Style] > await cds.ql` - SELECT from ${Authors} as A + SELECT + name + from ${Authors} as FantasyAuthors where exists ( - SELECT from ${Books} as B - where B.author_ID = A.ID and exists ( - SELECT from ${Genres} as G - where B.genre_ID = G.ID and G.name = 'Fantasy' + SELECT from ${Books} as books + where books.author_ID = FantasyAuthors.ID and exists ( + SELECT from ${Genres} as genre + where books.genre_ID = genre.ID and genre.name = 'Fantasy' ) )` ``` + +```sql [SQL output] +SELECT FantasyAuthors.name +FROM sap_capire_bookshop_Authors AS FantasyAuthors +WHERE EXISTS ( + SELECT 1 + FROM sap_capire_bookshop_Books AS "$b" + WHERE "$b".author_ID = FantasyAuthors.ID + AND EXISTS ( + SELECT 1 + FROM sap_capire_bookshop_Genres AS "$g" + WHERE "$g".ID = "$b".genre_ID + AND "$g".name = 'Fantasy' + ) +); +``` ::: ### conclusion @@ -334,7 +338,9 @@ that operates on the two operands `price` and `quantity`. ## literal value { #literal-value } -
+
+
+
TODO @@ -352,9 +358,12 @@ TODO: some text TODO: some text -## function args { #function-args } +## function args { #function-args } -
+
+ +
+
### aggregate function with [ordering term](#ordering-term) From 00383567c6dd93418e229fc7dcd31862205408db Mon Sep 17 00:00:00 2001 From: Patrice Bender Date: Tue, 9 Dec 2025 17:10:06 +0100 Subject: [PATCH 22/47] review notes --- assets/cxl/binary-operator.drawio.svg | 188 +++++++++++++------------- assets/cxl/expr.drawio.svg | 6 +- cds/cxl.md | 45 ++---- 3 files changed, 111 insertions(+), 128 deletions(-) diff --git a/assets/cxl/binary-operator.drawio.svg b/assets/cxl/binary-operator.drawio.svg index ec3cf8deca..b082cc2f83 100644 --- a/assets/cxl/binary-operator.drawio.svg +++ b/assets/cxl/binary-operator.drawio.svg @@ -1,281 +1,281 @@ - + - + - - + + - + - - + + - + - + - + - - + - + * - - + + - - + + - + - + + - - + + - - + + - + - + / - + - + = - + - + != - + - + == - + - + <> - + - + > - + - + >= - + - + < - + - + <= - + - + AND - + - + OR - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + + - + + - - + - - + \ No newline at end of file diff --git a/assets/cxl/expr.drawio.svg b/assets/cxl/expr.drawio.svg index 1cc792e8b4..ac072db4d3 100644 --- a/assets/cxl/expr.drawio.svg +++ b/assets/cxl/expr.drawio.svg @@ -1,4 +1,4 @@ - + @@ -241,14 +241,14 @@ - + - type-name + type-ref diff --git a/cds/cxl.md b/cds/cxl.md index 0816d2894e..312f7f246e 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -129,8 +129,8 @@ an association, or to access a structured element. A path expression can be used to navigate to any element of the associations target: :::code-group -```js [CAP Style] -> await cds.ql`SELECT from Books as B { author.name, genre.name }` // [!code focus] +```js [CQL] +> await cds.ql`SELECT from Books { author.name, genre.name }` // [!code focus] [ { author_name: 'Emily Brontë', genre_name: 'Drama' }, { author_name: 'Charlotte Brontë', genre_name: 'Drama' }, @@ -140,17 +140,7 @@ A path expression can be used to navigate to any element of the associations tar ] ``` -```js [SQL Style] -> await cds.ql` - SELECT - author.name as author_name, - genre.name as genre_name - from ${Books} as B - left join ${Authors} as author on B.author_ID = author.ID - left join ${Genres} as genre on B.genre_ID = genre.ID` -``` - -```sql [SQL output] +```sql [SQL] SELECT author.name as author_name, genre.name as genre_name @@ -165,7 +155,8 @@ In this example, we select the names of the authors and genres of books. Both `author` and `genre` are associations on the `Books` entity. ::: info 💡 Associations are **forward declared joins** -Those joins are declared **before** they are used (e.g. in an entity definition) +An association can be used just as a table alias. +They are declared **before** they are used (e.g. in an entity definition) Once an association is traversed in a query, the respective join is added automatically. ::: @@ -178,28 +169,15 @@ In the example a path expression combined with an [infix-filter](#infix-filter), allows to select all authors that have written at least one book in the `Fantasy` genre. :::code-group -```js [CAP Style] +```js [CQL] > await cds.ql` SELECT from ${Authors} as FantasyAuthors { name } where exists books.genre[name = 'Fantasy']` // [!code focus] [ { name: 'Richard Carpenter' } ] ``` -```js [SQL Style] -> await cds.ql` - SELECT - name - from ${Authors} as FantasyAuthors - where exists ( - SELECT from ${Books} as books - where books.author_ID = FantasyAuthors.ID and exists ( - SELECT from ${Genres} as genre - where books.genre_ID = genre.ID and genre.name = 'Fantasy' - ) - )` -``` -```sql [SQL output] +```sql [SQL] SELECT FantasyAuthors.name FROM sap_capire_bookshop_Authors AS FantasyAuthors WHERE EXISTS ( @@ -216,6 +194,10 @@ WHERE EXISTS ( ``` ::: +::: info 💡 TODO +??? +::: + ### conclusion A `ref` can be used to reference an element. @@ -246,7 +228,7 @@ This allows to filter the target of an association based on certain criteria. In this case we want to select all books where the author's name starts with `Emily` and the author is younger than 40 years. -:::code-group +:::code-group {4} ```js [CAP Style] > await cds.ql` SELECT from ${Books} { title } @@ -415,7 +397,7 @@ TODO: some text
-## type-name { #type-name } +## type-ref { #type-ref } TODO @@ -431,6 +413,7 @@ TODO .diagram { padding-top: 1em; + padding-bottom: 1em; width: 100%; } From 13ce6223d7867d7bcbdaa6ecdd8218564cf68692 Mon Sep 17 00:00:00 2001 From: Johannes Vogt Date: Thu, 11 Dec 2025 15:17:24 +0100 Subject: [PATCH 23/47] fix size for smaller diagrams --- cds/cxl.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cds/cxl.md b/cds/cxl.md index 312f7f246e..f2659c6d8c 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -414,16 +414,16 @@ TODO .diagram { padding-top: 1em; padding-bottom: 1em; - width: 100%; + max-width: 100%; } .diagram > div > svg { - width: 100%; + max-width: 100%; height: auto; } .diagram > svg { - width: 100%; + max-width: 100%; height: auto; } From 4d8f4bad58294bb4d720e87973c3ea4697ce3507 Mon Sep 17 00:00:00 2001 From: Johannes Vogt Date: Thu, 11 Dec 2025 16:20:54 +0100 Subject: [PATCH 24/47] update ref diagram and apply review feedback --- assets/cxl/path-segment.drawio.svg | 165 --------------------- assets/cxl/ref.drawio.svg | 230 ++++++++--------------------- cds/cxl.md | 60 +++++--- 3 files changed, 102 insertions(+), 353 deletions(-) delete mode 100644 assets/cxl/path-segment.drawio.svg diff --git a/assets/cxl/path-segment.drawio.svg b/assets/cxl/path-segment.drawio.svg deleted file mode 100644 index 398707f8c8..0000000000 --- a/assets/cxl/path-segment.drawio.svg +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - structured-element - - - - - - - - - - association - - - - - - - - - - - - - - - - - - infix filter - - - - - - - - - - - param name - - - - - - - - - - : - - - - - - - - - - - - - - - expr - - - - - - - - - - - - - - - - - - - , - - - - - - - - - - - - - - - - - - ( - - - - - - - - - - ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/assets/cxl/ref.drawio.svg b/assets/cxl/ref.drawio.svg index 97b920459e..7a7970ac26 100644 --- a/assets/cxl/ref.drawio.svg +++ b/assets/cxl/ref.drawio.svg @@ -1,231 +1,121 @@ - + - + - - + + - + - - + - - + + - - - - - + + + a scalar element is a primitive field (e.g., String, Integer, Decimal, Boolean, Date/Time, UUID) without nested structure or associations + + - - - -
-
-
- . -
-
-
-
- - . - -
+ + + a scalar element is a primitive field (e.g., String, Integer, Decimal, Boolean, Date/Time, UUID) without nested structure or associations + + + scalar element +
- + - - - -
-
-
- . -
-
-
-
- - . - -
+ + + structured-element +
- + - - - - - + + + association + + - - - - -
-
-
- . -
-
-
-
- - . + + + + + + + + infix filter -
+
-
- - - - - - - - + - - + + - - + + - - + + - + + - - - -
-
-
- - $self - -
-
-
-
- - $self - -
-
+ +
- + -
+
- Table Alias -
-
-
- - - Table Alias - - - - - - - - a scalar element is a primitive field (e.g., String, Integer, Decimal, Boolean, Date/Time, UUID) without nested structure or associations - - - - - - - a scalar element is a primitive field (e.g., String, Integer, Decimal, Boolean, Date/Time, UUID) without nested structure or associations - - - -
-
-
- - scalar element - + .
- - scalar element + + .
- - - - - - - - -
-
-
- path-segment -
-
-
-
- - path-segment - -
-
-
-
- - - - - - - - - - + + - - + + diff --git a/cds/cxl.md b/cds/cxl.md index f2659c6d8c..73fbadc678 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -2,15 +2,13 @@ # layout: cds-ref shorty: Expressions synopsis: > - Specification of the Core Expression Notation (CXN) used to capture expressions as plain JavaScript objects. + Specification of the Core Expression Language (CXL) used to capture expressions in CDS. status: draft -uacp: Used as link target from Help Portal at https://help.sap.com/products/BTP/65de2977205c403bbc107264b8eccf4b/855e00bd559742a3b8276fbed4af1008.html --- # Core Expression Language (CXL) { #expressions } @@ -199,7 +203,7 @@ The condition can manifest in multiple ways: - To select related entities with an additional query ::: -### in the from clause +### in the from clause {#in-from-clause} A path expression can also be used in the `from` clause of a query to navigate to a related entity: @@ -324,26 +328,57 @@ WHERE exists ( ### theory of path expressions -A `ref` can be used to reference an element. -It is possible to navigate along path-segments to reference elements within the model. -This is not limited to an entities own elements, but can also be used to navigate associations to elements of related entities. -A path expression can be much more complex. For example, the individual path segments -themselves can contain expressions by applying [infix-filters](#infix-filter). -More samples are shown in the upcoming sections. -::: info 💡 Set theory of path expressions +Every entity defines a set of all possible instances `{ b ∈ Books }`. A simple select query on Books returns the complete set -> all books. -TODO: further polish and explain +Filters progressively narrow down the set: -Path expressions point to a **set** of data that can be further filtered and used. +Let `highstock = { b ∈ Books | b.stock > 100 }`. -A query with a filter (typically: where-clause) results in an entity set which is a subset of the complete entity. In terms of set theory: The set of elements for which the following holds true ... +With the infix filter notation, we write it as `Books[stock > 100]`. -An infix filter further narrows down this set by applying additional conditions on the elements of the set. +An association defines a relationship between two sets: -The resulting set can then be used in various ways, e.g., to select elements, to check for existence, to perform aggregations... or to further navigate along associations to related entities. -::: +Let `books = { (a,b) ∈ Books x Authors | b.author_id = a.id }`. + +We can select this set using the path expression `Authors:books` [in the from clause](#in-from-clause). +The same can be applied to navigate via a path expression in the [select list](#path-navigation) or where clause using `books`. + +Filtering authors by `Authors where exists books[stock > 100]` can be expressed as: + +`{a ∈ Authors ∣ ∃ b ∈ Books( b.author_id = a.id ∧ b.stock > 100 )}` + +Using the previously defined `books`, we can simplify it to: + +`{a ∈ Authors ∣ ∃ b ∈ books( b.stock > 100 )}` + +Using the `highstock` set, we can further simplify it to: + +`{a ∈ Authors ∣ ∃ b ∈ books ∩ highstock }` + +So in conclusion, the expression filters for the intersection of the two sets `books` (via association) and `highstock` (via infix filter). + + + + + +
+
+
+ + + + + +
+
+
+ + +
+
+
## infix filter { #infix-filter } @@ -803,6 +838,37 @@ TODO: Remove for first version? TODO: some text +CAP supports a set of [standard functions](../guides/databases.md#standard-database-functions) that can be used in expressions. In addition, functions are passed through to the underlying database, allowing you to leverage database-specific functions as needed. + +CAP standard functions: +| Name | Description | +|-----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------| +| **String Functions** | | +| `concat(x, y, ...)` | Concatenates the given strings or numbers `x`, `y`, ... | +| `trim(x)` | Removes leading and trailing whitespaces from `x`. | +| `contains(x, y)` | Checks whether `x` contains `y` (case-sensitive). | +| `startswith(x, y)` | Checks whether `x` starts with `y` (case-sensitive). | +| `endswith(x, y)` | Checks whether `x` ends with `y` (case-sensitive). | +| `matchespattern(x, y)` | Checks whether `x` matches the regular expression `y`. | +| `indexof(x, y)`1 | Returns the index of the first occurrence of `y` in `x` (case-sensitive). | +| `substring(x, i, n?)`1 | Extracts a substring from `x` starting at index `i` (0-based) with an optional length `n`. | +| `length(x)` | Returns the length of the string `x`. | +| `tolower(x)` | Converts all characters in `x` to lowercase. | +| `toupper(x)` | Converts all characters in `x` to uppercase. | +| **Numeric Functions** | | +| `ceiling(x)` | Rounds the numeric parameter up to the nearest integer. | +| `floor(x)` | Rounds the numeric parameter down to the nearest integer. | +| `round(x)` | Rounds the numeric parameter to the nearest integer. The midpoint between two integers is rounded away from zero (e.g., `0.5` → `1` and `-0.5` → `-1`). | +| **Aggregate Functions** | | +| `min(x)` | Returns the minimum value of `x`. | +| `max(x)` | Returns the maximum value of `x`. | +| `sum(x)` | Returns the sum of all values of `x`. | +| `average(x)` | Returns the average (mean) value of `x`. | +| `count(x)` | Returns the count of non-null values of `x`. | +| `countdistinct(x)` | Returns the count of distinct non-null values of `x`. | + + + ## function args { #function-args }
From ca9f55448b8d878483a50984d3b23fc74facd970 Mon Sep 17 00:00:00 2001 From: Johannes Vogt Date: Thu, 18 Dec 2025 13:47:09 +0100 Subject: [PATCH 40/47] math expressions --- .vitepress/config.js | 1 + cds/cxl.md | 28 ++++++++++++++-------------- package.json | 1 + 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/.vitepress/config.js b/.vitepress/config.js index 7b39a57aef..5a58472f66 100644 --- a/.vitepress/config.js +++ b/.vitepress/config.js @@ -32,6 +32,7 @@ const config = defineConfig({ markdown: { languages, + math: true, toc: { level: [2,3] }, diff --git a/cds/cxl.md b/cds/cxl.md index d14cbd1fe2..b50f9b870a 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -233,7 +233,7 @@ TODO explanation This is equivalent to writing `SELECT from Authors where exists books`. When combining this with [infix filters](#infix-filter), it allows for quite concise queries. -### in the where clause +### in the where clause {#in-where-clause} A path expression can also be used as part of the where clause to filter based on elements of related entities: @@ -330,34 +330,34 @@ WHERE exists ( -Every entity defines a set of all possible instances `{ b ∈ Books }`. A simple select query on Books returns the complete set -> all books. +Every entity defines a set of all possible instances: +$${ b \in \text{Books} }$$ +A simple select query on Books returns the complete set → all books. Filters progressively narrow down the set: -Let `highstock = { b ∈ Books | b.stock > 100 }`. +$$\text{highstock} = \{ b \in \text{Books} \mid b.\text{stock} > 100 \}$$ With the infix filter notation, we write it as `Books[stock > 100]`. - An association defines a relationship between two sets: -Let `books = { (a,b) ∈ Books x Authors | b.author_id = a.id }`. - -We can select this set using the path expression `Authors:books` [in the from clause](#in-from-clause). -The same can be applied to navigate via a path expression in the [select list](#path-navigation) or where clause using `books`. +$$\text{books} = \{ (a,b) \in \text{Books} \times \text{Authors} \mid b.\text{author\_id} = a.\text{id} \}$$ +We can select this set using the path expression `Authors:books` in the [from clause](#in-from-clause). +The same can be applied to navigate via a path expression in the [select list](#path-navigation) or [where clause](#in-where-clause) using `books`. Filtering authors by `Authors where exists books[stock > 100]` can be expressed as: -`{a ∈ Authors ∣ ∃ b ∈ Books( b.author_id = a.id ∧ b.stock > 100 )}` +$$\\{ a \in \text{Authors} \mid \exists \space b \in \text{Books}( b.\text{author\_id} = a.\text{id} \land b.\text{stock} > 100 ) \\}$$ -Using the previously defined `books`, we can simplify it to: +Using the previously defined $\text{books}$, we can simplify it to: -`{a ∈ Authors ∣ ∃ b ∈ books( b.stock > 100 )}` +$$\\{ a \in \text{Authors} \mid \exists \space b \in \text{books}( b.\text{stock} > 100 ) \\}$$ -Using the `highstock` set, we can further simplify it to: +Using the $\text{highstock}$ set, we can further simplify it to: -`{a ∈ Authors ∣ ∃ b ∈ books ∩ highstock }` +$$\\{ a \in \text{Authors} \mid \exists \space b \in \text{books} \cap \text{highstock} \\}$$ -So in conclusion, the expression filters for the intersection of the two sets `books` (via association) and `highstock` (via infix filter). +So in conclusion, the expression filters for the intersection of the two sets $\text{books}$ (via association) and $\text{highstock}$ (via infix filter). diff --git a/package.json b/package.json index 74ade9ad7b..e78318e615 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "eslint-plugin-vue": "^10.0.0", "fflate": "^0.8.2", "gray-matter": "^4.0.3", + "markdown-it-mathjax3": "^4.3.2", "markdownlint-cli": ">=0.35.0", "markdownlint-rule-search-replace": "^1.1.1", "sass": "^1.62.1", From e54664f92b19a4a10456c1995c7d6ed7029017d2 Mon Sep 17 00:00:00 2001 From: Johannes Vogt Date: Thu, 18 Dec 2025 17:14:08 +0100 Subject: [PATCH 41/47] apply review comments --- assets/cxl/intro.drawio.svg | 102 +++++++++++++++++++++------------- cds/assets/cxl.excalidraw.svg | 4 -- 2 files changed, 64 insertions(+), 42 deletions(-) delete mode 100644 cds/assets/cxl.excalidraw.svg diff --git a/assets/cxl/intro.drawio.svg b/assets/cxl/intro.drawio.svg index 81899c5b4b..29440dfae8 100644 --- a/assets/cxl/intro.drawio.svg +++ b/assets/cxl/intro.drawio.svg @@ -1,5 +1,9 @@ - - + + + + @@ -106,45 +110,9 @@ - - - - -
-
-
- Round shapes refer to terminal symbols such as `exists` or `null`, which can't be further divided -
-
-
-
- - Round shapes refer to ter... - -
-
-
- - - - -
-
-
- language constructs can be broken down further and get their own syntax diagram -
-
-
-
- - language constructs can b... - -
-
-
@@ -173,6 +141,64 @@
+ + + + + + + +
+
+
+ + Round shapes refer to terminal symbols such as + + + exists + + + or + + + null + + + , which can't be further divided + +
+
+
+
+ + Round shapes refer to te... + +
+
+
+ + + + + + + +
+
+
+ + language constructs can be broken down further and get their own syntax diagram + +
+
+
+
+ + language constructs can... + +
+
+
diff --git a/cds/assets/cxl.excalidraw.svg b/cds/assets/cxl.excalidraw.svg deleted file mode 100644 index 9d5a50ab38..0000000000 --- a/cds/assets/cxl.excalidraw.svg +++ /dev/null @@ -1,4 +0,0 @@ - - -eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1dW1dcIkuyfp9f0avPedzUych7zpt3UVtcdTAwMTTvzprlQkBBuVx0XGLqWfPfT1x1MDAwNLpcdTAwMDWqsopbadNnwew9u1x1MDAxYjDNqor44ovIuPzvP378+Nl9bZV//vPHz/JLsVCrltqF/s+/6P1eud2pNlx1MDAxYvhcdTAwMTFcdTAwMWb8vdN8blx1MDAxN1x1MDAwN9+sdLutzj//53+GP1x1MDAxMVx1MDAxNJv1958q18r1cqPbwe/9XHUwMDBi//7jx/9cdTAwMGX+XHUwMDFmP6mW6GefO1f154vLk7o8L62fPLywW2b3XHUwMDA2Pzr40t+baZeL3ULjvlZcdTAwMWV+9ILvXHUwMDBixVx1MDAwM8GscsKoz1x1MDAwZl7pXHUwMDAzXHUwMDA2gTNcXCvNh1x1MDAxZvSrpW5cdTAwMDU/XHUwMDA0XHKBMlx1MDAxNkY+qpSr95UufiZtMPgp6T5en195//X//ME+3+l0283H8kaz1mzTXHUwMDFl/1x1MDAwYsr0v+FcdTAwMGVvXHUwMDBixcf7dvO5Ufr8TrddaHRahTbekuH37qq12kn3dbA63la8hT9Dv+PiY+c89H7cT+Evva80ylx1MDAxZLrt8Plus1UoVrt0e4Bccq+CdtjKllx1MDAwNk/o38M9tVx1MDAwYvVyllx1MDAxZVHjuVb7fLvaKJXpxv+8XHUwMDE1XHUwMDFiY7+uUfr4dX8/3+HDXHUwMDEzXHUwMDFm7/xnuPlymVa2xjgumNafXHUwMDFmXGZlTKnwm4fNxkDcwODz0UK54SVUO5soZ93BoneFWqc8fFx1MDAwNLSzrbBcZo7K4ZiYdcsvw+cyXCKlXHUwMDBm27WT/IPebT6dPjSKta12PXeifn5+7z9cdTAwMWZ/XHUwMDFh3r7nVqnwvlx1MDAxZtyuXHUwMDA0bTXnkonPz2vVxmP43taaxcfhJfxj5JaFdMa/m4jOjF3MQF0k2MBcbqM16lx1MDAwYlfK6nGdXHUwMDAxXHUwMDExaKaktiaqM9xcdTAwMDZcbpwzqGjSWo7KXHUwMDEz1Z1cdTAwMTF9WinLuLJs+pVl7OtcdTAwMWZawUFcdTAwMThcdTAwMDBuR+R7XHUwMDA0eiO68qlcdTAwMTYgNGhSjTnUYmxcdTAwMWaLy+5QXHUwMDE0SVx1MDAwNFx1MDAwN/B9N/JcdTAwMDSbje5J9Y02zdnYu9uFerVGt1xcja2wVqve08X/LOJ2y+2fo7egW0Wb8/mFerVUXHUwMDFhtVx1MDAxMUVcXLRQbZTb2WmMTbNdva82XG61U9+uXHUwMDBiz91mvtx533e3/VxcXHUwMDFlvVx1MDAxZuXdv3VcdTAwMDBcdTAwMDKuXHUwMDEyVDcnd5umenTP1s7Wj4/5Re7gVp5Nb+4kXHUwMDBitFx1MDAwMVx1MDAxYjJ2XHUwMDBlVICPn49ZtJWxS1N/t1x1MDAxNjZ2XFwqYMpr61DhY7WaI4GxzM6j1HPauktTdqbwcMrKvbvKNVx1MDAxY+1VMupuRlunRi9pIVvn3800to6ZgDPmXHUwMDE0Q/iK2DrHdWCkZmPEcWXrUtGV7eltnVNSXHRujPRpXHUwMDA1s3FaIZVcdTAwMTGcwVxcpu5faVxu7rJcdTAwMWG6XHRm5lx1MDAxYlxm3c7Wr19XVzuX7We93ejkjkSmv1+L6m25Vqu2OiEzJ1x1MDAwNSogXHUwMDFit1nvwil4XHUwMDAwKC2OcSF9mlx1MDAwYrSrqLJcdTAwMDJcdTAwMGKEY3qls7E6uzOtfeNx9lxywDppjfPqclx1MDAxMm1FiEZlTtObe5dAd1I8uL7sb0i3dXF5fPS6X2ruZ8dcct7fUlhot5v9XHUwMDExXHUwMDEz91fSuuVcdTAwMTfTeaw1f3VOlGqctXbr13vr6ymsu1e8q93KraNtvVnLKbH/tM03nqdbd7JJtlx1MDAxYzm8XHUwMDFj1eT5TXLyXHJcYm1yXFyxlVxuXHUwMDFjXHUwMDA3plGTjVDGiJB+IyE1XHUwMDBl7YFAw4B/4Vx1MDAxMVx1MDAwNbcqXHUwMDEwXGaUU1x1MDAxY5mR5Nz4lN2Qk2sl+lBcYlx1MDAxONroldbHaP3hwlqPj1x1MDAwMVx1MDAxZqpcdTAwMTBcdTAwMTCx1bRFXHUwMDE5wYK/1Z4zdHBBMzOP2id7q4Y74WBcdTAwMDZR/3y71ayGcWX4p1x1MDAxZkOpXHUwMDE5/OXzz//+y/ttXHUwMDBlgUDXynJcdTAwMTOSVHpZXHUwMDEzaMXEUEQnrVx1MDAxNiv39IpK/HC5XGI0dLqFdndcdTAwMWSFoNq4XHUwMDFmf9ZcdTAwMWah2uxcdTAwMTT2XHUwMDFiv11vllx1MDAwNmLbbN9WR/1cYlSFl3LpiG7l2J3EW4aM20pcdTAwMGJIxiWz+F83dkPR5DOIbHwoceVGabjtcTJJl7RGcFMpXHUwMDE3XCLyjj83+llcdTAwMTiXyrXbZn8q3Dt8vdzaL+093tqn86urTDbTO9grTklplIJgPFx1MDAxOD3QYeAmwFx1MDAwN2qYddZLaFx1MDAxMCyDMVx1MDAxZuVcdTAwMTPmXHUwMDE0OjBqxWpcdTAwMTLxLbcwvmmnnLCMXHUwMDBmr2pcYm/Whd/8RDdcdTAwMDBcdTAwMTCSMfaNbnsrf31tXHUwMDBmXHUwMDBlNuX12dWxulW152p2Y1ruoSv123Zv54bbrYPejiuL8t25SYd7XHUwMDE4MvcuLe7hv8qIXHUwMDBlRsNcdTAwMDFaQGBcdTAwMDFJXHUwMDA3oOlxXHUwMDE2QsxcdTAwMDMkRz1Dj0Oj08GNNFx1MDAxMU1ULJDKuVDIYFx1MDAxNVx1MDAwZpishUczxFx1MDAwM1x1MDAxY51OMPCFvmOjXHUwMDAxnCGbZGBH6GJqXFxCXHUwMDFhkGxcdTAwMDbRXHUwMDFkSuKHa/3fnXJtKUJcdTAwMDJcdTAwMTOsVzgkXHUwMDEw2nc6QYHzO9Yvr29f9673b2xBr1+e3D/kprWgXHUwMDEySVx1MDAwZY/GXHUwMDA0uFx1MDAxMFx1MDAwMT6kqGquTGhcdTAwMWHKe7y4i8CUVZxZ41NqULGhb6lQXHUwMDA353NcdTAwMTDmNKGH1cp9tnd0WdvoX5c2bvhhrtRk3+C+J657dFxuO9VmMdMr6NfN19bj7lv/vJueadZcXPNRXZ7fNPvv3jSmmbGAodsvleSOKVx1MDAxNVZw6Vx1MDAwMsXRKGijmNc042VcdTAwMDTcOMe5tFxuLbzSUV1fqXisiuent8+CjkW0Ul77nHCIxVx1MDAxZFDGgZxHl1x1MDAxM6JaXHUwMDA2zf5cYrDPYZ5PXHUwMDBit7XyXHUwMDBmtKGFzjJcdTAwMTjpXHRcdTAwMDYybKS9u0/HVCfDWXKQT1x1MDAwNFx1MDAwMM4qNKxGXHUwMDAxXHUwMDFiiu27wFwikUYhwo+VRdWWQ1o3XHUwMDEy42NcdTAwMWNcdTAwMWOTVjKk5J5cdTAwMTBcdTAwMWaalFx1MDAwMFx1MDAxY0KXw3/QRqxcInxxun22sPlcdTAwMDYjXHUwMDE1PUfhNd88lpVbsIxJmT4nt1xcKTNcdTAwMTcnTzu+p5RDRipcdTAwMDWaXHUwMDFkZ51cdTAwMWP9cdAsUHTXrNSSXHUwMDAyXGKTlotcdTAwMTP6wa9cbov7cLGIif+t4T20XHJcdTAwMDJNtWRcdTAwMTLUMGTy/uEs0b24XSfD41xcu84g91x1MDAxMMDJg/z8J7xzblx1MDAxOT5fI/FRWi1kwlV8UyTy5KByeJu1u1x1MDAxY3Knledm/UVcdTAwMWY281FwjslcIkJcYnZcdTAwMDE5zFx1MDAwMlx1MDAwNYs5OUJcdTAwMDDfYVx1MDAwN1QgXHUwMDFjSprlgDA9ckizyilKXHUwMDEzm89cdTAwMTfOKVx1MDAwMpDScTDe8KSQXHUwMDExxP5cdTAwMWKbXHUwMDA1pdCisn5jeLKu1m9zz7/Kleb1ZfF8q/58/WROp/WBWr1cdTAwMDPI5Sql9lY9W7mVJzebXHUwMDA1fpWCb1U7z+91XHUwMDFh2euGdFc3pnRb3Wvnz1NYd/dq5zZ3dPrWPm3nLpXZrVx1MDAxN7eO6yms23spXdzt13OHXHUwMDFkVn/rZTNcdTAwMGaVQ5XGfjtdyMJVq53lmfK1arHbl4ubYlxu6y5wXHUwMDA0XHUwMDFmMWxcdTAwMTHfVVitYVx1MDAxNlx1MDAxZZBcdTAwMDCoyVx1MDAxYk1ku2joXHJcdTAwMWFsRmSWXHUwMDBiXHUwMDE3XHUwMDBlLKMxXHUwMDBmXHUwMDEwLlx1MDAxOeqoXHUwMDExmnFPYNmawGl0j5AmgGF6yKiGgapAOoOMWqGrrI1cdTAwMWM53VxcYWpcYlNtXG7xKrT1lJfmS2RcdTAwMTE69tBcdTAwMDcpn2XS8LlcdTAwMGV9kigviTp3YpZcdTAwMTOUr6G8sZI6+DAso0tKUomHhvhcdTAwMWTu2Grk8YJcYrY1i7LUZHY257aFQ19cdTAwMDOMY4xcdDo8XHUwMDFmv1x1MDAwNLxcdTAwMDIwljOkW1x1MDAxYSFIJFxcQppcdTAwMTT18/16s1f+VX3feuei2q18iPZcdTAwMTTQ6ydcdTAwMDZcdTAwMTHojYZcclx1MDAxMVNl4IBcYixcdTAwMTJRrURcdTAwMTh5uUGXXG5ZXHUwMDBlM3E0VkBcdTAwMDDowzltXHUwMDE1XHUwMDA1qYcu3CpuOFx1MDAwNdZeTFx1MDAxZjdcdTAwMDQgb1x1MDAwMy2kL4ggRmxmXHUwMDE4U9Gt1oo7Nk9cdTAwMTghPnL4gahcdTAwMGKVtLRcbt1KplO+r48/yd9cdTAwMTY6nOBcdTAwMTOGQ4f+7adcdTAwMTM7vNytP5yt2adS57GYyW2uidtyrzK1eyq0XG6sUVxcSpAskjEjgaPv6uSqtvMrVftycddcdTAwMTSZgMVcdTAwMDfhvOnALp5FXHUwMDAxMlx1MDAwYqfnXHUwMDBiXHUwMDFjzumbPr3wh73dq4rZvStcdTAwMTVcdTAwMGUvoX1+/spmSa91QHVcIimdo/l3M4VBRC8kYEhjXHUwMDE0XHUwMDEyXHUwMDA1tIachVxmouQyXHUwMDEwknNLJ2Q+1VmZw1x1MDAxZlx1MDAwYujM1SzmkElcdTAwMDbKnypv4nXDXHUwMDE4a5xcdTAwMDCZct3L7OK79NZwglx0+k5raPZL93u504uz10z+2olOQ11UmlMmvUhlXHUwMDAzsMb4bSE6qVx1MDAwMSq7cLGVbKt6mDmV+XrhMFx1MDAwMsIno1x1MDAxYVx1MDAwNm/BJ49ccs1cInGRoEC4YVx1MDAxOCilepjLx41t6N1vb5XuXHUwMDFhx7tcdTAwMWL27OC50lx1MDAxZjeHc1x1MDAwNfleT1xcycBe/rh3Udh8655sVKotnlaQj0vLbVpcdConT8X+OXB90GOXlVq/9lxcznWmVESNziRqoEFywrhAhlx1MDAxMtJETsd9wlx0XHRU0KSjhSvc2MBRsFx1MDAxZaktY2OpwZ9qqekrIUVfKea4Yt6mXHUwMDEw33NgJZpS36GJXHUwMDE2sVx1MDAwN9poJUFcdTAwMGL3ncT02eaKh/bS3b5cdTAwMTRcdTAwMWbg8bV4qbqOT6uXL+3e7as83Th43S7082ubveahPlxcen1XSP1TapPiv3tTXHUwMDEwaT1cYixcdTAwMTmntFx1MDAwNtB8pFwi+MPs8kBcdTAwMWKGvEkwUteosoNcdTAwMTX4XHJcboZcbqnxXHUwMDBmvlx1MDAxNJaVisepeHFcdTAwMDZcIm2UY0IrXHUwMDFmkdY8NiHNKWUoXHUwMDExKe2o0szSXHUwMDFi4dF495+L3ed2uZT5iCkvXHUwMDAzm55gOcNsOulcItLh1Pl8b3f38ax+0N6p8Varc/y2d388rSlcdTAwMTfoXHUwMDA2c41Ij8Q6aso1t4HUUilcdTAwMTdryiX62eq96djAlFx1MDAwZp/40JTLQItQq5aVno/reWlhU1x1MDAwZYpcdTAwMTFX5l79NzaWZHOgdGGjv7M+65a3a792r6uv51uVLXXyq3pz1G1Oa3O/iruL0vV5p6NfcvdHuDo/l+f9+ynrvlx1MDAxMteF/kH5rJKtlXqHzZ2TrbXKYetpZ1x1MDAxOTmC/6lMw1x1MDAxMZxcdTAwMGKUsI5xhkBi7VBcdTAwMDLfUURcIopcYvzIUCrcUIOGjjlcdTAwMGKQYThcdTAwMDbAkUVo6zn1X1GEWOgoz0BcdTAwMTGE04PzaF+FOnpcdTAwMDGxXHUwMDE4QebBmCXkXGKFTqdZrFx1MDAxNrp0XHRLQFx1MDAwZSbY4jA58O4+XHUwMDFkVtBVW2zfXHUwMDFlVbpcdTAwMWP22oXsQ26v3+9Oo8yWXG7oldPgvEdOZlB5hlwixCGmxIzZQCs3qGlHrV5p82zafDe9NmvkZc7IqNrSZ1x1MDAxMH7zM6jm8NmIOVx0f2I2uuOGXHUwMDBit1Do/DS3mfvnj/VyXHUwMDE3tfBHXHUwMDAz71UqlSi18l03Qae7zVacQo/tPVJxkrDZlFx1MDAwZY9cdTAwMTOpTmIqnkGbi8rHgTJilVx1MDAxOe/4Rm0nXHUwMDAyYdAyI7lcdTAwMDcxXHUwMDFhYP00ylJcdTAwMDdAXHUwMDFlvULaTk/X0/fN6UAw9DlcdTAwMDdr4JqrVLw4rb5PIVKnLSqYlb5cdTAwMTi6i9V2jsSLXHUwMDFh96Wfhze/7U41XHUwMDBmL15O6Vx1MDAxNZHQ4XJcdTAwMTFuPWVcIl7yXHUwMDEx1o95q0XwXHUwMDFhXHUwMDA0euBcdTAwMWOVUlxmb+v7p2mUiyQzk7m2TeVcIiRcXIpLZSSiXGZcdTAwMDM9LFh937p0zOLDkdJKcFp9W8HI5/tcdTAwMGJk4yU7hEnoayVcdTAwMGaAUYxcXFLXzVCLWlxullx1MDAwNlQ8qpBkof1WXHUwMDFl9FUqwJtpjEbajfLgPOir0GtcdTAwMDJGyoj4LvDer9A3XHUwMDA2fStcdTAwMGKjr9TGMie94DuabFx1MDAxOUZfoYWW82Xs/Vx1MDAxOehcdTAwMWIrp/SKSOji6PtcdTAwMDUw5k2DlkrRXHUwMDAxJ+eOMrCiXHUwMDFin1x1MDAxMX2Pulx1MDAwN9mdXFymVjVcdTAwMTeQfc1cdTAwMWY+lTpZuei2uVx1MDAxMVxccElHsHI07vf+qaHeZ1x1MDAwNplcdTAwMWans1x1MDAxYun+IOA9vmtcdTAwMWXYnVNzVOzq0mvtpbV7+VSOXHUwMDAyrzeiXHJcblx0gVx1MDAxMIJ6wFFjxVx1MDAxMeT8YL484Joy61x1MDAxY3NWjvRiWuWJfLw7L8w+LVx1MDAxZcO2mnIl/WdYo3hcdTAwMTf2aZm1KOZcdTAwMTJST1x1MDAxNDnuv6mrRn97K18pn7VO92Uj35yyei1cdTAwMDJxUVx1MDAxMLfcjITdXHUwMDE3XG7eJkeZXHUwMDEzyYpFhbHUTFx1MDAxMZC3XHUwMDE4XGK5ipqKupBcXGvqzKekJ+Iz6GSKP02txNBKOs9cdTAwMTFcdTAwMTCjXHUwMDAxNKh6XGJXXGaEZXKlRXFa9LK4XHUwMDE2OSepybs33Vx1MDAxOHTsSZCxxlirUm9cdTAwMWS2NGwlVlDplYnK6JLSlffTOmnJ5+LcLuAs/o7OocmpOElA5cBcdTAwMDRCXCLNdFx1MDAwZVx1MDAxY1xiXGI1U1H4dJUgm89cdTAwMTiSXCKI1jhpjlx1MDAxZatFP5T6XHUwMDE3wOgpyCdQmYChhOCtXHUwMDE1ks6sR7JVVjg1hlOSTV2yXHUwMDFmn1x1MDAxNqroYMlcdTAwMWbSkvHdVPBcdTAwMDFcbnzK/CuCWsiaR+qyfls/XHUwMDE1K1x1MDAwMsZcdTAwMTCoXHUwMDEwjoFrZsaiKlx1MDAxMVx1MDAxOZ20XFys3NNLXCJiUD8qoZW2SshcdTAwMTRCZMkpMvOiXHUwMDFlNVx1MDAwNlx1MDAxZaBcdTAwMWWyPedCcaZlR73kRMHESL5lgVx1MDAxNFx1MDAwMlxm9XuzXHUwMDA2wpUs1E1cdTAwMTlcdTAwMTQyNMaRpTlfKVx1MDAwYlo9JNZcdTAwMTSKw7ukraeURVx1MDAwNGhcdTAwMTPRV0R1RDng6E6ucC9cdTAwMDb39MKwh2JsLFx1MDAxN94mUi6SiDvsU1wiXHUwMDA1OfPz9I37I9hZvJzSKyqhi+PUl4TyrSXYZlxcS1RXocKBpVx1MDAxNEL5X1x1MDAwMq9MMVxyXHUwMDA27SrKg8NHMFx1MDAxYqtcXLZcYlJyvG1yUyhG1bFcdTAwMDZcdTAwMWPCrlx1MDAxNSzcx1x1MDAwNElCgFx1MDAxNNOgoFx1MDAxYSpcIoxC7qrwNlx1MDAwNaQ101wibWzhrZOGIXvyI21Cy3pGySvKwlxcPTo/tzdTSmSpf5bt7m9sbF08nK9cdTAwMWS/7lx1MDAwYr5bf/jdqYv3zJWP+8/b7i0rL7O151x1MDAwMnOVzenWjWDyl6Yu+u9eRN99jTOEXHUwMDBiOPJoXHUwMDAwxZXULqzqwlx1MDAwNNoozcjj8Km6c4FcdTAwMDZnXHUwMDA3KTVaS18p0ypkXHUwMDFjq+IxXHUwMDFkiry5i1x1MDAxNr1+Rfzfp8wmdqhcdTAwMTZHX1x1MDAwMX2HXHUwMDExXGZYltzFalx1MDAwM+1xXHUwMDA2XHUwMDFm3FjK4e9LXpxgNMPpT/7tp5P4lG1f3Fx1MDAxZrpy8fWlV1dcdTAwMWK3my+NzqtnrFaM/Vx1MDAxZczMk0qic6xcdTAwMDRcdTAwMWTljek0zVdcdTAwMGKssNS/klx1MDAxYubzmFbmO1x1MDAwNd12XHUwMDBim2/OOGovPi5v3TBT8TmOkvptOC5SPFx1MDAwZprYOGPnjHfly+XbefNIvbypW1G9mGUsOkJcdTAwMTTV0KVkXHUwMDEw/buZwiCiXHRcZiihRymUXHUwMDAxgz7ZuO5cdTAwMDDjgSRcdTAwMTfBWr/urOzhj1x1MDAwNXRmbYbsX62s4Np5h82xhH6n+FhcdTAwMTlcdTAwMWKddJCKPZxdepfeXHUwMDFlTjBC32lcdTAwMGaTiXhS+JBcdTAwMTJcdTAwMWRcdTAwMDKBdlBKbTVcdTAwMGL3Nzbc0pGY5vj8lPNlQ2hcdTAwMTZQ+1x1MDAxY0MhZ4k205OJRpDhXGIw0CpcburLstLvXHUwMDE4/d5cXPzQXHUwMDA00Fx1MDAxYyqA0U7VI+3jbGyOhDJiMDPxXHUwMDBiXHUwMDBlTTS1XHUwMDE0nEfz041cdTAwMWYyXHUwMDE2UNd4i86AkdRcdTAwMTRt9MczWlx1MDAwZZqbXHUwMDAzMj9NSdEwcb1YyX9fLyz0w/VcIqZ+ynjkl2SJXHUwMDE5yVx1MDAxNLoq1MZVXHUwMDE4aUNzJsc+VTIpPfd7zlA+318g+vdgKmd7J687rbZrX5bz7UL2qv9cdTAwMTRFS3+XIadcdTAwMDOFXHUwMDA0iI7fKEEnXHUwMDE0XHUwMDEw4Fx1MDAxY0TAkOBcdTAwMDDN4DHWN4FnlT82XHUwMDFmOMb0OpjlQFlILpT29lx1MDAxOVx1MDAxYe1NXHUwMDExjffRcepoaCGl9LFKpfjqmk/n2V75UNev20/Hrjdl7e9fSetenOZz/Pgmc/Z6le2i8l48wtZbXG7rPnX59vHzXHUwMDE2/mhxo4GMrnBgzd1060ZAL8JcdTAwMTClXHUwMDE1XHUwMDEyhv7yQv5N/7Khe63+w3HpceP+PqOvXHUwMDBlX/n0XHUwMDAxXHUwMDAyQCmhkmMr6SCJ2XCEgDNcYui0nFx1MDAwYk3Hrp78/FWEIFx1MDAwNYWfuulBwtBcdTAwMDfhuGL+/uTAo7HCz1xiXHUwMDAxVbgqkHMlu81cdTAwMTkheOPP21x1MDAwN+I5f3D9cNe7avDqxtXJ1rSa+VVIktnY39i1me2ng5tm++CyqK7bmdNl1Hj/3YtovCfEz1x1MDAxZI1cZrJcdTAwMGWVXlx1MDAxYcsshJRcdTAwMWQtumaUXHUwMDAwXHUwMDAzfmWXqOvCOc1cclx1MDAxMl06I4jq/Mqqxyr5LO1cdFCdXHUwMDA1Ym5Mn8CoxzPMXGJTVjEtUlx1MDAwZmrMLMBDefyIXG6UX1pLXHUwMDExzJhgMMPBjPFtp1x1MDAxM8TYztz1mp1fzYObl2v3Jjb4XHUwMDAzbz9OW9ZhSFx1MDAwYlx1MDAxNaMzeW2lVeN9yChcdTAwMTGWZlx1MDAxN1xi1G5rha+h74qVz6e/MVxyXHRmYOVcdTAwMDIoSdFxn1ab+Fx1MDAxZYOA6ixopkHqRVx1MDAxZFx1MDAwYti8RFu6W147es5e7/Zlq9c7OIHCY1H0ltGWJt+AxHCiZCYwyjht/MyZQ6CR+3Jcco6DJzNGyoBq0lxyoFx1MDAxZHVKe7pcdTAwMDHKgFmGfrdDc41cZpuvUlx1MDAxMeNUc/G6VuDgnODGe6hu4jNkqOJeOjnf0LQvsbcpN1x1MDAxNYiRUnpF5HO4WkSLp1xm/CVcdTAwMWLnXHUwMDFm81x1MDAwNf604I6KbzVljVx1MDAxYTaW9I1WXHUwMDBmPVtixILKR9HhjVx1MDAxNrvMmJVY1Xvbp63SwW1po8CeXnLtXHUwMDAznSstelxy0cpcXOqBXGZWME19woAlXHIoWrawZOUkXHUwMDBiz53ObqXcfdt84k/1tb21+pT8x4KifshMgdb4ZzZ+jMO5soGm7CU3XGJdXHUwMDBl1XLVpzFdyK0uXGa5nFx0yVx1MDAxOaU2+JxcdTAwMWNcdTAwMDaxTo7DJyMlm+tcdTAwMDBn3p7L10/5jOpvXHUwMDE3tlu/9l2/03ouy53fXHUwMDFko7woZY5zO5nLcn7vtPpwdefg4lx1MDAxNJaRZfnvXkTfo1x1MDAxMVx1MDAwYseopEPQOGWgXHR8OqTsXHUwMDA2lVx1MDAxZLihKlx1MDAwMlx1MDAwYuCi2m7eXHUwMDFiKmpcdTAwMGXKcjr1iir7yuOJ1fFcdTAwMDe/jvtcIlx1MDAxNmg3kecyiJ4tvCuzilNmlDM9YFx1MDAwZktDoP5cdTAwMGVYXFzsbuVH4mq/L2IxwVxchiNcdTAwMTahfadcdTAwMTOySMaaREeJKYmOklx1MDAxMMSUkUeGWitz7lx1MDAwNkdcZkpcdTAwMDNFM4TnXHUwMDE4XHUwMDExzTHqN75cdTAwMThcdTAwMWFlwaUnemHoLJJcdTAwMDN+yqhcdTAwMGVs5PB/pdPjOl1b2G6jz2vxTntbp3KbUKzqlCNHYmlcdTAwMTQ93TGolO7HaaKkQFKptFxuJV2QXHUwMDFiXCKM1YzqKSTqxKRcdTAwMDXjxX6wYETiI/x/ZucrXHUwMDE5Z0ZcdTAwMWOXaqNTLZWn9FxcnGPvRH0w5USFvC+Fm0e/S6BcdJBGOVx1MDAxYrmKPzHtYu9l15xuXHUwMDFlvvyqXHUwMDE3XmWuXFxoXHUwMDFmb1Y8w9r8jeiBXHUwMDA1zFx1MDAxOFxyNPRcdTAwMDVcdTAwMWZ9OO3UoW9iXHQqXHUwMDAxZVxyomhJUvM+ym3g3VxmvcaRfmma8HhcdTAwMTXsTYLJ+sIwXHTKoH4q6Z0oY3R8i2lcbqjwb/Vu2puVZub07dfR5f7aRftpJ3/Qqkzt3SxhZkdcdTAwMDRcdTAwMDC/1LtJ3mhcdTAwMTI10pbaXHUwMDFmSsWcQFx1MDAxZkeJcCxD6MBcdTAwMGXKsbRV1L0sSo2EQlx1MDAwNFx1MDAwNYcwQZ28nPFFkVx1MDAxZLpAXGKtwlx1MDAxYVx1MDAwN1ZxLldKXHUwMDFmp/Q7i2u91NpcdTAwMWHttDfzSsdcdTAwMGWfXHUwMDAxRomH82ZeLT89Mlx1MDAxMGj017myXGY5gDRj7EjygEJ2lIwqhLWT1oqX+sFiXHUwMDExeV+cXHUwMDE5JVx1MDAxYvRcdTAwMWZz5qNSRN2hlaCqSlxyY1x1MDAxN5FOffzXXHUwMDEwOlx1MDAwNkjVkHhaSy21XHUwMDFk5yFKJzlcdTAwMTWKUziGml1cbpfUM3LZmFuyMUvEciNcdTAwMDNcdTAwMTiE5J0ldlx1MDAxNlx1MDAwZVWBXHUwMDBinJRSXHUwMDE54sBCRUNVXG5cdTAwMDXXOcO4kFJoJjzJNYzMXHUwMDAxKrVcdTAwMTLU8Vx1MDAwNpdcXLm5sVC+eH2BQV9OKv883lFIjZxcYqI+o4uc9oyQZUHyWDlcdTAwMWT8dERCv1x1MDAxMXxnc0vt++xcdTAwMGU0JohlLoxhUtHMVWNcdTAwMThcdTAwMWFzmdiseyok/pJzTeFAOiUpedNpaUJcdTAwMDZk7FPhaTm8vCjs90dcIijsmb8kaGRcdTAwMGI+V0Oj3KSNlCxQXHUwMDFmdsG1XHUwMDEyXGYtro56zy6QwjlrXHUwMDEwydFcIsNqZMtMoNvwY643w1ErJ62UXnTVNp4nO1x03FAgbWnQ9e/zgn8tw1nBhNBT+KxgZM/pnFx1MDAxMyQnP0zqWK154Fx1MDAwNFxiISi0XHUwMDE5OidcdTAwMDA3qDNDz1xuldc3qGVcdTAwMTX5SkWJm1x1MDAwYlx1MDAxMyc6XHUwMDA3VGMqOlRtK2NPXHUwMDAyObNcdTAwMDLQ1qbZu3pS5Gt956Caz/O1t3x/s1xiXHUwMDA3/dPzh8buN1RcZiSu+8dkT/rv3lx1MDAxNHZcdTAwMWGUQ0usLKoy/ks0O2yoVSBcdTAwMTm6mMgxgTtPq23koCtDPbeOt2Yw1ETmaWiFN2k5PoyN5NNcdTAwMDCXZq42jV9rqP+9XGaGeoKhXGZcdTAwMWLqf6dtqJNBJvFAX1x1MDAwYotmVIEwNG2Aq3Cog+tAaYU6rKXjylx1MDAxM+pwXHUwMDEwXGbmqKNvgoLFhScrXHUwMDA3dy/RiDjFaZiK0atQR6wyLz5tXHUwMDAyXXWwTHpTd6I9qT/7p3BhnZkv9Tmxj8KyRDpixZReUVx1MDAwMVx1MDAxZC5cdTAwMTexwlNGOr4rc5iGqzFuXHUwMDE553h905+5x207uZwptW2rQTExlVx1MDAxM1x1MDAxYpvcoGHZ4lx1MDAxOcnF5ElYq1x1MDAwMKFcdTAwMTZBVGtNQ+N0uNiLPjacaTdo0zBUmb+RdtAyXHUwMDFiRVdcdTAwMDNcdTAwMDMrjPJcIi3+uOLWOUGtz9UwP36FtD/Gkba9MNKCQtbrkPJ6m1Ul9HFcdTAwMWJcZnHS82VcdTAwMDX8XHUwMDExYFx1MDAxYiup9IrK6OJgm9xcdTAwMWIlPdRCMyko8Vx0bzU6O/8/+srYreNzVyy/nJ5nTLcty7fFzsa0XHROQJ3zOGNcdTAwMDJcdTAwMTDKXHUwMDA3XHUwMDA0cVxm0yydXHUwMDE0U4d3sJrmPkQxbVx1MDAxNedJXHUwMDA1zDpcdTAwMGKDmXVSXG5cdTAwMGLRwlXyXGZFbFxi11x1MDAxOWYokDdXXHUwMDFm2s/dzVx1MDAxNOa56K51mF43943L+57OvN7012/NtOGY2nl+r9PIXjeku7oxpdvqXjt/Pv5b5lx1MDAwYvNcXO3c5o5O39qn7dylMrv14tZxalx1MDAxM9VcdTAwMDQ1bFx1MDAxYbreXHUwMDBihXmSb0By7jdyaO60Q+9C27E2mSTGXHUwMDBlkUBcdTAwMTN/oV5kljFPNqNcYpzUjln0Jp1wnoFcdTAwMWRoLlx1MDAwMkPTY9GoOuO0XvXci9X4XHUwMDE0eu7RrFx1MDAxZDTD4O09bWP5XHUwMDBimj89nlx1MDAxNZVWz72ZXHUwMDA1/WvoSyZOUukl0GKhXHUwMDA2IH1HriW0XHUwMDE1auJyVOWIaoNOJzJcdTAwMWXlRkY80Ssq9IvzoWSbPidcdTAwMWZiNNnZ0vBcdTAwMDFLl/9cdTAwMDXjvE9cdTAwMGUqh7dZu8shd1p5btZf9GEzv+i2abw8epooYlx1MDAwNlx1MDAxNOJWZKIsKDqD5FSZXHUwMDA2f9Qob78ljGC5J2RcdTAwMGZcdTAwMDJcdTAwMDKnjGYolYNh3uO0zZqAmpFYh8yOjU4k+8xvXG6kcVx1MDAwZVfgXHUwMDExarZcbtlPXHUwMDA2765cdTAwMWa7vVxykYU01ngh2jNQdnj8Nuh9KebrMpImXHUwMDE1XHUwMDE5SuNH8DtYhoD9XHUwMDA0nydcdTAwMWOwXHUwMDFm2XNKXHUwMDAx+0S6mMjCOFBuokKdZVx1MDAxNH9cdTAwMThTXFyUTVx1MDAxOVx1MDAxOEtONVx1MDAwMFx1MDAxZNtGNZdcdTAwMWHGKmBcdTAwMDZcdTAwMWYjSNRdT5I5MFx1MDAxZOA3KERB2b3OrnqVxCny88IkTNOMebrRXHUwMDFlXHUwMDA15ya237miKlx1MDAwM6RcdTAwMGLpz01bXHUwMDEyXHUwMDBlxk1gKelNo61Cz9TpMbOdMVRYXHUwMDA1XHUwMDFjzY9VSnHDJ62XXHUwMDExKNSUoU1cdTAwMDVXXGZCoZ1MVOZcdTAwMTcnYV/CZqxcdTAwMDDggiGdXHUwMDE0llx1MDAwNvz8lfBpYlx1MDAxZpGpXGLZl/DIaFxcjUmFeoBcXNpoziVXSadcdTAwMTjfNNqyfqOKR792j2Tv5ZconW+1S51sJYrQ3qiY41x1MDAwMl1hXHUwMDE0I8RqlGEx3ppcdTAwMTGfkFx1MDAwYoyga5ZMXHUwMDFhz0DfVUwsXHJs7i2MzVx1MDAxNr0yJq23xVx1MDAxYoCLTX6ifo/U0e87XHUwMDA3tVx1MDAxY++1X7ZfXHUwMDFh9c399a32XHUwMDFi33i+2NvfmDZ6pSv123Zv54bbrYPejiuL8t15XHUwMDFhk9aOTmGn2ixmelx1MDAwNf26+dp63H3rn3dTWPel+nBxtV/K9V77lVx1MDAxYuuqvXz/Nq32rqidYqSyebFom/+pTOGhOSVcdTAwMDIp0Fqhi2XRzIVcdTAwMTBEqkBJsIbmQGnu6ZWyctBcdTAwMDbvzotcdTAwMWR9P3b4c6rYILDgb9ZcZizeR0NiY7VRabtoM8vvcrpoXHUwMDEzXGbwl7toXHUwMDE3qmZcdTAwMGVvqvu6kn06XVs7ezzqdz05Vf5jMWlUXHUwMDAwXFyiXHUwMDE3ZlxmumlDXHUwMDE5eFx1MDAxN1DHXHUwMDAzRvV01kmOvn2UXHUwMDAycKRcYk4z6mtcdTAwMTbVW1xygVxmf7hS4HFcdTAwMDV+SSE6LqhVvvWf7lx1MDAwM8SOpFx1MDAwMUaNm9G7/sYm7Fx1MDAwZrXc2nlui+Vf25tXuZeza9i5X5/Wmna6kIWrVjvLM+Vr1WK3L1x1MDAxNzfFXHUwMDE0rPRx+3J/57n2sGZld409vHXZ4+6Uqc+J696dXT53XHUwMDBl1G2+7cpcdTAwMWJdtfVr9/D81zKetfmfylx1MDAxNNZcdTAwMWZcdTAwMTTnXHUwMDFmYVx1MDAxYeGs0iZcdTAwMDQgQH1FXHUwMDA0aCFcdTAwMDRuOmr9XHUwMDAxnV1JXHUwMDE51cYhObA+XHUwMDEwWVx1MDAxOf9Y7HidITor1ftIQFx1MDAxZkaweFx1MDAwZkFcYur2mb7tXzw820FcdTAwMTNdaGc+olx1MDAwMMtAXHUwMDA0Jlx1MDAxOOIwXHUwMDExiLuAdFjB/lM/k2vsXFyt7zxlzdHhw9Vd9vV5WlbgXHUwMDE0o36mgI9K0ZSVXHUwMDEwq2eCU2qUXHUwMDE0XFzhg1Q6Slx1MDAwYlbt3udU6bfF6Vx1MDAwMGXAXHUwMDBiYbxcck55/KBm6mxcdTAwMDHUVDzFXHUwMDE2QO+i2HspXdzt13OHXHUwMDFkVn/rZTNcdTAwMGaVQ5VGKstcdTAwMDJm+3vNa/Jcckg+REFV44b8Y6aYk+H5kUxQL1JJ8WKKPKtoyZJhhurKKfdaSrw0Xy/SwHHDaGgpYzQ1adWqJ0Y7XHUwMDE1W1xcO1x1MDAxZEPOZIy/j6GJ7+/gtDKkofPkr/1cdTAwMTHnKLGCSq9MREaHy0V0+XeeeiBcdTAwMTVcdTAwMTaUcmtcdTAwMDUlJcBY/lxmdU93mjtcdTAwMDegOZIuY5LaI0x17JFs5ee9hsixh0DurvXgiEDihSWlzyxb6kmykUjEXpJII6xWgFx1MDAxY4dBxLfhXHUwMDAyb1x1MDAxNVxyqeNWj847XHUwMDFkXHUwMDA2R1xivJmxlilpNcP/RMHXuoBcdTAwMDZcdTAwMWRQ21xihX7Q6lx1MDAwNDtcdTAwMGV7+cLYS8NkrTTeijO8+bHQS1x1MDAxZDxcZrdzXHUwMDExoz9cdTAwMDJ6LVx1MDAwZqhcdTAwMWVcdTAwMWHVnnMhXHUwMDE0XHUwMDFia66TodT4QTm0sJJzayZ2SotcdTAwMTf7wXphiV9cdTAwMWPJk1x1MDAxZK9cdTAwMWZz9epcdTAwMDHqOEZpJ85wXHUwMDFhW8zDndJcdTAwMDBcdTAwMWPXiIWSa0pcIv5DkJyBXHUwMDAzXHUwMDFhu6lcdTAwMTRcdTAwMWFRSzM2/yAsZ9frqvOg7HqzepPhR1x1MDAwN9ft3UdPRZvfp1x1MDAxNVx1MDAxMuVOklxyU4OIRtindXwwvpryjFx1MDAwNYwkX65Ou9PFcZFcdTAwMDKHXHUwMDA2alx1MDAwMiidP+Bt4uvZJFxyjVx1MDAxZVx1MDAxYjL55Vx1MDAwMW9rzHm+tl2zhZ38dn7zrLy1k1G/O+D9x1x1MDAwNKaTb0Cy5zxIzDKGc0a9wHVI3bVGv1rTrHrHOfc09qHQtdSaZlMzpOzG01x1MDAxOVGJXHUwMDAwlKFcdTAwMWHBQeTEqpXnXHUwMDFjq/UpVIGoQYSKe1OMhYmt/KJcdTAwMDb56GrNlePyR9A3QTlcdTAwMTRcdTAwMDaoXHUwMDAzKrJbYcfom2SDdEHg9I9BL05PWi5W8OlcdTAwMTVcdTAwMTX5xenb16RcdTAwMWbS5Vx1MDAwMnXqXHUwMDFkuGdjXHUwMDE0XHUwMDE0b4lFtafyL/TTKW1z4fFrydQkNfqGsqyJqtNgXCLmRNK2l428+VxyYVx1MDAwNMo9Z4zCOJRhxHFLcVx1MDAxM1x1MDAxNapcdTAwMDFBcbVcdTAwMDFD0ddcdTAwMWGfJIl6XHUwMDA0ylc5RoN358VuOUOOXHUwMDEx5XlZpGdeasZsfC6C49SjgKXduOn/S1x1MDAxZMhcdTAwMDTX58uTjJJcdTAwMTlj8sha4IGh+KHQlk4yQkxcZp3rQCrHQTvGtPC0XHUwMDEzQapG6UnUWl3ReILhXHUwMDAyIz2qkVx1MDAxNtBcdTAwMDRcdTAwMGJcdTAwMTBOSiNgRcVi1VktzsTwWZJaRas+6ENcdTAwMWKbSFxiQFFcdTAwMDcu52qj+kdQsVhRpVfGI6WLs6epmcdsjarpiFxulGBIumm+1DhcclGgqHDP0qRpxoxblD19RVx1MDAwMI9iXcRcYiw1dFx1MDAwNC6Uk+HTXHUwMDE4Q93kXHUwMDA23Vx1MDAwMq2R/E/qVZ2cXHUwMDA3n1x1MDAwNMconFx1MDAwMaItMktcdNKMtvZ5R2OlqMZbXG6hyVx1MDAxY3uKPlB2XHUwMDAzZqlcdTAwMDVcdTAwMWZKsKJxQ1E4XHUwMDA2lFx1MDAxZlx1MDAwYkZZaYXDZUZaXGat0HhcdTAwMWONdVxu4TApwZGoe9DYRSD6XHUwMDEzjLWlrG4m01x1MDAwN+P5XHUwMDEzu9NcdTAwMWQjXHUwMDFlK6mDTyMyujhcdTAwMTZcdTAwMWa+Xm7tl/ZcdTAwMWVv7dP51VUmm+lcdTAwMWTsXHUwMDE1fTg2i1x1MDAxN4g+OFx1MDAxM1pKRnHpKFx1MDAxNKfQzSA5g33ObXNcdTAwMGJMcemsXHUwMDEw+Fx1MDAxMNDczbTvZVx1MDAwM9zkXHUwMDAyoUTApelcdTAwMDBWg0RzJCSS4HHARcNcdTAwMTQwLpxDimw4eM5cdTAwMWTwoVx1MDAwN+je0tBqR133RuJfw0mkXGZ/h5VuMF/cjVx1MDAxNoKt8HZcdTAwMWNvzeJ4a1x1MDAxNDWM85fRiHhcdTAwMGaXXHUwMDFhzFG4Kf045LLgLXpy3FjqmGeoXHUwMDAzr1x1MDAxZa9cXNYykFx1MDAwZVx1MDAwNFx1MDAwMzeYjS3MxPViXHUwMDA1f7BeROZcdTAwMTfH7/M71i+vb1/3rvdvbEGvX57cP+TSj+IhsZaS0/mxRrNjXHUwMDE2Pjv+XHUwMDEy/PY0XHUwMDE1JCdeg2HUXHUwMDEwVcg/XHS+k+swk+DbWVx1MDAxYnBGp1x1MDAwZYDPzITaWFB7XHUwMDFhZVE4XHThreOeXHUwMDFhaVx1MDAxYf5i8K45hjfPcs+pMZ08W7CUNia1YmpcdTAwMDXeceBtXHUwMDE3XHUwMDA2b1xuP4ixUMFI+qWOPTlG7JFM2y9cdFxcoEpccu/Mb8NuXHUwMDEzaG2kkdRZWjM5XHUwMDBltcpcdTAwMDZOME3HaJSeOZa46F8vVuxcdTAwMDfrRSR+cej+XHUwMDEyXGZEzVx1MDAxNmhguFFcblx1MDAxZKzQXHUwMDE50izMe6n7qlx1MDAxZfff1FWjv72Vr5TPWqf7spFvTtnjXHUwMDA3rUCAXHUwMDBllORcXHOKXHUwMDE3hFIktVx1MDAxNoFCx8VZdFCFXHUwMDEy0VaL4ESgKa2X2vBcdTAwMGUmaHqiXHRM0vmPcOhcdTAwMDXhKlx1MDAwZVZd+eNcdTAwMDDSLc5uJdB5MfOOyFx1MDAwMogvXHUwMDFmUVYjlMn0e0VcdTAwMDOnaXi/P7aLkkq5jFxm98RcdTAwMDHGu1xuZiw6edTPXG4xXHUwMDAxiaoyYtJq8YI/WC8q89NDZFx1MDAxOE4mg+fxXfPA7pyao2JXl15rL63dy6fyouBcdFxcKqFQ84VlzI2T92/1/9+h71x1MDAxZlx1MDAxZnfsZ6HVOumihH3ej5+9arm/XHUwMDFlxYX/ulx1MDAxYrwo+WmwMcKE8kCd/vOP//xcdTAwMWa3nK5hIn0=refref$selfTable Aliaspath-segmentpath-segmentstructured-elementassociationTODO: Better namesinfix-filterinfix-filterexprWHERE[]..scalar-element. \ No newline at end of file From b92f9f54f0a8406ac9a57733bc1a919c8a54315c Mon Sep 17 00:00:00 2001 From: Patrice Bender Date: Fri, 19 Dec 2025 10:16:56 +0100 Subject: [PATCH 42/47] add cql-draft and resolve minimum todos for merge --- assets/cxl/function-def.drawio.svg | 110 +++++----------- assets/cxl/intro.drawio.svg | 10 +- cds/cql-draft.md | 92 ++++++++++++++ cds/cxl.md | 194 ++++++++++++----------------- 4 files changed, 206 insertions(+), 200 deletions(-) create mode 100644 cds/cql-draft.md diff --git a/assets/cxl/function-def.drawio.svg b/assets/cxl/function-def.drawio.svg index 81bbb3c00f..e1379c1424 100644 --- a/assets/cxl/function-def.drawio.svg +++ b/assets/cxl/function-def.drawio.svg @@ -1,137 +1,91 @@ - + - + - - + - - + + - - - - - - - - + - + function name - - + + - + - + ( - - + + + + + + - - - - - - - - function args - - - - - + - + ) - + - + - - function + + expr - + - - . + + , - - - - - - - - - - - function - - - - - - - - - - - + + - - - - - - - - - - function name - - + + - - + + \ No newline at end of file diff --git a/assets/cxl/intro.drawio.svg b/assets/cxl/intro.drawio.svg index 29440dfae8..8383fa431e 100644 --- a/assets/cxl/intro.drawio.svg +++ b/assets/cxl/intro.drawio.svg @@ -1,9 +1,5 @@ - - - - + + @@ -69,7 +65,7 @@ - you start here 🫵 + start here 🚀 diff --git a/cds/cql-draft.md b/cds/cql-draft.md new file mode 100644 index 0000000000..7348a2f24d --- /dev/null +++ b/cds/cql-draft.md @@ -0,0 +1,92 @@ +--- +# layout: cds-ref +shorty: Query Language +synopsis: > + Specification of the CDS Query Language (CXL) used to capture expressions in CDS. +status: draft +--- + + + +# CDS Query Language (CQL) { #ql } + +::: info this is a draft and contains some samples which were taken from the CXL docs +::: + +# Sample Collection + +## function args { #function-args } + +
+ +
+
+ +### aggregate function with ordering term + +::: code-group +```js [CAP Style] {4} +> await cds.ql` + SELECT from Authors { + name, + string_agg(books.title, ', ' ORDER BY books.title DESC) as titles + } + GROUP BY books.author.ID` + +[ + { name: 'Emily Brontë', titles: 'Wuthering Heights' }, + { name: 'Charlotte Brontë', titles: 'Jane Eyre' }, + { name: 'Edgar Allen Poe', titles: 'The Raven, Eleonora' }, + { name: 'Richard Carpenter', titles: 'Catweazle' } +] +``` + +```js [SQL Style] +await cds.ql` + SELECT + name, + string_agg(books.title, ', ' ORDER BY books.title DESC) as titles + from Authors as A + left join Books as books on books.author_ID = A.ID + GROUP BY books.author_ID +``` + +```sql [SQL output] +SELECT + "$A".name, + string_agg(books.title, ? ORDER BY books.title DESC) AS titles +FROM sap_capire_bookshop_Authors AS "$A" +LEFT JOIN sap_capire_bookshop_Books AS books + ON books.author_ID = "$A".ID +GROUP BY books.author_ID; +``` +::: + + + + + diff --git a/cds/cxl.md b/cds/cxl.md index b50f9b870a..a9e605eae7 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -2,7 +2,7 @@ # layout: cds-ref shorty: Expressions synopsis: > - Specification of the Core Expression Language (CXL) used to capture expressions in CDS. + Specification of the CDS Expression Language (CXL) used to capture expressions in CDS. status: draft --- @@ -26,8 +26,12 @@ import setsExpand from '../assets/cxl/sets-expand.drawio.svg?raw' import sets from '../assets/cxl/sets.drawio.svg?raw' -# Core Expression Language (CXL) { #expressions } -The Core Expression Language (`CXL`) is a language to express calculations, conditions, + +::: danger This documentation is a work in progress and will change over time. +::: + +# CDS Expression Language (CXL) { #expressions } +The CDS Expression Language (`CXL`) is a language to express calculations, conditions, and other expressions in the context of CDS models and queries. **`CXL` is based on the SQL expression language**, so many syntax elements from SQL are also available in `CXL`. @@ -97,6 +101,12 @@ The following diagram illustrates how to read the diagrams:
+### theoretical background + +CAP did not re-invent when it comes to expressions. +It rather builds upon well-known concepts from relational databases and SQL. + +In the [final chapter](#foundation) of this guide, we provide some theoretical background. ## expr { #expr } @@ -114,11 +124,17 @@ select from Books { } ``` -### syntax -
+
+ +
+
-TODO: some text and more examples +TODO: Some samples --> Where can we use expressions? + +- annotation expression +- calculated element +- one in select ## ref (path expression) { #ref } @@ -243,7 +259,7 @@ A path expression can also be used as part of the where clause to filter based o [ { title: 'Catweazle' } ] ``` -```sql +```sql [SQL] SELECT Books.title FROM @@ -326,60 +342,6 @@ WHERE exists ( ::: info 💡 Learn more about the `exists` predicate [here](./cql.md#exists-predicate) ::: -### theory of path expressions - - - -Every entity defines a set of all possible instances: -$${ b \in \text{Books} }$$ - -A simple select query on Books returns the complete set → all books. -Filters progressively narrow down the set: - -$$\text{highstock} = \{ b \in \text{Books} \mid b.\text{stock} > 100 \}$$ - -With the infix filter notation, we write it as `Books[stock > 100]`. -An association defines a relationship between two sets: - -$$\text{books} = \{ (a,b) \in \text{Books} \times \text{Authors} \mid b.\text{author\_id} = a.\text{id} \}$$ - -We can select this set using the path expression `Authors:books` in the [from clause](#in-from-clause). -The same can be applied to navigate via a path expression in the [select list](#path-navigation) or [where clause](#in-where-clause) using `books`. -Filtering authors by `Authors where exists books[stock > 100]` can be expressed as: - -$$\\{ a \in \text{Authors} \mid \exists \space b \in \text{Books}( b.\text{author\_id} = a.\text{id} \land b.\text{stock} > 100 ) \\}$$ - -Using the previously defined $\text{books}$, we can simplify it to: - -$$\\{ a \in \text{Authors} \mid \exists \space b \in \text{books}( b.\text{stock} > 100 ) \\}$$ - -Using the $\text{highstock}$ set, we can further simplify it to: - -$$\\{ a \in \text{Authors} \mid \exists \space b \in \text{books} \cap \text{highstock} \\}$$ - -So in conclusion, the expression filters for the intersection of the two sets $\text{books}$ (via association) and $\text{highstock}$ (via infix filter). - - - - - -
-
-
- - - - - -
-
-
- - -
-
-
- ## infix filter { #infix-filter } An infix in linguistics refer to a letter or group of letters that are added in the middle of a word to make a new word. @@ -832,11 +794,15 @@ TODO: Remove for first version? 💡 string and numeric literal as well as `?` are parsed as `ref` -## function { #function } +## function { #function } + +
+
+
+ -TODO: some text CAP supports a set of [standard functions](../guides/databases.md#standard-database-functions) that can be used in expressions. In addition, functions are passed through to the underlying database, allowing you to leverage database-specific functions as needed. @@ -869,53 +835,6 @@ CAP standard functions: -## function args { #function-args } - -
- -
-
- -### aggregate function with ordering term - -::: code-group -```js [CAP Style] {4} -> await cds.ql` - SELECT from Authors { - name, - string_agg(books.title, ', ' ORDER BY books.title DESC) as titles - } - GROUP BY books.author.ID` - -[ - { name: 'Emily Brontë', titles: 'Wuthering Heights' }, - { name: 'Charlotte Brontë', titles: 'Jane Eyre' }, - { name: 'Edgar Allen Poe', titles: 'The Raven, Eleonora' }, - { name: 'Richard Carpenter', titles: 'Catweazle' } -] -``` - -```js [SQL Style] -await cds.ql` - SELECT - name, - string_agg(books.title, ', ' ORDER BY books.title DESC) as titles - from Authors as A - left join Books as books on books.author_ID = A.ID - GROUP BY books.author_ID -``` - -```sql [SQL output] -SELECT - "$A".name, - string_agg(books.title, ? ORDER BY books.title DESC) AS titles -FROM sap_capire_bookshop_Authors AS "$A" -LEFT JOIN sap_capire_bookshop_Books AS books - ON books.author_ID = "$A".ID -GROUP BY books.author_ID; -``` -::: - ## ordering term { #ordering-term }
@@ -952,16 +871,61 @@ In this example, the ordering term sorts books by price in descending order and ## type-ref { #type-ref } - - ::: info 💡 learn more about type references [here](./cdl.md#type-references) ::: -## subselect { #subselect } +## Scientific Background {#foundation} + +Every entity defines a set of all possible instances: +$${ b \in \text{Books} }$$ + +A simple select query on Books returns the complete set → all books. +Filters progressively narrow down the set: + +$$\text{highstock} = \{ b \in \text{Books} \mid b.\text{stock} > 100 \}$$ + +With the infix filter notation, we write it as `Books[stock > 100]`. +An association defines a relationship between two sets: + +$$\text{books} = \{ (a,b) \in \text{Books} \times \text{Authors} \mid b.\text{author\_id} = a.\text{id} \}$$ + +We can select this set using the path expression `Authors:books` in the [from clause](#in-from-clause). +The same can be applied to navigate via a path expression in the [select list](#path-navigation) or [where clause](#in-where-clause) using `books`. +Filtering authors by `Authors where exists books[stock > 100]` can be expressed as: + +$$\{ a \in \text{Authors} \mid \exists \space b \in \text{Books}( b.\text{author\_id} = a.\text{id} \land b.\text{stock} > 100 ) \}$$ + +Using the previously defined $\text{books}$, we can simplify it to: + +$$\{ a \in \text{Authors} \mid \exists \space b \in \text{books}( b.\text{stock} > 100 ) \}$$ + +Using the $\text{highstock}$ set, we can further simplify it to: + +$$\{ a \in \text{Authors} \mid \exists \space b \in \text{books} \cap \text{highstock} \}$$ + +So in conclusion, the expression filters for the intersection of the two sets $\text{books}$ (via association) and $\text{highstock}$ (via infix filter). + + + + -TODO +
+
+
+ + + + + +
+
+
+ + +
+
+
-In a few places, full subselects can be used, for example with `exists` and `in` predicates. A subselect can use the full [CQL](./cql.md) syntax. - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- Authors -
-
-
-
- - Autho... - -
-
-
- - - - - - - -
-
-
- [ age >= 40 ] -
-
-
-
- - [ age >= 40 ] - -
-
-
- - - - - - - - - - -
-
-
- Books -
-
-
-
- - Books - -
-
-
- - - - - - - -
-
-
- Authors[ age > 40 ] -
-
-
-
- - Authors[ age > 40 ] - -
-
-
- - - - - - - - - - - -
-
-
- select from Books -
- where exist author[ age > 40 ] -
-
-
-
-
- - select from Books... - -
-
-
- - - - - - - - - - -
-
-
- Authors[ age > 40 ] -
-
-
-
- - Authors[ age > 40 ] - -
-
-
- - - - - - - -
-
-
- Books -
-
-
-
- - Books - -
-
-
- - - - - - - -
-
-
- select from Books { -
- title, -
-
- author[ age > 40 ].name as author -
-
- } -
-
-
-
-
- - select from Books {... - -
-
-
- - - - - - - -
-
-
- no matching author -
-
-
-
- - no matching aut... - -
-
-
- - - - - - - -
-
-
- matching -
- author -
-
-
-
-
- - matching... - -
-
-
- - - - - - - -
-
-
- { title: 'Wuthering Heights', author: null }, -
- { title: 'Jane Eyre', author: null }, -
- { title: 'The Raven', author: null }, -
- { title: 'Eleonora', author: null }, -
- { title: 'Catweazle', author: 'Richard Carpenter' } -
-
-
-
- - { title: 'Wuthering Heights', author: null... - -
-
-
- - - - - - - - - - - - - - - - - - - - - -
-
-
- [ { title: 'Catweazle' } ] -
-
-
-
- - [ { title: 'Catweazle... - -
-
-
- - - - - - - - - - - -
-
-
- select from Authors[ age > 40 ] { name } -
-
-
-
- - select from Authors[ age > 40 ] { na... - -
-
-
- - - - - - - -
-
-
- [ { name: 'Richard Carpenter' } ] -
-
-
-
- - [ { name: 'Richard Carpenter' }... - -
-
-
- - - - - - - - - - - - - - -
-
-
- Authors -
-
-
-
- - Authors - -
-
-
- - - - - - - -
-
-
- Books[ stock > 100 ] -
-
-
-
- - Books[ stock > 100 ] - -
-
-
- - - - - - - -
-
-
- no matching books -
-
-
-
- - no matching boo... - -
-
-
- - - - - - - -
-
-
- matching -
- books -
-
-
-
-
- - matching... - -
-
-
- - - - - - - - - - - select from Authors { - - - name, - - - books[stock > 100] { title } - - - } - - - - - - - - - - -
-
-
-
- - { name: 'Emily Brontë', books: [] }, - -
-
- - { name: 'Charlotte Brontë', books: [] }, - -
-
- - { - -
-
- - name: 'Edgar Allen Poe', - -
-
- - books: [ - -
-
- - { title: 'The Raven', stock: 333 }, - -
-
- - { title: 'Eleonora', stock: 555 } - -
-
- - ] - -
-
- - }, - -
-
- - { name: 'Richard Carpenter', books: [] } - -
-
-
-
-
- - { name: 'Emily Brontë', books: [] },... - -
-
-
- - - -
- - - - - Text is not SVG - cannot display - - - - \ No newline at end of file From 932c4244173da6e9a3431b0564612db9efcc1375 Mon Sep 17 00:00:00 2001 From: Johannes Vogt Date: Fri, 19 Dec 2025 16:12:35 +0100 Subject: [PATCH 46/47] Apply suggestions from code review Co-authored-by: Steffen Waldmann --- cds/cxl.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cds/cxl.md b/cds/cxl.md index a9e605eae7..3b5396ddab 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -41,7 +41,7 @@ and other expressions in the context of CDS models and queries. + In [calculated elements](./cdl/#calculated-elements) + In [annotations](./cdl.md#expressions-as-annotation-values) -::: info 💡 expressions in CAP are materialized in the context of queries +::: info 💡 Expressions in CAP are materialized in the context of queries No matter where `CXL` is used, it always manifests in queries. For example, [a calculated element](./cdl/#calculated-elements) defined in an entity will be resolved to the respective calculation in the generated query when the entity is queried. @@ -871,8 +871,7 @@ In this example, the ordering term sorts books by price in descending order and ## type-ref { #type-ref } -::: info 💡 learn more about type references [here](./cdl.md#type-references) -::: +[Learn more about type references in CDL](./cdl#type-references){ .learn-more } ## Scientific Background {#foundation} From 84632ded8bbcf5204f977e7ab468ca980b4f64d7 Mon Sep 17 00:00:00 2001 From: Johannes Vogt Date: Fri, 19 Dec 2025 17:09:31 +0100 Subject: [PATCH 47/47] fix --- cds/cxl.md | 1 - 1 file changed, 1 deletion(-) diff --git a/cds/cxl.md b/cds/cxl.md index a9e605eae7..b57c00bda6 100644 --- a/cds/cxl.md +++ b/cds/cxl.md @@ -23,7 +23,6 @@ import intro from '../assets/cxl/intro.drawio.svg?raw' import setsIntersection from '../assets/cxl/sets-intersection.drawio.svg?raw' import setsLeftjoin from '../assets/cxl/sets-leftjoin.drawio.svg?raw' import setsExpand from '../assets/cxl/sets-expand.drawio.svg?raw' -import sets from '../assets/cxl/sets.drawio.svg?raw'