pub struct Corpus {
pub id: i32,
pub path: String,
pub name: String,
pub complex: bool,
pub description: String,
pub parent_corpus_id: Option<i32>,
pub selection: Option<Value>,
pub public_id: Uuid,
}Expand description
A minimal description of a document collection. Defined by a name, path and simple/complex file system setup.
Fields§
§id: i32auto-incremented postgres id
path: Stringfile system path to corpus root (a corpus is held in a single top-level directory)
name: Stringa human-readable name for this corpus
complex: boolare we using multiple files to represent a document entry? (if unsure, always use “true”)
description: Stringa human-readable description of the corpus, maybe allow markdown here?
parent_corpus_id: Option<i32>For a sandbox corpus: the parent corpus it was carved from (else None). See
[crate::backend::sandbox].
selection: Option<Value>For a sandbox corpus: the filter predicate it was built from — the JSON
{service, severity, category, what} selection over the parent. This IS the sandbox’s
provenance (“why these entries”), so no per-task origin link is kept.
public_id: UuidStable external handle (UUIDv7, DB-generated), independent of the mutable name — for
public/API references that must survive a rename. Immutable once assigned (Arm 3 / D8).
Implementations§
Source§impl Corpus
impl Corpus
Sourcepub fn find_by_name(
name_query: &str,
connection: &mut PgConnection,
) -> Result<Self, Error>
pub fn find_by_name( name_query: &str, connection: &mut PgConnection, ) -> Result<Self, Error>
ORM-like until diesel.rs introduces finders for more fields
Sourcepub fn find_by_id(
id_query: i32,
connection: &mut PgConnection,
) -> Result<Self, Error>
pub fn find_by_id( id_query: i32, connection: &mut PgConnection, ) -> Result<Self, Error>
Find a corpus by its primary key (used to resolve a sandbox’s parent).
Sourcepub fn sandbox_id(&self) -> Option<i32>
pub fn sandbox_id(&self) -> Option<i32>
The id under which this corpus’s result archives are name-scoped, or None for an
ordinary corpus. A sandbox (parent_corpus_id.is_some()) scopes its outputs by its own id
so a rerun can’t clobber the parent’s archives — see crate::helpers::result_archive_path
(F-6).
Sourcepub fn task_count(&self, connection: &mut PgConnection) -> Result<i64, Error>
pub fn task_count(&self, connection: &mut PgConnection) -> Result<i64, Error>
Total number of tasks registered under this corpus (across all services) — the blast radius a
Corpus::destroy would remove. Used to preview a destructive delete before committing.
Sourcepub fn find_by_path(
path_query: &str,
connection: &mut PgConnection,
) -> Result<Self, Error>
pub fn find_by_path( path_query: &str, connection: &mut PgConnection, ) -> Result<Self, Error>
ORM-like until diesel.rs introduces finders for more fields
Sourcepub fn all(connection: &mut PgConnection) -> Result<Vec<Self>, Error>
pub fn all(connection: &mut PgConnection) -> Result<Vec<Self>, Error>
Returns all registered corpora, ordered by name.
Sourcepub fn document_counts(connection: &mut PgConnection) -> HashMap<i32, i64>
pub fn document_counts(connection: &mut PgConnection) -> HashMap<i32, i64>
Document count per corpus id, for every corpus in one query (no N+1) — the number of
import-service (id 2) tasks, which is one per ingested document. Used to show each corpus’s
scale on the overview/landing without a per-corpus count. A corpus with no import tasks (none
ingested yet) is simply absent from the map (treat as 0).
Sourcepub fn to_hash(&self) -> HashMap<String, String>
pub fn to_hash(&self) -> HashMap<String, String>
Return a hash representation of the corpus, usually for frontend reports
Sourcepub fn select_services(
&self,
connection: &mut PgConnection,
) -> Result<Vec<Service>, Error>
pub fn select_services( &self, connection: &mut PgConnection, ) -> Result<Vec<Service>, Error>
Return a vector of services currently activated on this corpus
Sourcepub fn destroy(self, connection: &mut PgConnection) -> Result<usize, Error>
pub fn destroy(self, connection: &mut PgConnection) -> Result<usize, Error>
Deletes a corpus and all its dependent rows — the log_* messages, the tasks, and the
corpus registration — consuming the object. Runs in a single transaction so a crash mid-delete
can’t leave a half-deleted corpus (crash-consistency, docs/DESIGN_PRINCIPLES.md).
The log_* tables have no foreign key to tasks (the only FK is
historical_tasks.task_id → tasks ON DELETE CASCADE), so their rows must be deleted
explicitly before the tasks or they orphan — this is why deletion lives in one complete
primitive rather than a bare DELETE FROM corpora (the CLAUDE.md “deleting a corpus orphans
log_* rows” hazard, now closed at the source so every caller is safe).
Trait Implementations§
Source§impl AsChangeset for Corpus
impl AsChangeset for Corpus
Source§type Changeset = <(Grouped<Eq<path, <String as AsExpression<<path as Expression>::SqlType>>::Expression>>, Grouped<Eq<name, <String as AsExpression<<name as Expression>::SqlType>>::Expression>>, Grouped<Eq<complex, <bool as AsExpression<<complex as Expression>::SqlType>>::Expression>>, Grouped<Eq<description, <String as AsExpression<<description as Expression>::SqlType>>::Expression>>, Option<Grouped<Eq<parent_corpus_id, <i32 as AsExpression<<parent_corpus_id as Expression>::SqlType>>::Expression>>>, Option<Grouped<Eq<selection, <Value as AsExpression<<selection as Expression>::SqlType>>::Expression>>>, Grouped<Eq<public_id, <Uuid as AsExpression<<public_id as Expression>::SqlType>>::Expression>>) as AsChangeset>::Changeset
type Changeset = <(Grouped<Eq<path, <String as AsExpression<<path as Expression>::SqlType>>::Expression>>, Grouped<Eq<name, <String as AsExpression<<name as Expression>::SqlType>>::Expression>>, Grouped<Eq<complex, <bool as AsExpression<<complex as Expression>::SqlType>>::Expression>>, Grouped<Eq<description, <String as AsExpression<<description as Expression>::SqlType>>::Expression>>, Option<Grouped<Eq<parent_corpus_id, <i32 as AsExpression<<parent_corpus_id as Expression>::SqlType>>::Expression>>>, Option<Grouped<Eq<selection, <Value as AsExpression<<selection as Expression>::SqlType>>::Expression>>>, Grouped<Eq<public_id, <Uuid as AsExpression<<public_id as Expression>::SqlType>>::Expression>>) as AsChangeset>::Changeset
Source§fn as_changeset(self) -> <Self as AsChangeset>::Changeset
fn as_changeset(self) -> <Self as AsChangeset>::Changeset
self into the actual update statement being executedSource§impl<'update> AsChangeset for &'update Corpus
impl<'update> AsChangeset for &'update Corpus
Source§type Changeset = <(Grouped<Eq<path, <&'update String as AsExpression<<path as Expression>::SqlType>>::Expression>>, Grouped<Eq<name, <&'update String as AsExpression<<name as Expression>::SqlType>>::Expression>>, Grouped<Eq<complex, <&'update bool as AsExpression<<complex as Expression>::SqlType>>::Expression>>, Grouped<Eq<description, <&'update String as AsExpression<<description as Expression>::SqlType>>::Expression>>, Option<Grouped<Eq<parent_corpus_id, <&'update i32 as AsExpression<<parent_corpus_id as Expression>::SqlType>>::Expression>>>, Option<Grouped<Eq<selection, <&'update Value as AsExpression<<selection as Expression>::SqlType>>::Expression>>>, Grouped<Eq<public_id, <&'update Uuid as AsExpression<<public_id as Expression>::SqlType>>::Expression>>) as AsChangeset>::Changeset
type Changeset = <(Grouped<Eq<path, <&'update String as AsExpression<<path as Expression>::SqlType>>::Expression>>, Grouped<Eq<name, <&'update String as AsExpression<<name as Expression>::SqlType>>::Expression>>, Grouped<Eq<complex, <&'update bool as AsExpression<<complex as Expression>::SqlType>>::Expression>>, Grouped<Eq<description, <&'update String as AsExpression<<description as Expression>::SqlType>>::Expression>>, Option<Grouped<Eq<parent_corpus_id, <&'update i32 as AsExpression<<parent_corpus_id as Expression>::SqlType>>::Expression>>>, Option<Grouped<Eq<selection, <&'update Value as AsExpression<<selection as Expression>::SqlType>>::Expression>>>, Grouped<Eq<public_id, <&'update Uuid as AsExpression<<public_id as Expression>::SqlType>>::Expression>>) as AsChangeset>::Changeset
Source§fn as_changeset(self) -> <Self as AsChangeset>::Changeset
fn as_changeset(self) -> <Self as AsChangeset>::Changeset
self into the actual update statement being executedSource§impl<__FK> BelongsTo<&Corpus> for Taskwhere
__FK: Hash + Eq,
for<'__a> &'__a i32: Into<Option<&'__a __FK>>,
for<'__a> &'__a Corpus: Identifiable<Id = &'__a __FK>,
impl<__FK> BelongsTo<&Corpus> for Taskwhere
__FK: Hash + Eq,
for<'__a> &'__a i32: Into<Option<&'__a __FK>>,
for<'__a> &'__a Corpus: Identifiable<Id = &'__a __FK>,
Source§type ForeignKey = __FK
type ForeignKey = __FK
Source§type ForeignKeyColumn = corpus_id
type ForeignKeyColumn = corpus_id
Source§fn foreign_key(&self) -> Option<&Self::ForeignKey>
fn foreign_key(&self) -> Option<&Self::ForeignKey>
selfSource§fn foreign_key_column() -> Self::ForeignKeyColumn
fn foreign_key_column() -> Self::ForeignKeyColumn
Source§impl<__FK> BelongsTo<&Corpus> for HistoricalRunwhere
__FK: Hash + Eq,
for<'__a> &'__a i32: Into<Option<&'__a __FK>>,
for<'__a> &'__a Corpus: Identifiable<Id = &'__a __FK>,
impl<__FK> BelongsTo<&Corpus> for HistoricalRunwhere
__FK: Hash + Eq,
for<'__a> &'__a i32: Into<Option<&'__a __FK>>,
for<'__a> &'__a Corpus: Identifiable<Id = &'__a __FK>,
Source§type ForeignKey = __FK
type ForeignKey = __FK
Source§type ForeignKeyColumn = corpus_id
type ForeignKeyColumn = corpus_id
Source§fn foreign_key(&self) -> Option<&Self::ForeignKey>
fn foreign_key(&self) -> Option<&Self::ForeignKey>
selfSource§fn foreign_key_column() -> Self::ForeignKeyColumn
fn foreign_key_column() -> Self::ForeignKeyColumn
Source§impl<__FK> BelongsTo<Corpus> for Taskwhere
__FK: Hash + Eq,
for<'__a> &'__a i32: Into<Option<&'__a __FK>>,
for<'__a> &'__a Corpus: Identifiable<Id = &'__a __FK>,
impl<__FK> BelongsTo<Corpus> for Taskwhere
__FK: Hash + Eq,
for<'__a> &'__a i32: Into<Option<&'__a __FK>>,
for<'__a> &'__a Corpus: Identifiable<Id = &'__a __FK>,
Source§type ForeignKey = __FK
type ForeignKey = __FK
Source§type ForeignKeyColumn = corpus_id
type ForeignKeyColumn = corpus_id
Source§fn foreign_key(&self) -> Option<&Self::ForeignKey>
fn foreign_key(&self) -> Option<&Self::ForeignKey>
selfSource§fn foreign_key_column() -> Self::ForeignKeyColumn
fn foreign_key_column() -> Self::ForeignKeyColumn
Source§impl<__FK> BelongsTo<Corpus> for HistoricalRunwhere
__FK: Hash + Eq,
for<'__a> &'__a i32: Into<Option<&'__a __FK>>,
for<'__a> &'__a Corpus: Identifiable<Id = &'__a __FK>,
impl<__FK> BelongsTo<Corpus> for HistoricalRunwhere
__FK: Hash + Eq,
for<'__a> &'__a i32: Into<Option<&'__a __FK>>,
for<'__a> &'__a Corpus: Identifiable<Id = &'__a __FK>,
Source§type ForeignKey = __FK
type ForeignKey = __FK
Source§type ForeignKeyColumn = corpus_id
type ForeignKeyColumn = corpus_id
Source§fn foreign_key(&self) -> Option<&Self::ForeignKey>
fn foreign_key(&self) -> Option<&Self::ForeignKey>
selfSource§fn foreign_key_column() -> Self::ForeignKeyColumn
fn foreign_key_column() -> Self::ForeignKeyColumn
Source§impl<__DB: Backend, __ST0, __ST1, __ST2, __ST3, __ST4, __ST5, __ST6, __ST7> Queryable<(__ST0, __ST1, __ST2, __ST3, __ST4, __ST5, __ST6, __ST7), __DB> for Corpus
impl<__DB: Backend, __ST0, __ST1, __ST2, __ST3, __ST4, __ST5, __ST6, __ST7> Queryable<(__ST0, __ST1, __ST2, __ST3, __ST4, __ST5, __ST6, __ST7), __DB> for Corpus
Auto Trait Implementations§
impl Freeze for Corpus
impl RefUnwindSafe for Corpus
impl Send for Corpus
impl Sync for Corpus
impl Unpin for Corpus
impl UnsafeUnpin for Corpus
impl UnwindSafe for Corpus
Blanket Implementations§
§impl<T> AggregateExpressionMethods for T
impl<T> AggregateExpressionMethods for T
§fn aggregate_distinct(self) -> Self::Outputwhere
Self: DistinctDsl,
fn aggregate_distinct(self) -> Self::Outputwhere
Self: DistinctDsl,
DISTINCT modifier for aggregate functions Read more§fn aggregate_all(self) -> Self::Outputwhere
Self: AllDsl,
fn aggregate_all(self) -> Self::Outputwhere
Self: AllDsl,
ALL modifier for aggregate functions Read more§fn aggregate_filter<P>(self, f: P) -> Self::Outputwhere
P: AsExpression<Bool>,
Self: FilterDsl<<P as AsExpression<Bool>>::Expression>,
fn aggregate_filter<P>(self, f: P) -> Self::Outputwhere
P: AsExpression<Bool>,
Self: FilterDsl<<P as AsExpression<Bool>>::Expression>,
§fn aggregate_order<O>(self, o: O) -> Self::Outputwhere
Self: OrderAggregateDsl<O>,
fn aggregate_order<O>(self, o: O) -> Self::Outputwhere
Self: OrderAggregateDsl<O>,
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSend for T
impl<T> DowncastSend for T
§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<T> IntoCollection<T> for T
impl<T> IntoCollection<T> for T
§fn into_collection<A>(self) -> SmallVec<A>where
A: Array<Item = T>,
fn into_collection<A>(self) -> SmallVec<A>where
A: Array<Item = T>,
self into a collection.fn mapped<U, F, A>(self, f: F) -> SmallVec<A>where
F: FnMut(T) -> U,
A: Array<Item = U>,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> IntoSql for T
impl<T> IntoSql for T
§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling [Attribute] value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi [Quirk] value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the [Condition] value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);