aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/util/ConjunctiveQueryHelper.java
blob: 937c2c4b326330c5327d5eb9b187b9886b18d807 (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
package uk.ac.ox.cs.pagoda.util;

import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;

public class ConjunctiveQueryHelper {
	
	public static String[][] getAnswerVariables(String queryText) {
		Collection<String> disVars = new LinkedList<String>(), undisVars = new LinkedList<String>(); 
		for (String var: getAllVariables(queryText))
			if (var.startsWith("?")) disVars.add(var.substring(1)); 
			else undisVars.add(var.substring(2));
		
		String[] distinguishedVariables = disVars.toArray(new String[0]); 
		String[] undistinguishedVariables = undisVars.toArray(new String[0]); 
		String[] answerVariables = null;
		
		String uppercase = queryText.toUpperCase(); 
		int selectIndex = uppercase.indexOf("SELECT");
		int whereIndex = uppercase.indexOf("WHERE"); 
		String selectClause = queryText.substring(selectIndex + 6, whereIndex); 
		if (selectClause.contains("*")) answerVariables = distinguishedVariables;
		else {
			String[] terms = selectClause.split(" ");
			int num = 0; 
			for (int i = 0; i < terms.length; ++i)
				if (terms[i].startsWith("?")) ++num;
			answerVariables = new String[num]; 
			for (int i = 0, j = 0; i < terms.length; ++i)
				if (terms[i].startsWith("?"))
					answerVariables[j++] = terms[i].substring(1);
		}
	
		if (answerVariables != distinguishedVariables) {
			int index = 0; 
			for (; index < answerVariables.length; ++index) {
				distinguishedVariables[index] = answerVariables[index]; 
				disVars.remove(answerVariables[index]); 
			}
			for (String var: disVars)
				distinguishedVariables[index++] = var; 
		}
		
		return new String[][] { answerVariables, distinguishedVariables, undistinguishedVariables };
	}

	private static Collection<String> getAllVariables(String queryText) {
		Collection<String> vars = new HashSet<String>(); 
		int start, end = 0; 
		char ch; 
		while ((start = queryText.indexOf("?", end)) != -1) {
			end = start + 1; 
			while (end + 1 < queryText.length() && (ch = queryText.charAt(end + 1)) != '\n' && ch != ' ') 
				++end;
			vars.add(queryText.substring(start, end + 1)); 
		}
		
		end = 0; 
		while ((start = queryText.indexOf("_:", end)) != -1) {
			end = start + 1; 
			while (end + 1 < queryText.length() && (ch = queryText.charAt(end + 1)) != '\n' && ch != ' ') 
				++end;
			vars.add(queryText.substring(start, end + 1)); 
		}

		return vars; 
	}

}