1use stam::*;
2use std::collections::BTreeSet;
3
4#[derive(Copy, Clone, Debug, PartialEq)]
5pub enum SplitMode {
6 Retain,
7 Delete,
8}
9
10pub fn split<'a>(
11 store: &'a mut AnnotationStore,
12 queries: Vec<Query<'a>>,
13 mode: SplitMode,
14 verbose: bool,
15) {
16 let mut split_annotations: BTreeSet<AnnotationHandle> = BTreeSet::new();
17 let mut split_resources: BTreeSet<TextResourceHandle> = BTreeSet::new();
18 let mut split_datasets: BTreeSet<AnnotationDataSetHandle> = BTreeSet::new();
19 for (i, query) in queries.into_iter().enumerate() {
20 eprintln!("Running query #{}...", i + 1);
21 let iter = store.query(query).expect("query failed");
22 for resultrow in iter {
23 if let Ok(result) = resultrow.get_by_name_or_last(Some("split")) {
24 match result {
25 QueryResultItem::None => {}
26 QueryResultItem::Annotation(annotation) => {
27 split_annotations.insert(annotation.handle());
28 }
29 QueryResultItem::TextResource(resource) => {
30 split_resources.insert(resource.handle());
31 }
32 QueryResultItem::AnnotationDataSet(dataset) => {
33 split_datasets.insert(dataset.handle());
34 }
35 _ => {
36 eprintln!("Error: Obtained result type is invalid for split, only ANNOTATION, RESOURCE and DATASET work.");
37 }
38 }
39 }
40 }
41 }
42 eprintln!(
43 "Gathered {} annotations, {} resources, {} datasets",
44 split_annotations.len(),
45 split_resources.len(),
46 split_datasets.len()
47 );
48
49 match mode {
50 SplitMode::Delete => {
51 if !split_resources.is_empty() {
53 for resource in split_resources {
54 if verbose {
55 eprintln!("removing resource...");
56 }
57 let _ = store.remove_resource(resource); }
59 }
60 if !split_datasets.is_empty() {
61 for dataset in split_datasets {
62 if verbose {
63 eprintln!("removing dataset...");
64 }
65 let _ = store.remove_dataset(dataset); }
67 }
68 if !split_annotations.is_empty() {
69 for annotation in split_annotations {
70 if verbose {
71 eprintln!("removing annotation...");
72 }
73 let _ = store.remove_annotation(annotation); }
75 }
76 }
77 SplitMode::Retain => {
78 if !split_resources.is_empty() {
80 for resource in 0..store.resources_len() {
81 let resource = TextResourceHandle::new(resource);
82 if store.has(resource) && !split_resources.contains(&resource) {
83 if verbose {
84 eprintln!("removing resource #{}...", resource.as_usize());
85 }
86 let _ = store.remove_resource(resource); }
88 }
89 }
90 if !split_datasets.is_empty() {
91 for dataset in 0..store.datasets_len() {
92 let dataset = AnnotationDataSetHandle::new(dataset);
93 if store.has(dataset) && !split_datasets.contains(&dataset) {
94 if verbose {
95 eprintln!("removing dataset #{}...", dataset.as_usize());
96 }
97 let _ = store.remove_dataset(dataset); }
99 }
100 }
101 if !split_annotations.is_empty() {
102 for annotation in 0..store.annotations_len() {
103 let annotation = AnnotationHandle::new(annotation);
104 if store.has(annotation) && !split_annotations.contains(&annotation) {
105 if verbose {
106 eprintln!("removing annotation #{}...", annotation.as_usize());
107 }
108 let _ = store.remove_annotation(annotation); }
110 }
111 }
112 }
113 }
114}