Exograph can index multiple package versions into the same Postgres backend. This was one of the original motivations for the project: test ExAST and Reach on larger real-world Elixir package sets and make the resulting facts queryable.

Package version identity

Pass package release identity while indexing:

Exograph.index("sources/req_llm-1.11.0",
  repo: MyApp.Repo,
  migrate?: true,
  package_version: [
    ecosystem: :hex,
    name: "req_llm",
    version: "1.11.0",
    source_ref: "hex:req_llm:1.11.0"
  ]
)

Exograph.index("sources/req_llm-1.12.0",
  repo: MyApp.Repo,
  package_version: [ecosystem: :hex, name: "req_llm", version: "1.12.0"]
)

Package and package-version records are normalized separately from files and fragments.

Scoped queries

Use package/version options to restrict search:

Exograph.search(index, "Repo.get!(_, _)",
  package_version_id: "hex:req_llm@1.11.0"
)

The DSL and code-fact search APIs use the same underlying scope fields.

Use cases

Package indexing is useful when you want to:

  • compare code patterns across versions
  • search a local Hex package corpus
  • benchmark ExAST or Reach on real code
  • build local/self-hosted package code intelligence
  • find API usage examples across many libraries