delete/2
This commit is contained in:
parent
59ea540c45
commit
d5351f3dee
40
solution.pl
40
solution.pl
|
@ -43,10 +43,10 @@ If the given table does not exist, the predicate should fail.
|
|||
row(Table, Row) :-
|
||||
tabl(Table, Cols) ->
|
||||
(
|
||||
length(Cols, L),
|
||||
length(Row, L),
|
||||
length(Cols, L),
|
||||
length(Row, L),
|
||||
apply(Table, Row)
|
||||
); fail.
|
||||
); throw("Table doesn't exist").
|
||||
|
||||
:- dynamic rows/1.
|
||||
/*
|
||||
|
@ -130,9 +130,39 @@ prompt, but which may include selectors. Selectors are terms of the form
|
|||
*/
|
||||
delete(Table, Conds) :-
|
||||
(tabl(Table, _) ->
|
||||
(rows(tables, Row), \+ (member(Cond, Conds), \+ Cond) -> retract(Row); true);
|
||||
row(Table, Row),
|
||||
does_match(Conds, Table, Row)
|
||||
;
|
||||
throw("Table doesn't exist")
|
||||
).
|
||||
); true.
|
||||
|
||||
|
||||
does_match([], Table, Row) :-
|
||||
Term =.. [Table | Row],
|
||||
retract(Term),
|
||||
fail.
|
||||
|
||||
does_match([Cond|Rest], Table, Row) :-
|
||||
% Extract the operator, field and value from the condition
|
||||
Cond =.. [Operator | T],
|
||||
[+F, S] = T,
|
||||
|
||||
% Get the columns of the table
|
||||
tabl(Table, Cols),
|
||||
|
||||
% Get the index of the field in the columns
|
||||
member(F, Cols),
|
||||
nth0(Index, Cols, F),
|
||||
|
||||
% Get the value of the field in the row
|
||||
nth0(Index, Row, Value),
|
||||
|
||||
% Apply the operator to the value and the selector
|
||||
apply(Operator, [Value, S]),
|
||||
|
||||
% Check the next condition
|
||||
does_match(Rest, Table, Row).
|
||||
|
||||
|
||||
:- dynamic selec/4.
|
||||
/*
|
||||
|
|
6
tests.pl
6
tests.pl
|
@ -52,16 +52,16 @@ test(drop_inexistant, throws(_)) :-
|
|||
drop(foobar).
|
||||
|
||||
% Test if row/2 returns the different rows of a given table.
|
||||
test(rows, cleanup(cdrop(foo))) :-
|
||||
test(row, cleanup(cdrop(foo))) :-
|
||||
create_table(foo, [bar, baz]),
|
||||
insert(foo, [1, 2]),
|
||||
insert(foo, [3, 4]),
|
||||
rows(foo, Rows),
|
||||
row(foo, Rows),
|
||||
assertion(length(Rows,2)).
|
||||
|
||||
% Test if row/2 fails on an unknown table name.
|
||||
test(row_inexistant, throws(_)) :-
|
||||
rows(foo, _Row).
|
||||
row(foo, _Row).
|
||||
|
||||
% Test if rows/1 works when called for a given table name.
|
||||
test(rows, cleanup(cdrop(foo))) :-
|
||||
|
|
Loading…
Reference in New Issue