var RDFns = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
var RDFtype = RDFns + "type";
var EASELq = "http://easel/query/2001/0.1/#";
var EASELsr = "http://easel/sr/2001/0.1/#";

function composeQuery(rootNode) {
debug("rootNode.uri = "+rootNode.uri, 8);
	var q = [];	// Conjunctive constraints
	var d = [];	// disjunctive constraints (from RepresentationFacets)
	var nodeName;

	var r=rootNode.uri.match(/^anon:(.*)$/);
	if (r) {
		nodeName = "A"+r[1];
	} else return "noNodeName";

	// Get the rdf:type property, use it to generate
	// the type-functor.
	var ps;
	if (!(ps = rootNode.getPropertySet(RDFtype))) return "noType!";

	q[0] = encodeType(ps[0]) + "(" + nodeName + ")";

	for (var propName in rootNode.property) {
		if (propName == RDFtype) continue;	// handled
		var cons = isRepFacet(propName) ? d : q;
		r = propName.match(/^http:\/\/easel\/query\/2001\/0\.1\/\#(.*)$/);
		if (r) {
			// Construct a constraint string:
			cons[cons.length] = makeConstraintString(nodeName, propName, rootNode.getPropertySet(propName)[0]);
			continue;
		}
		// Connect us to the next node(s) down...
		rootNode.getPropertySet(propName).forEach(
			function(node) {
				var nodeName2 = encodeNode(node);
				var c = encodeRelationship(propName)+"(" + nodeName + ", " + nodeName2 + ")";
				if (node.uri)
					c = c + ", " + composeQuery(node);
				cons[cons.length] = c;
			}
		);
	}

	if (d.length) q[q.length] = "(" + d.join("; ") + ")";
	return q.join(", ");
}

function makeConstraintString(nodeName, propName, constraintNode) {
	if (propName == EASELq+"hasValue")
		return nodeName + " = " + encodeNode(constraintNode);

	if (propName == EASELq+"containsString")
		return "substring("+nodeName+", "+encodeNode(constraintNode)+")";

	if (propName == EASELq+"taxonBetweenValues")
		return "broaderTerm("+nodeName+", "+encodeNode(constraintNode.getPropertySet(EASELq+"taxonNarrowestTerm")[0])+"), " +
			"broaderTerm("+encodeNode(constraintNode.getPropertySet(EASELq+"taxonBroadestTerm")[0])+", "+nodeName+")";

	return "constraint({" + propName + "}, " + nodeName + ", etc)";
}

function encodeNode(n) {
	if (n.uri) {
		var r=n.uri.match(/^anon:(.*)$/);
		if (r) return "A"+r[1];
		return "{"+n.uri+"}";
	}
	return "\""+n+"\"";
}

function encodeType(n) {
	if (n.uri) {
		var r=n.uri.match(/^http:\/\/easel\/sr\/2001\/0.1\/#(.*)$/);
		//if (r) return r[1].substring(0,1).toLowerCase()+r[1].substring(1);
		if (r) return "is"+r[1];
	}
	return encodeNode(n);
}

function encodeRelationship(p) {
	var r=p.match(/^http:\/\/easel\/sr\/2001\/0.1\/#(.*)$/);
	if (r) return r[1];
	return encodeNode(p);
}

function isRepFacet(p) {
	var r=p.match(/^http:\/\/easel\/sr\/2001\/0.1\/#has(.*)Rep$/);
	if (!r) return false;
	return true;
	if (r[1] == "hasUDCRep") return true;
	if (r[1] == "hasDDCRep") return true;

	return false;
}


