-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathauto-optimize.pl
53 lines (46 loc) · 1.89 KB
/
auto-optimize.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
:- module('plugins/auto_optimize', []).
:- use_module(core(api)).
:- use_module(library(http/http_server)).
optimize_chance(system_descriptor{}, C) =>
C = 0.1.
optimize_chance(D, C), database_descriptor{} :< D =>
C = 0.1.
optimize_chance(D, C), repository_descriptor{} :< D =>
C = 0.1.
optimize_chance(D, C), branch_descriptor{} :< D =>
C = 0.1.
optimize_chance(_, _) => false.
should_optimize(Descriptor) :-
optimize_chance(Descriptor, Chance),
random(X),
X < Chance.
optimize(Descriptor) :-
api_optimize:descriptor_optimize(Descriptor),
resolve_absolute_string_descriptor(Path, Descriptor),
json_log_debug_formatted("Optimized ~s", [Path]).
all_descriptor(Descriptor, Descriptor).
all_descriptor(Descriptor, Parent_Descriptor) :-
get_dict(repository_descriptor, Descriptor, Intermediate_Descriptor),
all_descriptor(Intermediate_Descriptor, Parent_Descriptor).
all_descriptor(Descriptor, Parent_Descriptor) :-
get_dict(database_descriptor, Descriptor, Intermediate_Descriptor),
all_descriptor(Intermediate_Descriptor, Parent_Descriptor).
optimize_all(Validation_Objects) :-
forall((member(V, Validation_Objects),
all_descriptor(V.descriptor, Descriptor),
should_optimize(Descriptor)),
optimize(Descriptor)).
:- multifile thread_pool:create_pool/1.
thread_pool:create_pool(terminusdb_optimizer) :-
current_prolog_flag(cpu_count, Count),
thread_pool_create(terminusdb_optimizer, Count, []).
plugins:post_commit_hook(Validation_Objects, _Meta_Data) :-
( http_server_property(_, _)
-> catch(thread_create_in_pool(terminusdb_optimizer,
optimize_all(Validation_Objects),
_,
[wait(false)]),
error(resource_error(threads_in_pool(terminusdb_optimizer)), _),
true
)
; optimize_all(Validation_Objects)).