|
26 | 26 | <div class="code-dot"></div> |
27 | 27 | <span class="code-title">complex_analytics.lql</span> |
28 | 28 | </div> |
29 | | - <div class="code-block"> |
30 | | -<span class="comment">-- Join users + orders, filter only completed orders</span> |
| 29 | + <div class="code-block"><span class="comment">-- Join users + orders, filter only completed orders</span> |
31 | 30 | <span class="keyword">let</span> <span class="identifier">joined</span> <span class="operator">=</span> |
32 | 31 | <span class="identifier">users</span> |
33 | 32 | <span class="operator">|></span> <span class="function">join</span>(<span class="identifier">orders</span>, <span class="identifier">on</span> <span class="operator">=</span> <span class="identifier">users</span>.<span class="identifier">id</span> <span class="operator">=</span> <span class="identifier">orders</span>.<span class="identifier">user_id</span>) |
|
40 | 39 | <span class="identifier">users</span>.<span class="identifier">name</span>, |
41 | 40 | <span class="function">count</span>(*) <span class="keyword">as</span> <span class="identifier">total_orders</span>, |
42 | 41 | <span class="function">sum</span>(<span class="identifier">orders</span>.<span class="identifier">total</span>) <span class="keyword">as</span> <span class="identifier">revenue</span> |
43 | | -) |
44 | | - </div> |
| 42 | +)</div> |
45 | 43 | </div> |
46 | 44 | </div> |
47 | 45 | </div> |
|
113 | 111 | </ul> |
114 | 112 | </div> |
115 | 113 | <div class="example-code"> |
116 | | - <div class="code-block"> |
117 | | -<span class="identifier">users</span> <span class="operator">|></span> <span class="function">select</span>( |
118 | | - <span class="identifier">users</span>.<span class="identifier">id</span>, |
119 | | - <span class="identifier">users</span>.<span class="identifier">name</span>, |
| 114 | + <div class="code-block"><span class="identifier">users</span> <span class="operator">|></span> <span class="function">select</span>( |
| 115 | + <span class="identifier">users</span>.<span class="identifier">id</span>, |
| 116 | + <span class="identifier">users</span>.<span class="identifier">name</span>, |
120 | 117 | <span class="identifier">users</span>.<span class="identifier">email</span> |
121 | | -) |
122 | | - </div> |
| 118 | +)</div> |
123 | 119 | </div> |
124 | 120 | </div> |
125 | 121 |
|
|
134 | 130 | </ul> |
135 | 131 | </div> |
136 | 132 | <div class="example-code"> |
137 | | - <div class="code-block"> |
138 | | -<span class="identifier">employees</span> |
| 133 | + <div class="code-block"><span class="identifier">employees</span> |
139 | 134 | <span class="operator">|></span> <span class="function">select</span>( |
140 | | - <span class="identifier">employees</span>.<span class="identifier">id</span>, |
141 | | - <span class="identifier">employees</span>.<span class="identifier">name</span>, |
| 135 | + <span class="identifier">employees</span>.<span class="identifier">id</span>, |
| 136 | + <span class="identifier">employees</span>.<span class="identifier">name</span>, |
142 | 137 | <span class="identifier">employees</span>.<span class="identifier">salary</span> |
143 | 138 | ) |
144 | | -<span class="operator">|></span> <span class="function">filter</span>(<span class="keyword">fn</span>(<span class="identifier">row</span>) <span class="operator">=></span> |
145 | | - <span class="identifier">row</span>.<span class="identifier">employees</span>.<span class="identifier">salary</span> <span class="operator">></span> <span class="string">50000</span> <span class="keyword">and</span> |
146 | | - <span class="identifier">row</span>.<span class="identifier">employees</span>.<span class="identifier">salary</span> <span class="operator"></span> <span class="string">100000</span> |
147 | | -) |
148 | | - </div> |
| 139 | +<span class="operator">|></span> <span class="function">filter</span>(<span class="keyword">fn</span>(<span class="identifier">row</span>) <span class="operator">=></span> |
| 140 | + <span class="identifier">row</span>.<span class="identifier">employees</span>.<span class="identifier">salary</span> <span class="operator">></span> <span class="string">50000</span> <span class="keyword">and</span> |
| 141 | + <span class="identifier">row</span>.<span class="identifier">employees</span>.<span class="identifier">salary</span> <span class="operator"><</span> <span class="string">100000</span> |
| 142 | +)</div> |
149 | 143 | </div> |
150 | 144 | </div> |
151 | 145 |
|
|
160 | 154 | </ul> |
161 | 155 | </div> |
162 | 156 | <div class="example-code"> |
163 | | - <div class="code-block"> |
164 | | -<span class="identifier">products</span> |
| 157 | + <div class="code-block"><span class="identifier">products</span> |
165 | 158 | <span class="operator">|></span> <span class="function">select</span>( |
166 | 159 | <span class="identifier">products</span>.<span class="identifier">name</span>, |
167 | 160 | <span class="identifier">products</span>.<span class="identifier">price</span> <span class="operator">*</span> <span class="identifier">products</span>.<span class="identifier">quantity</span> <span class="keyword">as</span> <span class="identifier">total_value</span>, |
168 | 161 | <span class="identifier">products</span>.<span class="identifier">price</span> <span class="operator">+</span> <span class="string">10</span> <span class="keyword">as</span> <span class="identifier">price_plus_ten</span>, |
169 | 162 | <span class="function">round</span>(<span class="identifier">products</span>.<span class="identifier">price</span> <span class="operator">/</span> <span class="string">2</span>, <span class="string">2</span>) <span class="keyword">as</span> <span class="identifier">half_price</span> |
170 | 163 | ) |
171 | | -<span class="operator">|></span> <span class="function">filter</span>(<span class="keyword">fn</span>(<span class="identifier">row</span>) <span class="operator">=></span> |
172 | | - <span class="identifier">row</span>.<span class="identifier">products</span>.<span class="identifier">price</span> <span class="operator">></span> <span class="string">0</span> |
173 | | -) |
174 | | - </div> |
| 164 | +<span class="operator">|></span> <span class="function">filter</span>(<span class="keyword">fn</span>(<span class="identifier">row</span>) <span class="operator">=></span> |
| 165 | + <span class="identifier">row</span>.<span class="identifier">products</span>.<span class="identifier">price</span> <span class="operator">></span> <span class="string">0</span> |
| 166 | +)</div> |
175 | 167 | </div> |
176 | 168 | </div> |
177 | 169 |
|
|
186 | 178 | </ul> |
187 | 179 | </div> |
188 | 180 | <div class="example-code"> |
189 | | - <div class="code-block"> |
190 | | -<span class="identifier">orders</span> |
| 181 | + <div class="code-block"><span class="identifier">orders</span> |
191 | 182 | <span class="operator">|></span> <span class="function">group_by</span>(<span class="identifier">orders</span>.<span class="identifier">user_id</span>, <span class="identifier">orders</span>.<span class="identifier">status</span>) |
192 | 183 | <span class="operator">|></span> <span class="function">select</span>( |
193 | 184 | <span class="identifier">orders</span>.<span class="identifier">user_id</span>, |
|
196 | 187 | <span class="function">sum</span>(<span class="identifier">orders</span>.<span class="identifier">total</span>) <span class="keyword">as</span> <span class="identifier">total_amount</span>, |
197 | 188 | <span class="function">avg</span>(<span class="identifier">orders</span>.<span class="identifier">total</span>) <span class="keyword">as</span> <span class="identifier">avg_amount</span> |
198 | 189 | ) |
199 | | -<span class="operator">|></span> <span class="function">having</span>(<span class="keyword">fn</span>(<span class="identifier">group</span>) <span class="operator">=></span> <span class="function">count</span>(*) <span class="operator">></span> <span class="string">2</span>) |
200 | | -<span class="operator">|></span> <span class="function">order_by</span>(<span class="identifier">total_amount</span> <span class="keyword">desc</span>) |
201 | | - </div> |
| 190 | +<span class="operator">|></span> <span class="function">having</span>(<span class="keyword">fn</span>(<span class="identifier">group</span>) <span class="operator">=></span> <span class="function">count</span>(*) <span class="operator">></span> <span class="string">2</span>) |
| 191 | +<span class="operator">|></span> <span class="function">order_by</span>(<span class="identifier">total_amount</span> <span class="keyword">desc</span>)</div> |
202 | 192 | </div> |
203 | 193 | </div> |
204 | 194 | </div> |
205 | 195 | </div> |
206 | 196 | </section> |
207 | 197 |
|
| 198 | +<section id="fsharp" class="fsharp"> |
| 199 | + <div class="container"> |
| 200 | + <div class="section-header"> |
| 201 | + <h2>F# Type Provider</h2> |
| 202 | + <p>Use LQL with full type safety in F# through our native type provider.</p> |
| 203 | + </div> |
| 204 | + |
| 205 | + <div class="fsharp-content"> |
| 206 | + <div class="fsharp-info"> |
| 207 | + <h3>Type-Safe LQL in F#</h3> |
| 208 | + <p>The LQL Type Provider brings compile-time type checking to your LQL queries in F#. Write queries with IntelliSense support, catch errors before runtime, and enjoy seamless integration with your F# codebase.</p> |
| 209 | + <ul class="fsharp-features"> |
| 210 | + <li>Compile-time query validation</li> |
| 211 | + <li>Full IntelliSense support for table and column names</li> |
| 212 | + <li>Automatic SQL generation for PostgreSQL and SQL Server</li> |
| 213 | + <li>Strongly-typed result sets</li> |
| 214 | + </ul> |
| 215 | + </div> |
| 216 | + <div class="fsharp-code"> |
| 217 | + <div class="code-header"> |
| 218 | + <div class="code-dot"></div> |
| 219 | + <div class="code-dot"></div> |
| 220 | + <div class="code-dot"></div> |
| 221 | + <span class="code-title">Program.fs</span> |
| 222 | + </div> |
| 223 | + <div class="code-block"><span class="keyword">open</span> <span class="identifier">Lql</span> |
| 224 | + |
| 225 | +<span class="comment">// Define types with validated LQL</span> |
| 226 | +<span class="keyword">type</span> <span class="identifier">GetUsers</span> <span class="operator">=</span> |
| 227 | + <span class="identifier">LqlCommand</span><span class="operator"><</span><span class="string">"Users |> select(*)"</span><span class="operator">></span> |
| 228 | + |
| 229 | +<span class="comment">// Access generated SQL</span> |
| 230 | +<span class="keyword">let</span> <span class="identifier">sql</span> <span class="operator">=</span> <span class="identifier">GetUsers</span>.<span class="identifier">Sql</span> |
| 231 | +<span class="keyword">let</span> <span class="identifier">query</span> <span class="operator">=</span> <span class="identifier">GetUsers</span>.<span class="identifier">Query</span></div> |
| 232 | + </div> |
| 233 | + </div> |
| 234 | + </div> |
| 235 | +</section> |
| 236 | + |
208 | 237 | <section id="playground" class="playground"> |
209 | 238 | <div class="container"> |
210 | 239 | <div class="section-header"> |
|
0 commit comments