blob: cfa0accc440952b17565df218fc38943d3661592 [file] [log] [blame]
Nils Diewald0e6992a2015-04-14 20:13:52 +00001/**
2 * Abstract JsonLD criterion object
3 */
4define(['vc/operators'], function (operatorsClass) {
5 return {
6 __changed : false,
7
8 create : function () {
9 return Object.create(this);
10 },
11
12 /**
13 * Upgrade this object to another object
14 * while private data stays intact
15 */
16 upgradeTo : function (props) {
17 for (var prop in props) {
Akron8778f5d2017-06-30 21:25:55 +020018 this[prop] = props[prop];
Nils Diewald0e6992a2015-04-14 20:13:52 +000019 };
20 return this;
21 },
22
23 ldType : function (type) {
24 if (arguments.length === 1)
Akron8778f5d2017-06-30 21:25:55 +020025 this._ldType = type;
Nils Diewald0e6992a2015-04-14 20:13:52 +000026 return this._ldType;
27 },
28
29 parent : function (obj) {
30 if (arguments.length === 1) {
Akron8778f5d2017-06-30 21:25:55 +020031 this._parent = obj;
32 this.__changed = true;
Nils Diewald0e6992a2015-04-14 20:13:52 +000033 };
34 return this._parent;
35 },
36
37 // Destroy object - especially for
38 // acyclic structures!
39 // I'm paranoid!
40 destroy : function () {
Akronb19803c2018-08-16 16:39:42 +020041
Nils Diewald0e6992a2015-04-14 20:13:52 +000042 if (this._ops != undefined) {
Akron8778f5d2017-06-30 21:25:55 +020043 this._ops._parent = undefined;
Akronb19803c2018-08-16 16:39:42 +020044 if (this._ops._element !== undefined) {
Akron8778f5d2017-06-30 21:25:55 +020045 this._ops._element.refTo = undefined;
Akronb19803c2018-08-16 16:39:42 +020046 };
Akron8778f5d2017-06-30 21:25:55 +020047 this._ops = undefined;
Nils Diewald0e6992a2015-04-14 20:13:52 +000048 };
Akronb19803c2018-08-16 16:39:42 +020049
Nils Diewald0e6992a2015-04-14 20:13:52 +000050 if (this._element !== undefined)
Akron8778f5d2017-06-30 21:25:55 +020051 this._element = undefined;
Nils Diewald0e6992a2015-04-14 20:13:52 +000052
53 // In case of a group, destroy all operands
54 if (this._operands !== undefined) {
Akronb50964a2020-10-12 11:44:37 +020055 this._operands.forEach(i => i.destroy());
Akron8778f5d2017-06-30 21:25:55 +020056 this._operands = [];
Nils Diewald0e6992a2015-04-14 20:13:52 +000057 };
58 },
59
60 // Wrap a new operation around the root group element
61 wrapOnRoot : function (op) {
62 var parent = this.parent();
63
64 var group = require('vc/docgroup').create(parent);
65 if (arguments.length === 1)
Akron8778f5d2017-06-30 21:25:55 +020066 group.operation(op);
Nils Diewald0e6992a2015-04-14 20:13:52 +000067 else
Akron8778f5d2017-06-30 21:25:55 +020068 group.operation(
69 this.operation() === 'and' ? 'or' : 'and'
70 );
Nils Diewald0e6992a2015-04-14 20:13:52 +000071 group.append(this);
72 this.parent(group);
73 group.append();
74 group.element(); // Init (seems to be necessary)
75 parent.root(group);
76 return this.parent();
77 },
78
79 // Be aware! This may be cyclic
80 operators : function (and, or, del) {
81 if (arguments === 0)
Akron8778f5d2017-06-30 21:25:55 +020082 return this._ops;
Nils Diewald0e6992a2015-04-14 20:13:52 +000083 this._ops = operatorsClass.create(
Akron8778f5d2017-06-30 21:25:55 +020084 and, or, del
Nils Diewald0e6992a2015-04-14 20:13:52 +000085 );
86 this._ops.parent(this);
87 return this._ops;
88 },
89
90 toJson : function () {
91 return {
Akron8778f5d2017-06-30 21:25:55 +020092 // Unspecified object
93 "@type" : "koral:" + this.ldType()
Nils Diewald0e6992a2015-04-14 20:13:52 +000094 };
95 },
96
Akrond2474aa2018-08-28 12:06:27 +020097 rewrites : function () {
98 return null;
99 },
100
hebastaa0282be2018-12-05 16:58:00 +0100101 incomplete : function () {
102 return false;
103 },
104
Nils Diewald0e6992a2015-04-14 20:13:52 +0000105 toQuery : function () {
106 return '';
107 }
108 };
109});