/************************************************************************
* Copyright (c) 2014 IoT-Solutions e.U.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
************************************************************************/
package iot.jcypher.query.factories.xpression;
import iot.jcypher.query.api.IClause;
import iot.jcypher.query.api.collection.CFactory;
import iot.jcypher.query.api.collection.CFrom;
import iot.jcypher.query.api.collection.CTerminal;
import iot.jcypher.query.api.collection.CWhere;
import iot.jcypher.query.api.collection.CollectFrom;
import iot.jcypher.query.api.collection.Collection;
import iot.jcypher.query.api.collection.EXProperty;
import iot.jcypher.query.api.collection.ExtractExpression;
import iot.jcypher.query.api.collection.ReduceTo;
import iot.jcypher.query.values.JcCollection;
/**
* <div color='red' style="font-size:24px;color:red"><b><i>JCYPHER FACTORY FOR COLLECTION EXPRESSIONS</i></b></div>
*/
public class C {
/**
* <div color='red' style="font-size:24px;color:red"><b><i><u>JCYPHER</u></i></b></div>
* <div color='red' style="font-size:18px;color:red"><i>collect properties from a collection of property containers (nodes or relations), ignore NULL s</i></div>
* <div color='red' style="font-size:18px;color:red"><i>e.g. ...<b>COLLECT()</b>.property("name").from(p.nodes)</i></div>
* <br/>
*/
public static EXProperty<CollectFrom> COLLECT() {
return CFactory.COLLECT();
}
/**
* <div color='red' style="font-size:24px;color:red"><b><i><u>JCYPHER</u></i></b></div>
* <div color='red' style="font-size:18px;color:red"><i>create a collection using a list of clauses.</i></div>
* <div color='red' style="font-size:18px;color:red"><i>This allows to use complex statements as e.g. CASE WHEN ... to create collections</i></div>
* <div color='red' style="font-size:18px;color:red"><i>e.g. ...
* <pre>C.CREATE(new IClause[]{
* CASE.result(),
* WHEN.valueOf(n.property("firstName")).EQUALS("John"),
* NATIVE.cypher("[1]"),
* ELSE.perform(),
* NATIVE.cypher("[]"),
* END.caseXpr()
* })</i></div></pre>
*<div color='red' style="font-size:18px;color:red"><i>This will create an array of size 1 if property firstName equals 'John'
* and an empty array otherwise.
* <br/>You can then e.g. use a FOR_EACH loop to conditionally execute statements.</i></div>
* <br/>
*/
public static CTerminal CREATE(IClause[] clauses) {
return CFactory.CREATE(clauses);
}
/**
* <div color='red' style="font-size:24px;color:red"><b><i><u>JCYPHER</u></i></b></div>
* <div color='red' style="font-size:18px;color:red"><i>go through a collection, run an expression on every element of the collection,
* <br/>and return the results as a collection of these values</i></div>
* <div color='red' style="font-size:18px;color:red"><i>e.g. ...<b>EXTRACT()</b>.valueOf(n.numberProperty("age").div(2)).fromAll(n).IN_nodes(p)</i></div>
* <br/>
*/
public static ExtractExpression EXTRACT() {
return CFactory.EXTRACT();
}
/**
* <div color='red' style="font-size:24px;color:red"><b><i><u>JCYPHER</u></i></b></div>
* <div color='red' style="font-size:18px;color:red"><i>return all the elements in a collection that hold true for a predicate expression</i></div>
* <div color='red' style="font-size:18px;color:red"><i>e.g. ...<b>FILTER()</b>.fromAll(x).IN(a.collectionProperty("array")).<b>WHERE()</b>...</i></div>
* <br/>
*/
public static CFrom<CWhere> FILTER() {
return CFactory.FILTER();
}
/**
* <div color='red' style="font-size:24px;color:red"><b><i><u>JCYPHER</u></i></b></div>
* <div color='red' style="font-size:18px;color:red"><i>run an expression against individual elements of a collection
* </br>and store the result of the expression in an accumulator</i></div>
* <div color='red' style="font-size:18px;color:red"><i>e.g. ...<b>REDUCE()</b><br/>.fromAll(n).IN_nodes(p)<br/>.to(totalAge)<br/>.by(totalAge.plus(n.numberProperty("age")))<br/>.startWith(0)</i></div>
* <br/>
*/
public static CFrom<ReduceTo> REDUCE() {
return CFactory.REDUCE();
}
/**
* <div color='red' style="font-size:24px;color:red"><b><i><u>JCYPHER</u></i></b></div>
* <div color='red' style="font-size:18px;color:red"><i>return all but the first element in a collection</i></div>
* <div color='red' style="font-size:18px;color:red"><i>e.g. ...<b>TAIL()</b>.FILTER()...</i></div>
* <br/>
*/
public static Collection TAIL() {
return CFactory.TAIL();
}
/**
* <div color='red' style="font-size:24px;color:red"><b><i><u>JCYPHER</u></i></b></div>
* <div color='red' style="font-size:18px;color:red"><i>return all but the first element in a collection</i></div>
* <div color='red' style="font-size:18px;color:red"><i>e.g. ...<b>TAIL(p.nodes())</b></i></div>
* <br/>
*/
public static CTerminal TAIL(JcCollection collection) {
return CFactory.TAIL(collection);
}
}