package org.basex.query.func;
import static org.basex.query.QueryText.*;
import static org.basex.query.item.SeqType.*;
import java.util.HashMap;
import org.basex.query.expr.Expr;
import org.basex.query.item.FuncType;
import org.basex.query.item.SeqType;
import org.basex.query.util.NSGlobal;
import org.basex.util.InputInfo;
import org.basex.util.Reflect;
import org.basex.util.TokenBuilder;
/**
* Definitions of all built-in XQuery functions.
* Namespace mappings for function prefixes and URIs are specified in the
* static code in the {@code NSGlobal} class.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public enum Function {
/* FNAcc functions. */
/** XQuery function. */
POSITION(FNAcc.class, "position()", ITR),
/** XQuery function. */
LAST(FNAcc.class, "last()", ITR),
/** XQuery function. */
STRING(FNAcc.class, "string([item])", STR, 0, ITEM_ZO),
/** XQuery function. */
NUMBER(FNAcc.class, "number([item])", DBL, 0, AAT_ZO),
/** XQuery function. */
STRING_LENGTH(FNAcc.class, "string-length([item])", ITR, 0, STR_ZO),
/** XQuery function. */
NORMALIZE_SPACE(FNAcc.class, "normalize-space([string])", STR, 0, STR_ZO),
/** XQuery function. */
NAMESPACE_URI_FROM_QNAME(FNAcc.class, "namespace-uri-from-QName(qname)",
URI_ZO, QNM_ZO),
/* FNAggr functions. */
/** XQuery function. */
AVG(FNAggr.class, "avg(item)", AAT_ZO, AAT_ZM),
/** XQuery function. */
COUNT(FNAggr.class, "count(item)", ITR, ITEM_ZM),
/** XQuery function. */
MAX(FNAggr.class, "max(item[,coll])", AAT_ZO, 1, AAT_ZM, STR),
/** XQuery function. */
MIN(FNAggr.class, "min(item[,coll])", AAT_ZO, 1, AAT_ZM, STR),
/** XQuery function. */
SUM(FNAggr.class, "sum(item[,zero])", AAT_ZO, 1, AAT_ZM, AAT_ZO),
/* FNContext functions. */
/** XQuery function. */
CURRENT_DATE(FNContext.class, "current-date()", DAT),
/** XQuery function. */
CURRENT_DATETIME(FNContext.class, "current-dateTime()", DTM),
/** XQuery function. */
CURRENT_TIME(FNContext.class, "current-time()", TIM),
/** XQuery function. */
IMPLICIT_TIMEZONE(FNContext.class, "implicit-timezone()", DTD),
/** XQuery function. */
DEFAULT_COLLATION(FNContext.class, "default-collation()", STR),
/** XQuery function. */
STATIC_BASE_URI(FNContext.class, "static-base-uri()", URI_ZO),
/* FNDate functions. */
/** XQuery function. */
DAY_FROM_DATE(FNDate.class, "day-from-date(item)", ITR_ZO, DAT_ZO),
/** XQuery function. */
DAY_FROM_DATETIME(FNDate.class, "day-from-dateTime(datetime)",
ITR_ZO, DTM_ZO),
/** XQuery function. */
DAYS_FROM_DURATION(FNDate.class, "days-from-duration(dur)", ITR_ZO, DUR_ZO),
/** XQuery function. */
HOURS_FROM_DATETIME(FNDate.class, "hours-from-dateTime(datetime)",
ITR_ZO, DTM_ZO),
/** XQuery function. */
HOURS_FROM_DURATION(FNDate.class, "hours-from-duration(dur)", ITR_ZO, DUR_ZO),
/** XQuery function. */
HOURS_FROM_TIME(FNDate.class, "hours-from-time(item)", ITR_ZO, TIM_ZO),
/** XQuery function. */
MINUTES_FROM_DATETIME(FNDate.class, "minutes-from-dateTime(datetime)",
ITR_ZO, DTM_ZO),
/** XQuery function. */
MINUTES_FROM_DURATION(FNDate.class, "minutes-from-duration(dur)",
ITR_ZO, DUR_ZO),
/** XQuery function. */
MINUTES_FROM_TIME(FNDate.class, "minutes-from-time(item)", ITR_ZO, TIM_ZO),
/** XQuery function. */
MONTH_FROM_DATE(FNDate.class, "month-from-date(item)", ITR_ZO, DAT_ZO),
/** XQuery function. */
MONTH_FROM_DATETIME(FNDate.class, "month-from-dateTime(datetime)",
ITR_ZO, DTM_ZO),
/** XQuery function. */
MONTHS_FROM_DURATION(FNDate.class, "months-from-duration(dur)",
ITR_ZO, DUR_ZO),
/** XQuery function. */
SECONDS_FROM_DATETIME(FNDate.class, "seconds-from-dateTime(datetime)",
DEC_ZO, DTM_ZO),
/** XQuery function. */
SECONDS_FROM_DURATION(FNDate.class, "seconds-from-duration(dur)",
DEC_ZO, DUR_ZO),
/** XQuery function. */
SECONDS_FROM_TIME(FNDate.class, "seconds-from-time(item)", DEC_ZO, TIM_ZO),
/** XQuery function. */
TIMEZONE_FROM_DATE(FNDate.class, "timezone-from-date(item)", DTD_ZO, DAT_ZO),
/** XQuery function. */
TIMEZONE_FROM_DATETIME(FNDate.class, "timezone-from-dateTime(item)",
DTD_ZO, DTM_ZO),
/** XQuery function. */
TIMEZONE_FROM_TIME(FNDate.class, "timezone-from-time(item)", DTD_ZO, TIM_ZO),
/** XQuery function. */
YEAR_FROM_DATE(FNDate.class, "year-from-date(item)", ITR_ZO, DAT_ZO),
/** XQuery function. */
YEAR_FROM_DATETIME(FNDate.class, "year-from-dateTime(datetime)",
ITR_ZO, DTM_ZO),
/** XQuery function. */
YEARS_FROM_DURATION(FNDate.class, "years-from-duration(dur)", ITR_ZO, DUR_ZO),
/** XQuery function. */
ADJUST_DATE_TO_TIMEZONE(FNDate.class, "adjust-date-to-timezone(date[,zone])",
DAT_ZO, 1, DAT_ZO, DTD_ZO),
/** XQuery function. */
ADJUST_DATETIME_TO_TIMEZONE(FNDate.class,
"adjust-dateTime-to-timezone(date[,zone])", DTM, 1, DTM_ZO, DTD_ZO),
/** XQuery function. */
ADJUST_TIME_TO_TIMEZONE(FNDate.class, "adjust-time-to-timezone(date[,zone])",
TIM_ZO, 1, TIM_ZO, DTD_ZO),
/** XQuery function. */
DATETIME(FNDate.class, "dateTime(date,time)", DTM_ZO, DAT_ZO, TIM_ZO),
/* FNFormat functions. */
/** XQuery function. */
FORMAT_INTEGER(FNFormat.class, "format-integer(number,picture[,lang])",
STR, 2, ITR_ZO, STR, STR),
/** XQuery function. */
FORMAT_NUMBER(FNFormat.class, "format-number(number,picture[,format])",
STR, 2, ITR_ZO, STR, STR),
/** XQuery function. */
FORMAT_DATETIME(FNFormat.class,
"format-dateTime(number,picture,[lang,cal,place])",
STR_ZO, 2, DTM_ZO, STR, STR_ZO, STR_ZO, STR_ZO),
/** XQuery function. */
FORMAT_DATE(FNFormat.class, "format-date(date,picture,[lang,cal,place])",
STR_ZO, 2, DAT_ZO, STR, STR_ZO, STR_ZO, STR_ZO),
/** XQuery function. */
FORMAT_TIME(FNFormat.class, "format-time(number,picture,[lang,cal,place])",
STR_ZO, 2, TIM_ZO, STR, STR_ZO, STR_ZO, STR_ZO),
/* FNFunc functions. */
/** XQuery function. */
FILTER(FNFunc.class, "filter(function,seq)", ITEM_ZM,
FuncType.get(BLN, ITEM).seqType(), ITEM_ZM),
/** XQuery function. */
FUNCTION_NAME(FNFunc.class, "function-name(function)", QNM_ZO, FUN_O),
/** XQuery function. */
FUNCTION_ARITY(FNFunc.class, "function-arity(function)", ITR, FUN_O),
/** XQuery function. */
FUNCTION_LOOKUP(FNFunc.class, "function-lookup(name,arity)", FUN_O, QNM, ITR),
/** XQuery function. */
MAP(FNFunc.class, "map(function,seq)", ITEM_ZM,
FuncType.get(ITEM_ZM, ITEM).seqType(), ITEM_ZM),
/** XQuery function. */
MAP_PAIRS(FNFunc.class, "map-pairs(function,seq1,seq2)", ITEM_ZM,
FuncType.get(ITEM_ZM, ITEM, ITEM).seqType(),
ITEM_ZM, ITEM_ZM),
/** XQuery function. */
FOLD_LEFT(FNFunc.class, "fold-left(function,zero,seq)", ITEM_ZM,
FuncType.get(ITEM_ZM, ITEM_ZM, ITEM).seqType(), ITEM_ZM, ITEM_ZM),
/** XQuery function. */
FOLD_RIGHT(FNFunc.class, "fold-right(function,zero,seq)", ITEM_ZM,
FuncType.get(ITEM_ZM, ITEM, ITEM_ZM).seqType(), ITEM_ZM, ITEM_ZM),
/** XQuery function. */
PARTIAL_APPLY(FNFunc.class, "partial-apply(function,arg[,pos])", FUN_O, 2,
FUN_O, ITEM_ZM, ITR),
/* FNGen functions. */
/** XQuery function. */
DATA(FNGen.class, "data([item])", AAT_ZM, 0, ITEM_ZM),
/** XQuery function. */
COLLECTION(FNGen.class, "collection([uri])", NOD_ZM, 0, STR_ZO),
/** XQuery function. */
DOC(FNGen.class, "doc(uri)", DOC_ZO, STR_ZO),
/** XQuery function. */
DOC_AVAILABLE(FNGen.class, "doc-available(uri)", BLN, STR_ZO),
/** XQuery function. */
PUT(FNGen.class, "put(node,path)", EMP, NOD, STR_ZO),
/** XQuery function. */
UNPARSED_TEXT(FNGen.class, "unparsed-text(uri[,encoding])",
STR_ZO, 1, STR_ZO, STR),
/** XQuery function. */
UNPARSED_TEXT_LINES(FNGen.class, "unparsed-text-lines(uri[,encoding])",
STR_ZM, 1, STR_ZO, STR),
/** XQuery function. */
UNPARSED_TEXT_AVAILABLE(FNGen.class,
"unparsed-text-available(uri[,encoding])", BLN, 1, STR_ZO, STR),
/** XQuery function. */
PARSE_XML(FNGen.class, "parse-xml(string[,base])", DOC_O, 1, STR_ZO, STR),
/** XQuery function. */
URI_COLLECTION(FNGen.class, "uri-collection([uri])", URI_ZM, 0, STR_ZO),
/** XQuery function. */
SERIALIZE(FNGen.class, "serialize(items[,params])", STR, 1, ITEM_ZM, ITEM),
/* FNId functions. */
/** XQuery function. */
ID(FNId.class, "id(string[,item])", ELM_ZM, 1, STR_ZM, NOD),
/** XQuery function. */
IDREF(FNId.class, "idref(string[,item])", NOD_ZM, 1, STR_ZM, NOD),
/** XQuery function. */
LANG(FNId.class, "lang(string[,item])", BLN, 1, STR_ZO, NOD),
/** XQuery function. */
ELEMENT_WITH_ID(FNId.class, "element-with-id(string[,item])",
ELM_ZM, 1, STR_ZM, NOD),
/* FNInfo functions. */
/** XQuery function. */
ERROR(FNInfo.class, "error([code[,desc[,object]]])", EMP, 0,
QNM_ZO, STR, ITEM_ZM),
/** XQuery function. */
TRACE(FNInfo.class, "trace(item,msg)", ITEM_ZM, ITEM_ZM, STR),
/** XQuery function. */
ENVIRONMENT_VARIABLE(FNInfo.class, "environment-variable(string)",
STR_ZO, STR),
/** XQuery function. */
AVAILABLE_ENVIRONMENT_VARIABLES(FNInfo.class,
"available-environment-variables()", STR_ZM),
/* FNNode functions. */
/** XQuery function. */
DOCUMENT_URI(FNNode.class, "document-uri([node])", URI_ZO, 0, NOD_ZO),
/** XQuery function. */
NILLED(FNNode.class, "nilled(node)", BLN_ZO, NOD_ZO),
/** XQuery function. */
NODE_NAME(FNNode.class, "node-name([node])", QNM_ZO, 0, NOD_ZO),
/** XQuery function. */
LOCAL_NAME(FNNode.class, "local-name([node])", STR, 0, NOD_ZO),
/** XQuery function. */
NAME(FNNode.class, "name([node])", STR, 0, NOD_ZO),
/** XQuery function. */
NAMESPACE_URI(FNNode.class, "namespace-uri([node])", URI, 0, NOD_ZO),
/** XQuery function. */
ROOT(FNNode.class, "root([node])", NOD_ZO, 0, NOD_ZO),
/** XQuery function. */
BASE_URI(FNNode.class, "base-uri([node])", URI_ZO, 0, NOD_ZO),
/** XQuery function. */
GENERATE_ID(FNNode.class, "generate-id([node])", STR, 0, NOD_ZO),
/** XQuery function. */
HAS_CHILDREN(FNNode.class, "has-children(node)", BLN, NOD_ZM),
/** XQuery function. */
PATH(FNNode.class, "path([node])", STR_ZO, 0, NOD_ZO),
/* FNNum functions. */
/** XQuery function. */
ABS(FNNum.class, "abs(num)", AAT_ZO, AAT_ZO),
/** XQuery function. */
CEILING(FNNum.class, "ceiling(num)", AAT_ZO, AAT_ZO),
/** XQuery function. */
FLOOR(FNNum.class, "floor(num)", AAT_ZO, AAT_ZO),
/** XQuery function. */
ROUND(FNNum.class, "round(num[,prec])", AAT_ZO, 1, AAT_ZO, ITR),
/** XQuery function. */
ROUND_HALF_TO_EVEN(FNNum.class, "round-half-to-even(num[,prec])",
AAT_ZO, 1, AAT_ZO, ITR),
/* FNPat functions. */
/** XQuery function. */
MATCHES(FNPat.class, "matches(item,pattern[,mod])", BLN, 2, STR_ZO, STR, STR),
/** XQuery function. */
REPLACE(FNPat.class, "replace(item,pattern,replace[,mod])", STR, 3, STR_ZO,
STR, STR, STR),
/** XQuery function. */
TOKENIZE(FNPat.class, "tokenize(item,pattern[,mod])", STR_ZM, 2, STR_ZO,
STR, STR),
/** XQuery function. */
ANALYZE_STRING(FNPat.class, "analyze-string(input,pattern[,mod])",
ELM, 2, STR_ZO, STR, STR),
/* FNQName functions. */
/** XQuery function. */
IN_SCOPE_PREFIXES(FNQName.class, "in-scope-prefixes(elem)", STR_ZM, ELM),
/** XQuery function. */
LOCAL_NAME_FROM_QNAME(FNQName.class, "local-name-from-QName(qname)",
NCN_ZO, QNM_ZO),
/** XQuery function. */
NAMESPACE_URI_FOR_PREFIX(FNQName.class, "namespace-uri-for-prefix(pref,elem)",
URI_ZO, STR_ZO, ELM),
/** XQuery function. */
QNAME(FNQName.class, "QName(uri,name)", QNM, STR_ZO, STR),
/** XQuery function. */
PREFIX_FROM_QNAME(FNQName.class, "prefix-from-QName(qname)", NCN_ZO, QNM_ZO),
/** XQuery function. */
RESOLVE_QNAME(FNQName.class, "resolve-QName(item,base)", QNM_ZO, STR_ZO, ELM),
/** XQuery function. */
RESOLVE_URI(FNQName.class, "resolve-uri(name[,elem])",
URI_ZO, 1, STR_ZO, STR),
/* FNSeq functions. */
/** XQuery function. */
DISTINCT_VALUES(FNSeq.class, "distinct-values(items[,coll])",
AAT_ZM, 1, AAT_ZM, STR),
/** XQuery function. */
INDEX_OF(FNSeq.class, "index-of(items,item[,coll])",
ITR_ZM, 2, AAT_ZM, AAT, STR),
/** XQuery function. */
INSERT_BEFORE(FNSeq.class, "insert-before(items,pos,insert)",
ITEM_ZM, ITEM_ZM, ITR, ITEM_ZM),
/** XQuery function. */
REMOVE(FNSeq.class, "remove(items,pos)", ITEM_ZM, ITEM_ZM, ITR),
/** XQuery function. */
REVERSE(FNSeq.class, "reverse(items)", ITEM_ZM, ITEM_ZM),
/** XQuery function. */
SUBSEQUENCE(FNSeq.class, "subsequence(items,start[,len])",
ITEM_ZM, 2, ITEM_ZM, DBL, DBL),
/** XQuery function. */
HEAD(FNSeq.class, "head(items)", ITEM_ZO, ITEM_ZM),
/** XQuery function. */
TAIL(FNSeq.class, "tail(items)", ITEM_ZM, ITEM_ZM),
/** XQuery function. */
OUTERMOST(FNSeq.class, "outermost(nodes)", NOD_ZM, NOD_ZM),
/** XQuery function. */
INNERMOST(FNSeq.class, "innermost(nodes)", NOD_ZM, NOD_ZM),
/* FNSimple functions. */
/** XQuery function. */
FALSE(FNSimple.class, "false()", BLN),
/** XQuery function. */
TRUE(FNSimple.class, "true()", BLN),
/** XQuery function. */
BOOLEAN(FNSimple.class, "boolean(item)", BLN, ITEM_ZM),
/** XQuery function. */
NOT(FNSimple.class, "not(item)", BLN, ITEM_ZM),
/** XQuery function. */
EMPTY(FNSimple.class, "empty(item)", BLN, ITEM_ZM),
/** XQuery function. */
EXISTS(FNSimple.class, "exists(item)", BLN, ITEM_ZM),
/** XQuery function. */
UNORDERED(FNSimple.class, "unordered(item)", ITEM_ZM, ITEM_ZM),
/** XQuery function. */
ZERO_OR_ONE(FNSimple.class, "zero-or-one(item)", ITEM_ZO, ITEM_ZM),
/** XQuery function. */
EXACTLY_ONE(FNSimple.class, "exactly-one(item)", ITEM, ITEM_ZM),
/** XQuery function. */
ONE_OR_MORE(FNSimple.class, "one-or-more(item)", ITEM_OM, ITEM_ZM),
/** XQuery function. */
DEEP_EQUAL(FNSimple.class, "deep-equal(item,item[,coll])",
BLN, 2, ITEM_ZM, ITEM_ZM, STR),
/* FNStr functions. */
/** XQuery function. */
CODEPOINT_EQUAL(FNStr.class, "codepoint-equal(string,string)",
BLN_ZO, STR_ZO, STR_ZO),
/** XQuery function. */
CODEPOINTS_TO_STRING(FNStr.class, "codepoints-to-string(nums)", STR, ITR_ZM),
/** XQuery function. */
COMPARE(FNStr.class, "compare(first,second[,coll])",
ITR_ZO, 2, STR_ZO, STR_ZO, STR),
/** XQuery function. */
CONCAT(FNStr.class, "concat(atom,atom[,...])", STR, -2, AAT_ZO, AAT_ZO),
/** XQuery function. */
CONTAINS(FNStr.class, "contains(string,sub[,coll])",
BLN, 2, STR_ZO, STR_ZO, STR),
/** XQuery function. */
ENCODE_FOR_URI(FNStr.class, "encode-for-uri(string)", STR, STR_ZO),
/** XQuery function. */
ENDS_WITH(FNStr.class, "ends-with(string,sub[,coll])",
BLN, 2, STR_ZO, STR_ZO, STR),
/** XQuery function. */
ESCAPE_HTML_URI(FNStr.class, "escape-html-uri(string)", STR, STR_ZO),
/** XQuery function. */
IRI_TO_URI(FNStr.class, "iri-to-uri(string)", STR, STR_ZO),
/** XQuery function. */
LOWER_CASE(FNStr.class, "lower-case(string)", STR, STR_ZO),
/** XQuery function. */
NORMALIZE_UNICODE(FNStr.class, "normalize-unicode(string[,form])",
STR, 1, STR_ZO, STR),
/** XQuery function. */
STARTS_WITH(FNStr.class, "starts-with(string,sub[,coll])",
BLN, 2, STR_ZO, STR_ZO, STR),
/** XQuery function. */
STRING_JOIN(FNStr.class, "string-join(strings[,sep])", STR, 1, STR_ZM, STR),
/** XQuery function. */
STRING_TO_CODEPOINTS(FNStr.class, "string-to-codepoints(string)",
ITR_ZM, STR_ZO),
/** XQuery function. */
SUBSTRING(FNStr.class, "substring(string,start[,len])",
STR, 2, STR_ZO, DBL, DBL),
/** XQuery function. */
SUBSTRING_AFTER(FNStr.class, "substring-after(string,sub[,coll])",
STR, 2, STR_ZO, STR_ZO, STR),
/** XQuery function. */
SUBSTRING_BEFORE(FNStr.class, "substring-before(string,sub[,coll])",
STR, 2, STR_ZO, STR_ZO, STR),
/** XQuery function. */
TRANSLATE(FNStr.class, "translate(string,map,trans)", STR, STR_ZO, STR, STR),
/** XQuery function. */
UPPER_CASE(FNStr.class, "upper-case(string)", STR, STR_ZO),
/* FNMap functions. */
/** XQuery Function. */
_MAP_NEW(FNMap.class, "new([maps[,coll]])", MAP_O, 0, MAP_ZM, STR),
/** XQuery Function. */
_MAP_ENTRY(FNMap.class, "entry(key,value)", MAP_O, AAT, ITEM_ZM),
/** XQuery Function. */
_MAP_GET(FNMap.class, "get(map,key)", ITEM_ZM, MAP_O, AAT),
/** XQuery Function. */
_MAP_CONTAINS(FNMap.class, "contains(map,key)", BLN, MAP_O, AAT),
/** XQuery Function. */
_MAP_REMOVE(FNMap.class, "remove(map,key)", MAP_O, MAP_O, AAT),
/** XQuery Function. */
_MAP_SIZE(FNMap.class, "size(map)", ITR, MAP_O),
/** XQuery Function. */
_MAP_KEYS(FNMap.class, "keys(map)", AAT_ZM, MAP_O),
/** XQuery Function. */
_MAP_COLLATION(FNMap.class, "collation(map)", STR, MAP_O),
/* FNMath functions. */
/** XQuery math function. */
_MATH_PI(FNMath.class, "pi()", DBL),
/** XQuery math function. */
_MATH_SQRT(FNMath.class, "sqrt(number)", DBL_ZO, DBL_ZO),
/** XQuery math function. */
_MATH_SIN(FNMath.class, "sin(number)", DBL_ZO, DBL_ZO),
/** XQuery math function. */
_MATH_COS(FNMath.class, "cos(number)", DBL_ZO, DBL_ZO),
/** XQuery math function. */
_MATH_TAN(FNMath.class, "tan(number)", DBL_ZO, DBL_ZO),
/** XQuery math function. */
_MATH_ASIN(FNMath.class, "asin(number)", DBL_ZO, DBL_ZO),
/** XQuery math function. */
_MATH_ACOS(FNMath.class, "acos(number)", DBL_ZO, DBL_ZO),
/** XQuery math function. */
_MATH_ATAN(FNMath.class, "atan(number)", DBL_ZO, DBL_ZO),
/** XQuery math function. */
_MATH_ATAN2(FNMath.class, "atan2(number,number)", DBL, DBL, DBL),
/** XQuery math function. */
_MATH_POW(FNMath.class, "pow(number,number)", DBL_ZO, DBL_ZO, ITR),
/** XQuery math function. */
_MATH_EXP(FNMath.class, "exp(number)", DBL_ZO, DBL_ZO),
/** XQuery math function. */
_MATH_EXP10(FNMath.class, "exp10(number)", DBL_ZO, DBL_ZO),
/** XQuery math function. */
_MATH_LOG(FNMath.class, "log(number)", DBL_ZO, DBL_ZO),
/** XQuery math function. */
_MATH_LOG10(FNMath.class, "log10(number)", DBL_ZO, DBL_ZO),
/** XQuery math function (project specific). */
_MATH_RANDOM(FNMath.class, "random()", DBL),
/** XQuery math function (project specific). */
_MATH_E(FNMath.class, "e()", DBL),
/** XQuery math function (project specific). */
_MATH_SINH(FNMath.class, "sinh(number)", DBL_ZO, DBL_ZO),
/** XQuery math function (project specific). */
_MATH_COSH(FNMath.class, "cosh(number)", DBL_ZO, DBL_ZO),
/** XQuery math function (project specific). */
_MATH_TANH(FNMath.class, "tanh(number)", DBL_ZO, DBL_ZO),
/* FNDb functions. */
/** Database function: opens a database. */
_DB_OPEN(FNDb.class, "open(database[,path])", NOD_ZM, 1, STR, STR),
/** Database function: opens a specific database node. */
_DB_OPEN_PRE(FNDb.class, "open-pre(database,pre)", NOD_ZM, STR, ITR),
/** Database function: opens a specific database node. */
_DB_OPEN_ID(FNDb.class, "open-id(database,id)", NOD_ZM, STR, ITR),
/** Database function: searches the text index. */
_DB_TEXT(FNDb.class, "text(database,string)", NOD_ZM, STR, ITEM),
/** Database function: searches the attribute index. */
_DB_ATTRIBUTE(FNDb.class, "attribute(database,string[,name])",
NOD_ZM, 2, STR, ITEM, STR),
/** Database function: searches the full-text index. */
_DB_FULLTEXT(FNDb.class, "fulltext(database,string)", NOD_ZM, STR, STR),
/** Database function: lists all databases or documents in a database. */
_DB_LIST(FNDb.class, "list([database[,path]])", STR_ZM, 0, STR, STR),
/** Database function: lists databases details. */
_DB_LIST_DETAILS(FNDb.class, "list-details([database[,path]])",
NOD_ZM, 0, STR, STR),
/** Database function: lists system information. */
_DB_SYSTEM(FNDb.class, "system()", STR),
/** Database function: returns database or index information. */
_DB_INFO(FNDb.class, "info(database)", STR, STR),
/** Database function: returns the node ids of database nodes. */
_DB_NODE_ID(FNDb.class, "node-id(nodes)", ITR_ZM, NOD_ZM),
/** Database function: returns the pre values of database nodes. */
_DB_NODE_PRE(FNDb.class, "node-pre(nodes)", ITR_ZM, NOD_ZM),
/** Database function: sends result to connected clients. */
_DB_EVENT(FNDb.class, "event(name,query)", EMP, STR, ITEM_ZM),
/** Database function: add document(s) to a database. */
_DB_ADD(FNDb.class, "add(database,nodes[,name[,path]])",
EMP, 2, STR, DOC_ZM, STR, STR),
/** Database function: delete document(s) from a database. */
_DB_DELETE(FNDb.class, "delete(database,path)", EMP, STR, STR),
/** Database function: rename document(s). */
_DB_RENAME(FNDb.class, "rename(database,path,newpath)", EMP, STR, STR, STR),
/** Database function: replace document(s). */
_DB_REPLACE(FNDb.class, "replace(database,path,item)", EMP, STR, STR, ITEM),
/** Database function: optimize database structures. */
_DB_OPTIMIZE(FNDb.class, "optimize(database[,all])", EMP, 1, STR, BLN),
/** Database function: retrieves binary data. */
_DB_RETRIEVE(FNDb.class, "retrieve(database,path)", B64, STR, STR),
/** Database function: stores binary data. */
_DB_STORE(FNDb.class, "store(database,path,value)", EMP, STR, STR, ITEM),
/** Database function: checks if the specified resource is an xml document. */
_DB_IS_XML(FNDb.class, "is-xml(database,path)", BLN, STR, STR),
/** Database function: checks if the specified resource is a raw file. */
_DB_IS_RAW(FNDb.class, "is-raw(database,path)", BLN, STR, STR),
/** Database function: checks if the specified database or resource exists. */
_DB_EXISTS(FNDb.class, "exists(database[,path])", BLN, 1, STR, STR),
/** Database function: returns the content type of a database file. */
_DB_CONTENT_TYPE(FNDb.class, "content-type(database,path)", ITEM, STR, STR),
/* FNIndex functions. */
/** Index function: returns index facet information. */
_INDEX_FACETS(FNIndex.class, "facets(database, format)", DOC_O, 1, STR, STR),
/** Index function: returns texts. */
_INDEX_TEXTS(FNIndex.class, "texts(database, prefix)", NOD_ZM, 1, STR, STR),
/** Index function: returns attribute values. */
_INDEX_ATTRIBUTES(FNIndex.class, "attributes(database, prefix)",
NOD_ZM, 1, STR, STR),
/** Index function: returns element names. */
_INDEX_ELEMENT_NAMES(FNIndex.class, "element-names(database)", NOD_ZM, STR),
/** Index function: returns attribute names. */
_INDEX_ATTRIBUTE_NAMES(FNIndex.class, "attribute-names(database)",
NOD_ZM, STR),
/* FNFile functions (EXPath). */
/** XQuery function */
_FILE_EXISTS(FNFile.class, "exists(path)", BLN, STR),
/** XQuery function */
_FILE_IS_DIRECTORY(FNFile.class, "is-directory(path)", BLN, STR),
/** XQuery function */
_FILE_IS_FILE(FNFile.class, "is-file(path)", BLN, STR),
/** XQuery function */
_FILE_LAST_MODIFIED(FNFile.class, "last-modified(path)", DTM, STR),
/** XQuery function */
_FILE_SIZE(FNFile.class, "size(path)", ITR, STR),
/** XQuery function */
_FILE_BASE_NAME(FNFile.class, "base-name(path[,suffix])", STR, 1, STR, STR),
/** XQuery function */
_FILE_DIR_NAME(FNFile.class, "dir-name(path)", STR, STR),
/** XQuery function */
_FILE_PATH_TO_NATIVE(FNFile.class, "path-to-native(path)", STR, STR),
/** XQuery function */
_FILE_PATH_TO_URI(FNFile.class, "path-to-uri(path)", URI, STR),
/** XQuery function */
_FILE_RESOLVE_PATH(FNFile.class, "resolve-path(path)", STR, STR),
/** XQuery function */
_FILE_LIST(FNFile.class, "list(path[,recursive[,pattern]])",
STR_ZM, 1, STR, BLN, STR),
/** XQuery function */
_FILE_CREATE_DIRECTORY(FNFile.class, "create-directory(path)", EMP, STR),
/** XQuery function */
_FILE_DELETE(FNFile.class, "delete(path)", EMP, STR),
/** XQuery function */
_FILE_READ_TEXT(FNFile.class, "read-text(path[,encoding])", STR, 1, STR, STR),
/** XQuery function */
_FILE_READ_TEXT_LINES(FNFile.class, "read-text-lines(path[,encoding])",
STR_ZM, 1, STR, STR),
/** XQuery function */
_FILE_READ_BINARY(FNFile.class, "read-binary(path)", B64, STR),
/** XQuery function */
_FILE_WRITE(FNFile.class, "write(path,data[,params])",
EMP, 2, STR, ITEM_ZM, NOD),
/** XQuery function */
_FILE_WRITE_BINARY(FNFile.class, "write-binary(path,item)",
EMP, STR, ITEM_ZM),
/** XQuery function */
_FILE_APPEND(FNFile.class, "append(path,data[,params])",
EMP, 2, STR, ITEM_ZM, NOD),
/** XQuery function */
_FILE_APPEND_BINARY(FNFile.class, "append-binary(path,item)",
EMP, STR, ITEM_ZM),
/** XQuery function */
_FILE_COPY(FNFile.class, "copy(source,target)", EMP, STR, STR),
/** XQuery function */
_FILE_MOVE(FNFile.class, "move(source,target)", EMP, STR, STR),
/* FNSql functions. */
/** XQuery function */
_SQL_INIT(FNSql.class, "init(class)", EMP, 1, STR),
/** XQuery function */
_SQL_CONNECT(FNSql.class, "connect(url[,user[,pass[,options]]]]])",
ITR, 1, STR, STR, STR, NOD_ZO),
/** XQuery function */
_SQL_PREPARE(FNSql.class, "prepare(id,statement)", ITR, ITR, STR),
/** XQuery function */
_SQL_EXECUTE(FNSql.class, "execute(id[,item])", ELM_ZM, 1, ITR, ITEM_ZO),
/** XQuery function */
_SQL_CLOSE(FNSql.class, "close(id)", EMP, ITR),
/** XQuery function */
_SQL_COMMIT(FNSql.class, "commit(id)", EMP, ITR),
/** XQuery function */
_SQL_ROLLBACK(FNSql.class, "rollback(id)", EMP, ITR),
/* FNRepo functions. */
/** XQuery function. */
_REPO_INSTALL(FNRepo.class, "install(uri)", EMP, STR),
/** XQuery function. */
_REPO_DELETE(FNRepo.class, "delete(uri)", EMP, STR),
/** XQuery function. */
_REPO_LIST(FNRepo.class, "list()", STR_ZM),
/* FNFt functions. */
/** Full-text function: searches the full-text index. */
_FT_SEARCH(FNFt.class, "search(node,string)", NOD_ZM, NOD, STR),
/** Full-text function: counts the hits of a full-text request. */
_FT_COUNT(FNFt.class, "count(nodes)", ITR, NOD_ZM),
/** Full-text function: marks the hits of a full-text request. */
_FT_MARK(FNFt.class, "mark(nodes[,tag])", NOD_ZM, 1, NOD_ZM, STR),
/** Full-text function: extracts full-text results. */
_FT_EXTRACT(FNFt.class, "extract(nodes[,tag[,length]])",
NOD_ZM, 1, ITEM_ZM, STR, ITR),
/** Full-text function: returns the full-text score. */
_FT_SCORE(FNFt.class, "score(items)", DBL_ZM, ITEM_ZM),
/** Full-text function: returns indexed tokens. */
_FT_TOKENS(FNFt.class, "tokens(database, prefix)",
ITEM_ZM, 1, STR, STR),
/** Full-text function: tokenizes the specified string. */
_FT_TOKENIZE(FNFt.class, "tokenize(string)", STR_ZM, STR),
/* FNHof functions. */
/** XQuery function. */
_HOF_SORT_WITH(FNHof.class, "sort-with(lt-fun,seq)", ITEM_ZM,
FuncType.get(BLN, ITEM, ITEM).seqType(), ITEM_ZM),
/** XQuery function. */
_HOF_ID(FNHof.class, "id(expr)", ITEM_ZM, ITEM_ZM),
/** XQuery function. */
_HOF_CONST(FNHof.class, "const(return,ignore)", ITEM_ZM, ITEM_ZM, ITEM_ZM),
/** XQuery function. */
_HOF_UNTIL(FNHof.class, "until(pred,func,start)", ITEM_ZM,
FuncType.get(BLN, ITEM_ZM).seqType(),
FuncType.get(ITEM_ZM, ITEM_ZM).seqType(), ITEM_ZM),
/** XQuery function. */
_HOF_FOLD_LEFT1(FNHof.class, "fold-left1(function,non-empty-seq)", ITEM_ZM,
FuncType.get(ITEM_ZM, ITEM_ZM, ITEM).seqType(), ITEM_OM),
/** XQuery Function. */
_HOF_ITERATE(FNHof.class, "iterate(fun, seq)", ITEM_ZM,
FuncType.arity(1).seqType(), ITEM_ZM),
/* FNCrypto functions (EXPath Cryptographic module). */
/** Create message authentication code (HMAC). */
_CRYPTO_HMAC(FNCrypto.class, "hmac(string,string,string[,string])",
STR, 3, STR, STR, STR, STR_ZO),
/** Encrypt message. */
_CRYPTO_ENCRYPT(FNCrypto.class, "encrypt(string, string, string, string)",
STR, STR, STR, STR, STR),
/** Decrypt message. */
_CRYPTO_DECRYPT(FNCrypto.class, "decrypt(string, string, string, string)",
STR, STR, STR, STR, STR),
/** Generate signature. */
_CRYPTO_GENERATE_SIGNATURE(FNCrypto.class, "generate-signature" +
"(node,string,string,string,string,string[,item][,item])",
NOD, 6, NOD, STR, STR, STR, STR, STR, ITEM_ZO, ITEM_ZO),
/** Validate signature. */
_CRYPTO_VALIDATE_SIGNATURE(FNCrypto.class, "validate-signature(node)",
BLN, NOD),
/* FNHttp functions (EXPath). */
/** XQuery function */
_HTTP_SEND_REQUEST(FNHttp.class, "send-request(request[,href,[bodies]])",
ITEM_ZM, 1, NOD, STR_ZO, ITEM_ZM),
/* FNJson functions. */
/** JSON function: convert JSON to XML. */
_JSON_PARSE(FNJson.class, "parse(string)", NOD, STR),
/** JSON function: convert JSON to XML. */
_JSON_PARSE_ML(FNJson.class, "parse-ml(string)", NOD, STR),
/** JSON function: convert XML to JSON. */
_JSON_SERIALIZE(FNJson.class, "serialize(node)", STR, NOD),
/** JSON function: convert XML to JsonML. */
_JSON_SERIALIZE_ML(FNJson.class, "serialize-ml(node)", STR, NOD),
/* FNUtil functions. */
/** Utility function: evaluates the specified query. */
_UTIL_EVAL(FNUtil.class, "eval(string)", ITEM_ZM, STR_ZO),
/** Utility function: evaluates the specified query file. */
_UTIL_RUN(FNUtil.class, "run(string)", ITEM_ZM, STR),
/** Utility function: formats a string using the printf syntax. */
_UTIL_FORMAT(FNUtil.class, "format(format,item1[,...])", STR, -2, STR, ITEM),
/** Utility function: dumps the memory consumption. */
_UTIL_MEM(FNUtil.class, "mem(expr[,cache])", ITEM_ZM, 1, ITEM_ZM, BLN),
/** Utility function: dumps the execution time of an expression. */
_UTIL_TIME(FNUtil.class, "time(expr[,cache])", ITEM_ZM, 1, ITEM_ZM, BLN),
/** Utility function: converts a number to a given base. */
_UTIL_INTEGER_TO_BASE(FNUtil.class, "integer-to-base(num,base)",
STR, ITR, ITR),
/** Utility function: decodes a number from a given base. */
_UTIL_INTEGER_FROM_BASE(FNUtil.class, "integer-from-base(str,base)",
ITR, STR, ITR),
/** Utility function: calculates the MD5 hash of the given string. */
_UTIL_MD5(FNUtil.class, "md5(str)", HEX, STR),
/** Utility function: calculates the SHA1 hash of the given string. */
_UTIL_SHA1(FNUtil.class, "sha1(str)", HEX, STR),
/** Utility function: calculates the CRC32 hash of the given string. */
_UTIL_CRC32(FNUtil.class, "crc32(str)", HEX, STR),
/** Utility function: gets the bytes from the given data data. */
_UTIL_TO_BYTES(FNUtil.class, "to-bytes(item)", BYT_ZM, ITEM),
/** Utility function: converts the specified bytes to a string. */
_UTIL_TO_STRING(FNUtil.class, "to-string(item[,encoding])", STR, 1,
ITEM, STR),
/** Utility function: returns a random unique id. */
_UTIL_UUID(FNUtil.class, "uuid()", STR),
/** Utility function: compares items in depth and offers some more options. */
_UTIL_DEEP_EQUAL(FNUtil.class, "deep-equal(item,item[,options])",
BLN, 2, ITEM_ZM, ITEM_ZM, ITEM),
/** Utility function: returns the path to the query file. */
_UTIL_PATH(FNUtil.class, "path()", STR),
/* FNXslt functions. */
/** XSLT function: performs an XSLT transformation. */
_UTIL_TRANSFORM(FNXslt.class, "transform(input,stylesheet[,params])",
NOD, 2, ITEM, ITEM, NOD_ZO),
/* FNZip functions (EXPath). */
/** XQuery function */
_ZIP_BINARY_ENTRY(FNZip.class, "binary-entry(path,entry)", B64, STR, STR),
/** XQuery function */
_ZIP_TEXT_ENTRY(FNZip.class, "text-entry(path,entry[,encoding])",
STR, 2, STR, STR, STR),
/** XQuery function */
_ZIP_HTML_ENTRY(FNZip.class, "html-entry(path,entry)", NOD, STR, STR),
/** XQuery function */
_ZIP_XML_ENTRY(FNZip.class, "xml-entry(path,entry)", NOD, STR, STR),
/** XQuery function */
_ZIP_ENTRIES(FNZip.class, "entries(path)", ELM, STR),
/** XQuery function */
_ZIP_ZIP_FILE(FNZip.class, "zip-file(zip)", EMP, ELM),
/** XQuery function */
_ZIP_UPDATE_ENTRIES(FNZip.class, "update-entries(zip,output)", EMP, ELM, STR);
/** Updating functions. */
public static final Function[] UPDATING = {
PUT, _DB_ADD, _DB_DELETE, _DB_RENAME, _DB_REPLACE, _DB_OPTIMIZE, _DB_STORE
};
/**
* Mapping between function classes and namespace URIs.
* If no mapping exists, {@link #FNURI} will be assumed as default mapping.
*/
private static final HashMap<Class<? extends StandardFunc>, byte[]> URIS =
new HashMap<Class<? extends StandardFunc>, byte[]>();
// initialization of class/uri mappings and statically known modules
static {
// W3 functions
URIS.put(FNMap.class, MAPURI);
URIS.put(FNMath.class, MATHURI);
// EXPath functions
URIS.put(FNCrypto.class, CRYPTOURI);
URIS.put(FNFile.class, FILEURI);
URIS.put(FNHttp.class, HTTPURI);
URIS.put(FNZip.class, ZIPURI);
URIS.put(FNRepo.class, REPOURI);
// internal functions
URIS.put(FNDb.class, DBURI);
URIS.put(FNFt.class, FTURI);
URIS.put(FNHof.class, HOFURI);
URIS.put(FNIndex.class, INDEXURI);
URIS.put(FNJson.class, JSONURI);
URIS.put(FNSql.class, SQLURI);
URIS.put(FNUtil.class, UTILURI);
URIS.put(FNXslt.class, XSLTURI);
}
/** Minimum number of arguments. */
public final int min;
/** Maximum number of arguments. */
public final int max;
/** Argument types. */
public final SeqType[] args;
/** Descriptions. */
final String desc;
/** Return type. */
final SeqType ret;
/** Function classes. */
private final Class<? extends StandardFunc> func;
/**
* Default constructor.
* @param fun function class
* @param dsc description
* @param r return type
* @param typ arguments types
*/
Function(final Class<? extends StandardFunc> fun, final String dsc,
final SeqType r, final SeqType... typ) {
this(fun, dsc, r, typ.length, typ);
}
/**
* Full constructor for functions with multiple signatures.
* @param fun function class
* @param dsc description
* @param r return type
* @param m minimum number of arguments; if the value is negative,
* the maximum number of arguments is variable
* @param typ arguments types
*/
Function(final Class<? extends StandardFunc> fun, final String dsc,
final SeqType r, final int m, final SeqType... typ) {
func = fun;
desc = dsc;
ret = r;
min = m < 0 ? -m : m;
max = m < 0 ? Integer.MAX_VALUE : typ.length;
args = typ;
}
/**
* Creates a new instance of the function.
* @param ii input info
* @param arg arguments
* @return function
*/
public StandardFunc get(final InputInfo ii, final Expr... arg) {
return (StandardFunc) Reflect.get(Reflect.find(
func, InputInfo.class, Function.class, Expr[].class), ii, this, arg);
}
/**
* Returns the namespace URI of this function.
* @return function
*/
final byte[] uri() {
final byte[] u = URIS.get(func);
return u == null ? FNURI : u;
}
/**
* Returns the function type of this function with the given arity.
* @param arity number of arguments
* @return function type
*/
final FuncType type(final int arity) {
final SeqType[] arg = new SeqType[arity];
if(arity != 0 && max == Integer.MAX_VALUE) {
System.arraycopy(args, 0, arg, 0, args.length);
final SeqType var = args[args.length - 1];
for(int i = args.length; i < arg.length; i++) arg[i] = var;
} else {
System.arraycopy(args, 0, arg, 0, arity);
}
return FuncType.get(ret, arg);
}
/**
* Returns a string representation of the function with the specified
* arguments. All objects are wrapped with quotes,
* except for the following ones:
* <ul>
* <li>integers</li>
* <li>booleans (which will be suffixed with parentheses)</li>
* <li>strings starting with an optional NCName and opening parenthesis</li>
* <li>strings starting with angle bracket, quote, dollar sign, or space</li>
* </ul>
* @param arg arguments
* @return string representation
*/
public final String args(final Object... arg) {
final TokenBuilder tb = new TokenBuilder();
for(final Object a : arg) {
if(tb.size() != 0) tb.add(',');
final String s = a.toString();
if(s.matches("^([-\\w_:\\.]*\\(|<|\"|\\$| ).*") ||
a instanceof Integer) {
tb.add(s);
} else if(a instanceof Boolean) {
tb.add(s + "()");
} else {
tb.add('"' + s.replaceAll("\"", "\"\"") + '"');
}
}
return toString().replaceAll("\\(.*", "(") + tb + ')';
}
@Override
public final String toString() {
final byte[] pref = NSGlobal.prefix(uri());
return new TokenBuilder(pref).add(':').add(desc).toString();
}
}