aboutsummaryrefslogtreecommitdiff
path: root/src/org/semanticweb/karma2/model/ExtendedConjunctiveQuery.java
blob: de2f87edd7e2981e4ceebbb5ab332d56fbb3f9c1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package org.semanticweb.karma2.model;

import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

import org.semanticweb.HermiT.model.Atom;
import org.semanticweb.HermiT.model.Term;
import org.semanticweb.HermiT.model.Variable;

import uk.ac.ox.cs.JRDFox.Prefixes;


public class ExtendedConjunctiveQuery extends ConjunctiveQuery {

	private Term[] ansTerms;
	private Term[] terms;

	public ExtendedConjunctiveQuery(
			Atom[] queryAtoms, Term[] answerTerms, Prefixes pref) {
		super(queryAtoms, getExtendedHead(queryAtoms, answerTerms), pref);
		this.ansTerms = answerTerms.clone(); 
		terms = getQueryTerms(queryAtoms);
	}

	public int getNumberOfRealAnswerTerms() {
		return ansTerms.length;
	}

	public Term getRealAnswerTerm(int termIndex) {
		return ansTerms[termIndex];
	}

	public int getNumberOfTerms() {
		return terms.length;
	}

	public Term[] getTerms() {
		return terms;
	}
	
	
	public Atom[] getAtoms() {
		return m_queryAtoms;
	}
	
	public Term[] getRealAnswerTerms() {
		return ansTerms;
	}

	private static  Term[] getExtendedHead(Atom[] queryAtoms, Term[] answerTerms) {
		List<Term> terms = new LinkedList<Term>();
		for (Term t :answerTerms) {
			terms.add(t);
		}
		for (Atom a : queryAtoms) {
			if (a.getArgument(0) instanceof Variable && !terms.contains(a.getArgument(0)))
				terms.add(a.getArgument(0));
			if (a.getArity()> 1 && a.getArgument(1) instanceof Variable && !terms.contains(a.getArgument(1)))
				terms.add(a.getArgument(1));
		}
		return terms.toArray(new Term[terms.size()]);
		
	}
	
	private static  Term[] getQueryTerms(Atom[] queryAtoms) {
		Set<Term> terms = new LinkedHashSet<Term>();
		for (Atom a : queryAtoms) {
			terms.add(a.getArgument(0));
			if (a.getArity()> 1)
				terms.add(a.getArgument(1));
		}
		return terms.toArray(new Term[terms.size()]);
	}
	
	
	public static ExtendedConjunctiveQuery computeExtension(ConjunctiveQuery q) {
		Term[] answerTerms = new Term[q.getNumberOfAnswerTerms()];
		for (int i = 0; i < q.getNumberOfAnswerTerms(); i++)
			answerTerms[i] = q.getAnswerTerm(i);
		Atom[] atoms = new Atom[q.getNumberOfQueryAtoms()];
		for (int i = 0; i < q.getNumberOfQueryAtoms(); i++)
			atoms[i] = q.getQueryAtom(i);
		return new ExtendedConjunctiveQuery(atoms, answerTerms,q.prefixes);
		
	}

	public Term getTerm(int i) {
		return terms[i];
	}
	

}