Skip to content

Commit

Permalink
Deploying to gh-pages from @ 52861fa 🚀
Browse files Browse the repository at this point in the history
  • Loading branch information
facebook-github-bot committed Dec 19, 2024
1 parent d7e7a98 commit 8de1acd
Show file tree
Hide file tree
Showing 68 changed files with 203 additions and 133 deletions.
4 changes: 2 additions & 2 deletions 404.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
<meta name="generator" content="Docusaurus v2.1.0">
<title data-rh="true">Page Not Found | Glean</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://glean.software/404.html"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="og:title" content="Page Not Found | Glean"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://glean.software/404.html"><link data-rh="true" rel="alternate" href="https://glean.software/404.html" hreflang="en"><link data-rh="true" rel="alternate" href="https://glean.software/404.html" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="Glean RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Glean Atom Feed"><link rel="stylesheet" href="/assets/css/styles.34be974f.css">
<link rel="preload" href="/assets/js/runtime~main.60d0e6fc.js" as="script">
<link rel="preload" href="/assets/js/runtime~main.c254b465.js" as="script">
<link rel="preload" href="/assets/js/main.a772105e.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}(),document.documentElement.setAttribute("data-announcement-bar-initially-dismissed",function(){try{return"true"===localStorage.getItem("docusaurus.announcement.dismiss")}catch(t){}return!1}())</script>
<div style="display: none; text-align: center; background-color: white; color: black;" id="internaldocs-banner"></div><div id="__docusaurus">
<div role="region" aria-label="theme.common.skipToMainContent"><a href="#" class="skipToContent_fXgn">Skip to main content</a></div><div class="announcementBar_mb4j" style="background-color:#20232a;color:#fff" role="banner"><div class="content_knG7 announcementBarContent_xLdY">Support Ukraine 🇺🇦 <a target="_blank" rel="noopener noreferrer" href="https://opensource.fb.com/support-ukraine"> Help Provide Humanitarian Aid to Ukraine</a>.</div></div><nav class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Navigation bar toggle" class="navbar__toggle clean-btn" type="button" tabindex="0"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><b class="navbar__title text--truncate">Glean</b></a><a class="navbar__item navbar__link" href="/docs/introduction/">Documentation</a><a class="navbar__item navbar__link" href="/blog/">Blog</a></div><div class="navbar__items navbar__items--right"><a href="https://github.com/facebookincubator/glean" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div class="main-wrapper mainWrapper_z2l0"><main class="container margin-vert--xl"><div class="row"><div class="col col--6 col--offset-3"><h1 class="hero__title">Page Not Found</h1><p>We could not find what you were looking for.</p><p>Please contact the owner of the site that linked you to the original URL and let them know their link is broken.</p></div></div></main></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Learn</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/introduction/">Getting Started</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://twitter.com/MetaOpenSource" target="_blank" rel="noopener noreferrer" class="footer__link-item">Twitter<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://discord.gg/w3s6X6QAHZ" target="_blank" rel="noopener noreferrer" class="footer__link-item">Discord<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/blog/">Blog</a></li><li class="footer__item"><a href="https://github.com/facebookincubator/glean" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">Legal</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://opensource.fb.com/legal/privacy" target="_blank" rel="noopener noreferrer" class="footer__link-item">Privacy<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://opensource.fb.com/legal/terms" target="_blank" rel="noopener noreferrer" class="footer__link-item">Terms<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="margin-bottom--sm"><a href="https://opensource.facebook.com" rel="noopener noreferrer" class="footerLogoLink_BH7S"><img src="/img/oss_logo.png" alt="Facebook Open Source Logo" class="themedImage_ToTc themedImage--light_HNdA footer__logo"><img src="/img/oss_logo.png" alt="Facebook Open Source Logo" class="themedImage_ToTc themedImage--dark_i4oU footer__logo"></a></div><div class="footer__copyright">Copyright © Meta Platforms, Inc. Built with Docusaurus.</div></div></div></footer></div>
<script src="/assets/js/runtime~main.60d0e6fc.js"></script>
<script src="/assets/js/runtime~main.c254b465.js"></script>
<script src="/assets/js/main.a772105e.js"></script>
</body>
</html>
35 changes: 35 additions & 0 deletions _src/angle/guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,41 @@ facts> X where [_,X, ..] = [1,2,3]
{ "id": 1040, "key": 2 }
```

## Sets

Sets are similar to arrays but helpful when the order of the elements are not important and duplicates are also irrelevant.
A common example is when storing cross references. For instance, the python schema has a predicate which contains all
name cross references in a file. The cross references are currently stored in an array but it could be stored in a set as below.

```lang=angle
predicate XRefsViaNameByFile:
{
file: src.File,
xrefs: set XRefViaName,
}
```

If we want to know for a particular file and a particular name, where it is used we could write the following query:

```lang=angle
XRefsViaNameByFile { file = "foo.py", xrefs = XRefs };
{ target = { name = "Bar" } } = elements XRefs
```

The second line uses the construct `elements` which is similar to the `[..]` syntax for arrays.

We can also create new sets from the results of a query. This is done using the `all` construct. For instance
`all (1 | 2 | 3)` is a set containing the number `1`, `2`, and `3`.

The `all` construct can be used in combination with the `elements` construct to, for instance, map over a set
of elements and transform them. In the example below, the second line takes each element of the `StringSet` and
applies the primitive `prim.toLower` to it. The result is a set where all the strings are lowercase.

```lang=angle
StringSet = all ("Foo" | "Bar" | "Baz" );
all (String = elements StringSet; prim.toLower String)
```

## String prefix

We’ve seen many examples of patterns that match strings. Glean also supports matching strings by *prefix*; for example:
Expand Down
21 changes: 21 additions & 0 deletions _src/angle/reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,14 @@ Terms have the following forms:
> Note: variables mentioned in **term₁** and **term₂** are local to those terms, and may have different types, but only if the variable is not mentioned elsewhere.
&nbsp;&nbsp;`elements` *term*

> All the elements of the set **term**
&nbsp;&nbsp;`all` *query*

> Construct a set of all the results of **query**.
&nbsp;&nbsp;`!` *term*

> The negation of a term. Fails if the term matches anything and succeeds otherwise.
Expand Down Expand Up @@ -172,3 +180,16 @@ Angle supports a few primitive operations. The argument(s) to a primitive operat
&nbsp;&nbsp;*term* `!=` *term*

> Standard comparison between two terms of any type. It has a value of `{}` if the comparison succeeds, otherwise it fails in the same way as a predicate match fails if there are no facts that match the pattern.
&nbsp;&nbsp;`zip` (A : [a]) (B : [b]) : [{a,b}]

> Takes two arrays and zips them together pairwise into a new array of tuples.
If the arrays have different length, the result has the same length as the shorter input array.

&nbsp;&nbsp;`concat` (A : [a]) (B : [a]) : [a]

> Concatenates two arrays together
&nbsp;&nbsp;`reverse` (S : string) : string

> Reverses a string
2 changes: 2 additions & 0 deletions _src/schema/changing.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ only be changed in **compatible** ways. This means:
* Adding or removing a field from a record, if the field has a **defaultable** type (see [Default values](#default-values))
* Adding or removing an alternative from a sum type
* Adding or removing a predicate or type declaration
* Changing a list to a set or vice versa

An example of an *incompatible* change would be changing the type of a
field, for example from `nat` to `bool`.
Expand Down Expand Up @@ -61,6 +62,7 @@ following table:
| <code>byte</code> | <code>0</code> |
| <code>string</code> | <code>""</code> |
| <code>[T]</code> | <code>[]</code> |
| <code> set T</code> | the empty set |
| <code>{ field₁ : T₁, ..., fieldₙ : Tₙ }</code> | <code>{ field₁ = default(T₁), ..., fieldₙ = default(Tₙ) }</code> |
| <code>{ field₁ : T₁ &#124; ... &#124; fieldₙ : Tₙ }</code> | <code>{ field₁ = default(T₁) }</code> |
| <code>bool</code> | <code>false</code> |
Expand Down
21 changes: 12 additions & 9 deletions _src/schema/design.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,35 +106,35 @@ There are several tradeoffs here:
* **Incrementality**
* These two alternatives are equivalent with respect to incrementality.

## Using arrays
## Using arrays, sets or separate facts

If you're choosing between arrays and separate facts, then consider:

* Arrays are ordered lists, whereas facts are just sets. If the order
of your items is important - because you're representing something
that has an order, such as function arguments - then an array is the
right choice. (someday Glean might have a "set" type, but it
currently doesn't).
right choice.

* Conversely, if the order is *not* important, then using an array is
* Conversely, if the order is *not* important, then sets are the natural
choice. Using an array is
a poor choice because you will be forced to choose an order when
generating your data. If you don't have a deterministic way to pick
the order, then your data representation is non-deterministic which
leads to spurious differences in things like test outputs, which can
be annoying.

* Arrays are much more compact than multiple facts. There can be a
* Arrays and sets are much more compact than multiple facts. There can be a
huge difference in storage overhead; it's worth measuring this for
your schema.

* When a client fetches an array as part of the result of a query,
they will get the whole array. If your array is large, that may be a
* When a client fetches an array or a set as part of the result of a query,
they will get the whole array/set. If it is large, that may be a
lot of data to send over the wire, and it might even result in an
allocation limit error on the server, preventing the client from
fetching the data at all. Facts tend to support incremental querying
better compared with arrays.
better compared with arrays and sets.

* Facts with large arrays are also slower to search through in a query
* Facts with large arrays/sets are also slower to search through in a query
than smaller facts.

## Increase sharing
Expand All @@ -143,6 +143,9 @@ If there is duplication in the data stored in our facts, we can often
extract the common data into a predicate to increase sharing. One
example of this was described in [What is the difference between a predicate and a type?](schema/syntax.md#what-is-the-difference-between-a-predicate-and-a-type).

Choosing to use sets instead of arrays can increase sharing because sets have
a canonical representation.

## How to experiment with schema design

* Generate some data and see how large it is, using `:stat` in the shell.
Expand Down
1 change: 1 addition & 0 deletions _src/schema/thrift.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ The relationship between schema types and Thrift/JSON is given by the following
| `bool` | `bool` | `true` or `false` |
| `[byte]` | `binary` | base-64 encoded string <sup>*1</sup> |
| `[T]` | `list<T>` | [...] |
| `set T` | `list<T>` | [...] |
|`{`<br/>&nbsp;&nbsp;`f₁ : T₁,`<br/>&nbsp;&nbsp`...,`<br/>&nbsp;&nbsp;`fₙ : Tₙ`<br/>`}` | `struct Foo {`<br/>&nbsp;&nbsp;`1: T₁ f₁;`<br/>&nbsp;&nbsp;`...`<br/>&nbsp;&nbsp;`n: Tₙ fₙ;`<br/>`}` | `{`<br/>&nbsp;&nbsp;`"f₁" : q₁,`<br/>&nbsp;&nbsp;`...`<br/>&nbsp;&nbsp;`"fₙ" : qₙ`<br/>`}` |
| `{`<br/>&nbsp;&nbsp;`f₁ : T₁ `<code>&vert;</code><br/>&nbsp;&nbsp;`... `<code>&vert;</code><br/>&nbsp;&nbsp;`fₙ : Tₙ`<br/>`}` | `union Foo {`<br/>&nbsp;&nbsp;`1: T₁ f₁;`<br/>&nbsp;&nbsp;`...`<br/>&nbsp;&nbsp;`n: Tₙ fₙ;`<br/>`}` | `{ "f" : t }`<br/>for one of the fields `f₁`..`fₙ` |
| `maybe T` | In a record field:<br/> `optional T f` | `f : t`<br/> if the value is present |
Expand Down
1 change: 1 addition & 0 deletions _src/schema/types.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ sidebar_label: Built-in Types
| <code>byte</code> | 8-bit natural numbers |
| <code>string</code> | UTF-8 encoded strings |
| <code>[T]</code> | lists of elements of type T |
| <code>set T </code> | set of elements of type T |
| <code>{ field₁ : T₁, ..., fieldₙ : Tₙ }</code> | a record with zero or more named fields |
| <code>{ field₁ : T₁ &#124; ... &#124; fieldₙ : Tₙ }</code> | a sum (union) type with one or more named alternatives |
| <code>P</code> | a reference to a fact of predicate P |
Expand Down
1 change: 1 addition & 0 deletions assets/js/21418ead.51b22fa5.js

Large diffs are not rendered by default.

1 change: 0 additions & 1 deletion assets/js/21418ead.a068d6b1.js

This file was deleted.

1 change: 0 additions & 1 deletion assets/js/283d7b21.5e2f56ef.js

This file was deleted.

1 change: 1 addition & 0 deletions assets/js/283d7b21.d61de8d0.js

Large diffs are not rendered by default.

Loading

0 comments on commit 8de1acd

Please sign in to comment.