Skip to content

Commit

Permalink
Deploying to gh-pages from @ 9006b88 🚀
Browse files Browse the repository at this point in the history
  • Loading branch information
facebook-github-bot committed Jan 10, 2024
1 parent a113fc4 commit 718d6ac
Show file tree
Hide file tree
Showing 195 changed files with 420 additions and 362 deletions.
10 changes: 5 additions & 5 deletions 404.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@
<meta charset="UTF-8">
<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.a464e807.css">
<link rel="preload" href="/assets/js/runtime~main.2688aaad.js" as="script">
<link rel="preload" href="/assets/js/main.13805ebb.js" as="script">
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Glean Atom Feed"><link rel="stylesheet" href="/assets/css/styles.7750bc55.css">
<link rel="preload" href="/assets/js/runtime~main.ad5399c4.js" as="script">
<link rel="preload" href="/assets/js/main.1fc9413a.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></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.facebook.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.facebook.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 © 2024 Meta Platforms, Inc. Built with Docusaurus.</div></div></div></footer></div>
<script src="/assets/js/runtime~main.2688aaad.js"></script>
<script src="/assets/js/main.13805ebb.js"></script>
<script src="/assets/js/runtime~main.ad5399c4.js"></script>
<script src="/assets/js/main.1fc9413a.js"></script>
</body>
</html>
28 changes: 16 additions & 12 deletions _src/schema/basic.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,30 +25,34 @@ facts. Each fact is an instance of one predicate.
A predicate looks like this:

```
predicate P : KeyType -> ValueType
predicate P : KeyType
```

where

* `P` is the name of the predicate. e.g. `src.File`
* `KeyType` is the *key type*
* `ValueType` is the *value type*
* `KeyType` is the *key type*; the type of the facts.

`KeyType` and `ValueType` are types; the type language is described in
[Built-in Types](types.md).
The type language is described in [Built-in Types](types.md).

Every *fact* in predicate P has:

* A ***Fact ID***: a unique 64-bit integer that identifies the fact
* A ***Key***, a term of type `KeyType`
* A ***Value***, a term of type `ValueType`

(we use "term" here to avoid confusion with the use of "value" in a predicate).
A predicate can also have a value in addition to the key:

```
predicate P : KeyType -> ValueType
```

Often the value is empty, represented by the empty record `{}`. Most
predicates have all their information in the key.
facts of `P` would then have a fact ID, a key term and a value term.
When a predicate has a value in addition to the key, Glean enforces
the property that *each unique key has exactly one value*. It is
illegal to insert two facts with the same key and different values.

You can think of Glean as like a key/value store: we can look up a key
`K` in predicate `P` and get back value `V.` We can also query for
`K` in predicate `P` and get back value `V`. We can also query for
*patterns* that match multiple keys, and get back all the facts that
match the pattern. More about this when we talk about [Angle](../angle/intro.md)
queries.
match the pattern. More about this when we talk about
[Angle](../angle/intro.md) queries.
6 changes: 6 additions & 0 deletions _src/schema/design.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,12 @@ If you're choosing between arrays and separate facts, then consider:
* Facts with large arrays are also slower to search through in a query
than smaller facts.

## Increase sharing

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).

## How to experiment with schema design

* Generate some data and see how large it is, using `:stat` in the shell.
Expand Down
55 changes: 47 additions & 8 deletions _src/schema/syntax.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@ Schemas are written in Glean's **Angle** language.

## Named schemas

We usually create a new named schema for a family of related types and predicates. For example `hack` is the schema for facts about Hack code, `cxx` is the schema for facts about C/C++ and Objective C code, `java` is the schema for facts about Java code, and so on.
We usually create a new named schema for a family of related types and
predicates. For example `cxx` is the schema for facts about C/C++ and
Objective C code, `java` is the schema for facts about Java code,
`python` is the schema for facts about Python code and so on.

```
schema java.1 {
Expand All @@ -33,13 +36,12 @@ generated [Thrift file](thrift.md) for working with the data in your code.
A predicate definition looks like this:

```
predicate P : KeyType -> ValueType
predicate P : KeyType
```
where

* `P` is the name of the predicate. e.g. `src.File`
* `KeyType` is the *key type*
* `ValueType` is the *value type*

For example, the example schema that we saw in the [Introduction](../introduction.md)
contains the `Class` predicate:
Expand All @@ -60,6 +62,15 @@ This defines:
* a field `name`, that has type `string`
* a field `line`, of type `nat`

A predicate can also have a value:

```
predicate P : KeyType -> ValueType
```

We sometimes call these key-value predicates. Most predicates you
encounter will only have a key.

## Referring to other predicates

A key feature of Glean is the ability to refer directly to other types
Expand Down Expand Up @@ -138,14 +149,42 @@ type Loc = {
}
```

:::note
### What is the difference between a predicate and a type?

`type` declarations cannot be recursive or mutually recursive. If you want a
recursive type, the cycle must go through at least one predicate. For
more details, see [Recursion](recursion.md).
Predicates describe facts that are stored in the DB. A type has no
facts, it's just a name for a type. Types are expanded everywhere
they're mentioned.

:::
Predicates are useful for increasing sharing. For example, if we have

```
predicate P: { a : string, b : [nat] }
```

and we notice that many `P` facts have the same array of `nat` for the
`b` field, we could store the data more compactly by making it a predicate:

```
predicate List: [nat]
predicate P: { a : string, b : List }
```

Now there will only be one fact for each unique value of `List` stored
in the DB. Using a `type` would not have the same effect:

```
type List: [nat]
predicate P: { a : string, b : List }
```

This is exactly equivalent to the original version; every `P` fact
will contain the full `[nat]`.

Finally, `type` declarations cannot be recursive or mutually
recursive. If you want a recursive type, the cycle must go through at
least one predicate. For more details, see [Recursion](recursion.md).

## Importing and inheriting

Expand Down
4 changes: 1 addition & 3 deletions _src/schema/types.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ title: Built-in Types
sidebar_label: Built-in Types
---

## Built-in Types

| Type | Meaning |
|-------|-------|
| <code>nat</code> | 64-bit natural numbers |
Expand All @@ -15,6 +13,6 @@ sidebar_label: Built-in Types
| <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 |
| <code>bool</code> | the boolean type with values **true** or **false** |
| <code>bool</code> | the boolean type with values **true** and **false** |
| <code>maybe T</code> | an optional value of type T |
| <code>enum { name₁ &#124; ... &#124; nameₙ }</code> | exactly one of the symbols name₁..nameₙ |
1 change: 1 addition & 0 deletions assets/css/styles.7750bc55.css

Large diffs are not rendered by default.

1 change: 0 additions & 1 deletion assets/css/styles.a464e807.css

This file was deleted.

1 change: 0 additions & 1 deletion assets/js/01a85c17.1b9bb356.js

This file was deleted.

Loading

0 comments on commit 718d6ac

Please sign in to comment.