package com.mysema.rdfbean.query;
import java.lang.reflect.Method;
import java.util.Locale;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import com.mysema.query.DefaultQueryMetadata;
import com.mysema.query.QueryMetadata;
import com.mysema.query.support.QueryMixin;
import com.mysema.query.types.PathImpl;
import com.mysema.query.types.path.PathBuilder;
import com.mysema.query.types.template.BooleanTemplate;
import com.mysema.rdfbean.TEST;
import com.mysema.rdfbean.model.BID;
import com.mysema.rdfbean.model.MiniRepository;
import com.mysema.rdfbean.model.QueryLanguage;
import com.mysema.rdfbean.model.RDFConnection;
import com.mysema.rdfbean.model.RDFQueryImpl;
import com.mysema.rdfbean.model.SPARQLVisitor;
import com.mysema.rdfbean.model.UID;
import com.mysema.rdfbean.object.BeanSubQuery;
import com.mysema.rdfbean.object.Configuration;
import com.mysema.rdfbean.object.ConfigurationOntology;
import com.mysema.rdfbean.object.DefaultConfiguration;
import com.mysema.rdfbean.object.Session;
import com.mysema.rdfbean.object.SessionImpl;
import com.mysema.rdfbean.ontology.Ontology;
@SuppressWarnings("unchecked")
public class RDFQueryBuilderTest {
private QueryMetadata metadata;
private RDFQueryBuilder builder;
private final PathBuilder<User> user = new PathBuilder<User>(User.class, "user");
private final PathBuilder<User> user2 = new PathBuilder<User>(User.class, "user2");
private QueryMixin query;
private User createUser() {
User user = new User();
user.id = new BID();
return user;
}
@Before
public void setUp() {
metadata = new DefaultQueryMetadata();
RDFConnection connection = new MiniRepository().openConnection();
Configuration configuration = new DefaultConfiguration(User.class);
Ontology ontology = new ConfigurationOntology(configuration);
Session session = new SessionImpl(configuration, new ConfigurationOntology(configuration), connection);
builder = new RDFQueryBuilder(connection, session, configuration, ontology, metadata);
query = new QueryMixin(metadata);
}
@Test
public void Between() throws Exception {
query.from(user);
query.where(user.getString("firstName").between("A", "D"));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_firstName . FILTER(?user_firstName >= ?_c6 && ?user_firstName <= ?_c7) }");
}
@Test
public void Contains_Key() throws Exception {
query.from(user);
query.where(user.getMap("buddiesMapped", String.class, User.class).containsKey("XXX"));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_buddiesMapped . ?user_buddiesMapped ?_c6 ?_c7 }");
}
@Test
public void Contains_Key_Not() throws Exception {
query.from(user);
query.where(user.getMap("buddiesMapped", String.class, User.class).containsKey("XXX").not());
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_buddiesMapped . FILTER(!exists {{ ?user_buddiesMapped ?_c6 ?_c7 } }) }");
}
@Test
public void Contains_Value() throws Exception {
query.from(user);
query.where(user.getMap("buddiesMapped", String.class, User.class).containsValue(createUser()));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_buddiesMapped . FILTER(?user_buddiesMapped = ?_c6) }");
}
@Test
public void Contains_Value_Not() throws Exception {
query.from(user);
query.where(user.getMap("buddiesMapped", String.class, User.class).containsValue(createUser()).not());
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_buddiesMapped . FILTER(!(?user_buddiesMapped = ?_c6)) }");
}
@Test
public void Distinct() throws Exception {
query.from(user);
query.distinct();
assertEquals("SELECT DISTINCT * WHERE { ?user ?_c2 ?_c3 }");
}
@Test
public void Enum_Ordinal() throws Exception {
query.from(user);
query.where(user.getEnum("gender", User.Gender.class).ordinal().eq(1));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_gender . ?user_gender ?_c6 ?user_gender_ordinal . FILTER(?user_gender_ordinal = ?_c8) }");
}
@Test
public void Ends_With() throws Exception {
query.from(user);
query.where(user.getString("firstName").endsWith("Bob"));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_firstName . FILTER(regex(?user_firstName, 'Bob$')) }");
}
@Test(expected = IllegalArgumentException.class)
public void From_Unknown_Type() throws Exception {
query.from(new PathImpl(Object.class, "o"));
assertEquals("SELECT * WHERE { ?user ?_c1 ?_c2 }");
}
@Test
public void Group_By_Having() throws Exception {
query.from(user);
query.groupBy(user.getString("firstName"));
query.having(user.getString("lastName").isNotNull());
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_firstName ; ?_c6 ?user_lastName } GROUP BY ?user_firstName HAVING (bound(?user_lastName))");
}
@Test
public void Id_Eq_Constant() throws Exception {
query.from(user);
query.where(user.get("id").eq(new UID(TEST.NS)));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 }");
}
@Test
public void Id_Ne_Constant() throws Exception {
query.from(user);
query.where(user.get("id").ne(new UID(TEST.NS)));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 . FILTER(?user != ?_c4) }");
}
@Test
public void In_Entities() throws Exception {
query.from(user);
query.where(user.in(createUser(), createUser(), createUser()));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 . FILTER(?user = ?_c4 || ?user = ?_c5 || ?user = ?_c6) }");
}
@Test
public void In_Strings() throws Exception {
query.from(user);
query.where(user.getString("firstName").in("Dennis", "Bob"));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_firstName . FILTER(?user_firstName = ?_c6 || ?user_firstName = ?_c7) }");
}
@Test
public void InstanceOf() throws Exception {
query.from(user);
query.where(user.instanceOf(User.class));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 , ?_c3 }");
}
@Test
public void IsNull() throws Exception {
query.from(user);
query.where(user.isNull());
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 . FILTER(!bound(?user)) }");
}
@Test
public void Limit() throws Exception {
query.from(user);
query.limit(4);
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 } LIMIT 4");
}
@Test
public void ListAccess() throws Exception {
query.from(user);
query.where(user.getList("buddyList", User.class).get(0).getString("name").eq("XXX"));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_buddyList . ?user_buddyList ?_c6 ?_var_a . ?_var_a ?_c8 ?user_buddyList_0_name }");
}
@Test
public void ListAccess2() throws Exception {
query.from(user);
query.where(user.getList("buddyList", User.class).get(1).getString("name").eq("XXX"));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_buddyList . ?user_buddyList ?_c6 ?_var_a . ?_var_a ?_c8 ?_var_b . ?_var_b ?_c10 ?user_buddyList_1_name }");
}
// @Test
// public void ListEmpty() throws Exception{
// query.from(user);
// query.where(user.getList("buddyList",
// User.class).eq(Collections.<User>emptyList()));
// assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_buddyList }");
// }
@Test
public void Localized_Map() throws Exception {
query.from(user);
query.where(user.getMap("names", Locale.class, String.class).get(new Locale("fi")).eq("XXX"));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_names }");
}
@Test
public void Localized_String_eq_Const() throws Exception {
query.from(user);
query.where(user.getString("name").eq("XXX"));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_name }");
}
@Test
public void Localized_String_ne_Const() throws Exception {
query.from(user);
query.where(user.getString("name").ne("XXX"));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_name . FILTER(?user_name != ?_c6) }");
}
@Test
public void Map_is_Empty() throws Exception {
query.from(user);
query.where(user.getMap("buddiesMapped", String.class, User.class).isEmpty());
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 . OPTIONAL { ?user ?_c4 ?user_buddiesMapped } FILTER(!bound(?user_buddiesMapped)) }");
}
@Test
public void Map_is_not_Empty() throws Exception {
query.from(user);
query.where(user.getMap("buddiesMapped", String.class, User.class).isNotEmpty());
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 . OPTIONAL { ?user ?_c4 ?user_buddiesMapped } FILTER(!(!bound(?user_buddiesMapped))) }");
}
@Test
public void Matches() throws Exception {
query.from(user);
query.where(user.getString("firstName").matches("Bob.*"));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_firstName . FILTER(regex(?user_firstName, ?_c6)) }");
}
@Test
public void Offset() throws Exception {
query.from(user);
query.offset(4);
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 } OFFSET 4");
}
@Test
public void Or() throws Exception {
query.from(user);
query.where(user.getString("firstName").eq("X").or(user.getString("firstName").eq("Y")));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 . OPTIONAL { ?user ?_c4 ?user_firstName } FILTER(?user_firstName = ?_c6 || ?user_firstName = ?_c7) }");
}
@Test
public void Order_By() throws Exception {
query.from(user);
query.orderBy(user.getString("firstName").asc());
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 . OPTIONAL { ?user ?_c4 ?user_firstName } } ORDER BY ?user_firstName");
}
@Test
public void Order_By_Desc() throws Exception {
query.from(user);
query.orderBy(user.getString("firstName").desc());
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 . OPTIONAL { ?user ?_c4 ?user_firstName } } ORDER BY DESC(?user_firstName)");
}
@Test
public void Set_is_Empty() throws Exception {
query.from(user);
query.where(user.getSet("buddies", User.class).isEmpty());
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_buddies . FILTER(?user_buddies = ?_c6) }");
}
@Test
public void Set_is_not_Empty() throws Exception {
query.from(user);
query.where(user.getSet("buddies", User.class).isNotEmpty());
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_buddies . FILTER(!(?user_buddies = ?_c6)) }");
}
@Test
public void Single_From_is_Preserved() throws Exception {
query.from(user);
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 }");
}
@Test
public void Single_From_With_Property() throws Exception {
query.from(user);
query.where(user.getString("firstName").eq("Bob"));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_firstName }");
}
@Test
public void Starts_With() throws Exception {
query.from(user);
query.where(user.getString("firstName").startsWith("Bob"));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_firstName . FILTER(regex(?user_firstName, '^Bob')) }");
}
@Test
public void String_Contains() throws Exception {
query.from(user);
query.where(user.getString("firstName").contains("Bob"));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 ; ?_c4 ?user_firstName . FILTER(regex(?user_firstName, '.*Bob.*')) }");
}
@Test
public void SubQuery_Exists() throws Exception {
query.from(user);
query.where(new BeanSubQuery().from(user2).where(user2.get("firstName").eq(user.get("firstName"))).exists());
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 . FILTER(exists {{ ?user2 ?_c2 ?_c3 . ?user ?_c5 ?user_firstName . ?user2 ?_c5 ?user_firstName } }) }");
}
@Test
@Ignore
// FIXME
public void Template_Expression() throws Exception {
query.from(user);
query.where(BooleanTemplate.create("!bound({0})", user));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 . }");
}
@Test
public void Two_Froms_are_Preserved() throws Exception {
query.from(user, user2);
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 . ?user2 ?_c2 ?_c3 }");
}
@Test
public void Two_Froms_One_Filter() throws Exception {
query.from(user, user2);
query.where(user.eq(user2));
assertEquals("SELECT * WHERE { ?user ?_c2 ?_c3 . ?user2 ?_c2 ?_c3 . FILTER(?user = ?user2) }");
}
private void assertEquals(String query) throws Exception {
RDFQueryImpl rdfQuery = builder.build(false);
Method method = RDFQueryImpl.class.getDeclaredMethod("aggregateFilters");
method.setAccessible(true);
method.invoke(rdfQuery);
QueryMetadata metadata = rdfQuery.getMetadata();
// tuple query
SPARQLVisitor visitor = new SPARQLVisitor();
visitor.visit(metadata, QueryLanguage.TUPLE);
Assert.assertEquals(query, visitor.toString().replaceAll("\\s+", " ").trim());
// boolean query
if (!query.contains("DISTINCT")) {
visitor = new SPARQLVisitor();
visitor.visit(metadata, QueryLanguage.BOOLEAN);
Assert.assertEquals(query.replaceAll("SELECT . WHERE", "ASK"), visitor.toString().replaceAll("\\s+", " ").trim());
}
// for (Map.Entry<Object, String> entry :
// visitor.getConstantToLabel().entrySet()){
// System.err.println(entry.getValue() + " = " + entry.getKey());
// }
// System.out.println();
}
}