package de.fuberlin.wiwiss.d2rq.algebra;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import junit.framework.TestCase;

import com.hp.hpl.jena.graph.Node;

import de.fuberlin.wiwiss.d2rq.expr.Expression;
import de.fuberlin.wiwiss.d2rq.nodes.FixedNodeMaker;
import de.fuberlin.wiwiss.d2rq.nodes.TypedNodeMaker;
import de.fuberlin.wiwiss.d2rq.values.Column;
import de.fuberlin.wiwiss.d2rq.values.Pattern;

public class TripleRelationTest extends TestCase {

	public void testWithPrefix() {
		RelationName original = new RelationName(null, "original");
		RelationName alias = new RelationName(null, "alias");
		AliasMap aliases = AliasMap.create1(original, alias);
		Set projections = new HashSet(Arrays.asList(new Attribute[]{
				new Attribute(original, "id"), 
				new Attribute(alias, "value")}));
		Relation rel = new RelationImpl(
				null, aliases, Expression.TRUE, 
				Collections.EMPTY_SET, projections, false, null, false, Relation.NO_LIMIT, Relation.NO_LIMIT);
		TripleRelation t = new TripleRelation(rel, 
				new TypedNodeMaker(TypedNodeMaker.URI, new Pattern("http://example.org/original/@@original.id@@"), true),
				new FixedNodeMaker(Node.createURI("http://example.org/property"), false),
				new TypedNodeMaker(TypedNodeMaker.PLAIN_LITERAL, new Column(new Attribute(alias, "value")), false));
		assertEquals("URI(Pattern(http://example.org/original/@@original.id@@))", 
				t.nodeMaker(TripleRelation.SUBJECT).toString());
		assertEquals("Literal(Column(alias.value))", 
				t.nodeMaker(TripleRelation.OBJECT).toString());
		assertEquals("AliasMap(original AS alias)", 
				t.baseRelation().aliases().toString());
		TripleRelation t4 = t.withPrefix(4);
		assertEquals("URI(Pattern(http://example.org/original/@@T4_original.id@@))", 
				t4.nodeMaker(TripleRelation.SUBJECT).toString());
		assertEquals("Literal(Column(T4_alias.value))", 
				t4.nodeMaker(TripleRelation.OBJECT).toString());
		assertEquals("AliasMap(original AS T4_alias, original AS T4_original)", 
				t4.baseRelation().aliases().toString());
	}
}
