blob: 324e7db8ed59cc7014271f5686da0211518837d3 [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) {
18 this[prop] = props[prop];
19 };
20 return this;
21 },
22
23 ldType : function (type) {
24 if (arguments.length === 1)
25 this._ldType = type;
26 return this._ldType;
27 },
28
29 parent : function (obj) {
30 if (arguments.length === 1) {
31 this._parent = obj;
32 this.__changed = true;
33 };
34 return this._parent;
35 },
36
37 // Destroy object - especially for
38 // acyclic structures!
39 // I'm paranoid!
40 destroy : function () {
41 if (this._ops != undefined) {
42 this._ops._parent = undefined;
43 if (this._ops._element !== undefined)
44 this._ops._element.refTo = undefined;
45 this._ops = undefined;
46 };
47 if (this._element !== undefined)
48 this._element = undefined;
49
50 // In case of a group, destroy all operands
51 if (this._operands !== undefined) {
52 for (var i = 0; i < this._operands.length; i++)
53 this.getOperand(i).destroy();
54 this._operands = [];
55 };
56 },
57
58 // Wrap a new operation around the root group element
59 wrapOnRoot : function (op) {
60 var parent = this.parent();
61
62 var group = require('vc/docgroup').create(parent);
63 if (arguments.length === 1)
64 group.operation(op);
65 else
66 group.operation(
67 this.operation() === 'and' ? 'or' : 'and'
68 );
69 group.append(this);
70 this.parent(group);
71 group.append();
72 group.element(); // Init (seems to be necessary)
73 parent.root(group);
74 return this.parent();
75 },
76
77 // Be aware! This may be cyclic
78 operators : function (and, or, del) {
79 if (arguments === 0)
80 return this._ops;
81 this._ops = operatorsClass.create(
82 and, or, del
83 );
84 this._ops.parent(this);
85 return this._ops;
86 },
87
88 toJson : function () {
89 return {
90 // Unspecified object
91 "@type" : "koral:" + this.ldType()
92 };
93 },
94
95 toQuery : function () {
96 return '';
97 }
98 };
99});