cytoscape
Version:
Graph theory (a.k.a. network) library for analysis and visualisation
92 lines (80 loc) • 2.2 kB
JavaScript
import * as is from '../is';
export const valCmp = (fieldVal, operator, value) => {
let matches;
let isFieldStr = is.string( fieldVal );
let isFieldNum = is.number( fieldVal );
let isValStr = is.string(value);
let fieldStr, valStr;
let caseInsensitive = false;
let notExpr = false;
let isIneqCmp = false;
if( operator.indexOf( '!' ) >= 0 ){
operator = operator.replace( '!', '' );
notExpr = true;
}
if( operator.indexOf( '@' ) >= 0 ){
operator = operator.replace( '@', '' );
caseInsensitive = true;
}
if( isFieldStr || isValStr || caseInsensitive ){
fieldStr = !isFieldStr && !isFieldNum ? '' : '' + fieldVal;
valStr = '' + value;
}
// if we're doing a case insensitive comparison, then we're using a STRING comparison
// even if we're comparing numbers
if( caseInsensitive ){
fieldVal = fieldStr = fieldStr.toLowerCase();
value = valStr = valStr.toLowerCase();
}
switch( operator ){
case '*=':
matches = fieldStr.indexOf( valStr ) >= 0;
break;
case '$=':
matches = fieldStr.indexOf( valStr, fieldStr.length - valStr.length ) >= 0;
break;
case '^=':
matches = fieldStr.indexOf( valStr ) === 0;
break;
case '=':
matches = fieldVal === value;
break;
case '>':
isIneqCmp = true;
matches = fieldVal > value;
break;
case '>=':
isIneqCmp = true;
matches = fieldVal >= value;
break;
case '<':
isIneqCmp = true;
matches = fieldVal < value;
break;
case '<=':
isIneqCmp = true;
matches = fieldVal <= value;
break;
default:
matches = false;
break;
}
// apply the not op, but null vals for inequalities should always stay non-matching
if( notExpr && ( fieldVal != null || !isIneqCmp ) ){
matches = !matches;
}
return matches;
};
export const boolCmp = (fieldVal, operator) => {
switch( operator ){
case '?':
return fieldVal ? true : false;
case '!':
return fieldVal ? false : true;
case '^':
return fieldVal === undefined;
}
};
export const existCmp = (fieldVal) => fieldVal !== undefined;
export const data = (ele, field) => ele.data(field);
export const meta = (ele, field) => ele[field]();