package exp.org.aksw.sparqlify.core.datatype;







//class Registry {
//	
//}
//
//class Ops {
//	
//	/*
//	 * Arithmetic
//	 */
//	
//	// Integer
//	
//	public static Integer add(Integer a, Integer b) {
//		return a + b;
//	}
//
//	public static Integer subtract(Integer a, Integer b) {
//		return a - b;
//	}
//
//	public static Integer multiply(Integer a, Integer b) {
//		return a * b;
//	}
//	
//	public static Integer divide(Integer a, Integer b) {
//		return a / b;
//	}
//
//	// Double
//	
//	public static Double add(Double a, Double b) {
//		return a + b;
//	}
//
//	public static Double subtract(Double a, Double b) {
//		return a - b;
//	}
//
//	public static Double multiply(Double a, Double b) {
//		return a * b;
//	}
//	
//	public static Double divide(Double a, Double b) {
//		return a / b;
//	}
//	
//	
//	/*
//	 * In-/Equality
//	 */
//	
//
//	public static Boolean lessThan(Integer a, Integer b) {
//		return a < b;
//	}
//
//	public static Boolean lessThanOrEquals(Integer a, Integer b) {
//		return a <= b;
//	}
//
//	public static Boolean equals(Integer a, Integer b) {
//		return a == b;
//	}
//
//	public static Boolean greaterThanOrEquals(Integer a, Integer b) {
//		return a >= b;
//	}
//
//	public static Boolean greaterThan(Integer a, Integer b) {
//		return a > b;
//	}
//
//	
//	public static Boolean lessThan(Double a, Double b) {
//		return a < b;
//	}
//
//	public static Boolean lessThanOrEquals(Double a, Double b) {
//		return a <= b;
//	}
//
//	public static Boolean equals(Double a, Double b) {
//		return a == b;
//	}
//
//	public static Boolean greaterThanOrEquals(Double a, Double b) {
//		return a >= b;
//	}
//
//	public static Boolean greaterThan(Double a, Double b) {
//		return a > b;
//	}
//
//	
//	public static Boolean lessThan(String a, String b) {
//		return a.compareTo(b) < 0;
//	}
//
//	public static Boolean lessThanOrEquals(String a, String b) {
//		return a.compareTo(b) <= 0;
//	}
//
//	public static Boolean equals(String a, String b) {
//		return a.equals(b);
//	}
//
//	public static Boolean greaterThanOrEquals(String a, String b) {
//		return a.compareTo(b) >= 0;
//	}
//
//	public static Boolean greaterThan(String a, String b) {
//		return a.compareTo(b) > 0;
//	}
//
//
//	public static Boolean logicalAnd(Boolean a, Boolean b) {
//		return a && b;
//	}
//
//	public static Boolean logicalOr(Boolean a, Boolean b) {
//		return a || b;
//	}
//
//	public static Boolean logicalNot(Boolean a) {
//		return !a;
//	}
//	
//
//	/*
//	public static String myTestFunc(String str, Integer i) {
//		return "XXX " + str + ", " + i + " XXX";
//	}
//	*/
//
//
//	public static String myTestFunc(String str, Double i) {
//		return "xxx " + i + "xxx";
//	}
//
//	public static Boolean equalsIgnoreCase(String a, String b) {
//		return a.equalsIgnoreCase(b);
//	}
//}
//
//
//
//
///*
//interface XMethod {
//	
//}
//*/
//
//public class DatatypeSystemTests {
//
//	private static final Logger logger = LoggerFactory.getLogger(DatatypeSystemTests.class);
//
//	
//	@Test
//	public void test() throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, IOException, RecognitionException {
//
//		Object tmp = SqlExprOps.a;
//		
//		FunctionDeclaration decl;
//
//		DatatypeSystemCustom ds = SparqlifyUtils.createDefaultDatatypeSystem();
//
//		{
//			Method m = DefaultCoercions.class.getMethod("toDouble", Integer.class);
//			XMethod x = XMethodImpl.createFromMethod("toDouble", ds, null, m);
//			//ds.register(x);
//			ds.registerCoercion(x);
//		}
//
//		
////		S_Constant a = S_Constant.create("http://ex.org/", ds);
////		System.out.println(a);
////
////		S_Constant b = S_Constant.create(1, ds);
////		System.out.println(b);
////
////		S_Constant d = S_Constant.create(3.14, ds);
////		System.out.println(d);
//
//		
//
//		
//		
//		
//		//S_Concat c = S_Concat.create(a, b);
//		//System.out.println(c);
//
//		//S_UserFunc c = S_UserFunc.create("http://ex.org/fn/myTestFunc", a, b);
//		//System.out.println(c);
//
//		
//		// Define a random custom function
//		{
//			Method m = Ops.class.getMethod("myTestFunc", String.class, Double.class);
//			XMethod x = XMethodImpl.createFromMethod("myTestFunc", ds, null, m);
//			//SparqlFunction fn = ds.createSparqlFunction("http://ex.org/fn/myTestFunc");
//			ds.registerSqlFunction("http://ex.org/fn/myTestFunc", x);
//			
//		}
//
//		
//		{
//			//XMethodImpl.createFromMethod("http://example.org/intersects", ds, object, method)
//			MethodSignature<TypeToken> signature = MethodSignature.create(TypeToken.Boolean, Arrays.asList(TypeToken.Int, TypeToken.Int), null);
//			
//			XMethod x = XMethodImpl.create(ds, "ST_INTERSECTS", signature);
//			ds.registerSqlFunction("http://ex.org/fn/intersects", x);
//			//ds.registerSqlFunction(x);
//		}
//
//		
//
//		{
//			SqlExprEvaluator evaluator = new SqlExprEvaluator_LogicalAnd();
//			ds.createSparqlFunction("&&", evaluator);
//		}
//
//		{
//			SqlExprEvaluator evaluator = new SqlExprEvaluator_LogicalOr();
//			ds.createSparqlFunction("||", evaluator);
//		}
//		
//		{
//			SqlExprEvaluator evaluator = new SqlExprEvaluator_LogicalNot();
//			ds.createSparqlFunction("!", evaluator);
//		}
//		
//		
//		{
//			//MethodSignature<TypeToken> signature = MethodSignature.create(TypeToken.Boolean, Arrays.asList(TypeToken.String, TypeToken.String));
//			
//			//XMethod x = XMethodImpl.create(ds, "equalsIgnoreCase", signature);
//			Method m = Ops.class.getMethod("equalsIgnoreCase", String.class, String.class);
//			XMethod x = XMethodImpl.createFromMethod("EQUALS_IGNORE_CASE", ds, null, m);
//			ds.registerSqlFunction("http://ex.org/fn/equalsIgnoreCase", x);
//		}
//
//		
//		/*
//		{
//			Method m = Ops.class.getMethod("myTestFunc", String.class, Double.class);
//			XMethod x = XMethodImpl.createFromMethod("myTestFunc", ds, null, m);
//			ds.register(x);
//		}*/
//
//		
//		ExprEvaluatorSql evaluater = new ExprEvaluatorSql(ds, null); //sqlFunctionRegistry);
//		//ds.
//		//SqlExpr result = evaluater.eval(c, null);
//		//System.out.println("Result: " + result);
//		
//		
//		//DatatypeSystem system = TestUtils.createDefaultDatatypeSystem();
//		//SqlDatatype integer = system.getByName("integer");
//		/*
//		SqlDatatype xfloat = system.getByName("float");
//		
//		Set<SqlDatatype> xxx = system.supremumDatatypes(integer, xfloat);
//		System.out.println(xxx);
//*/
//		
//		FunctionRegistrySql sqlRegistry = new FunctionRegistrySql(ds);
//
//		ConfigParser parser = new ConfigParser();
//
//		{
//			/**
//			 * Actually it is like that:
//			 * We have an abstract sparql function, which can be overloaded by several SQL functions.
//			 * E.g. the SPARQL function ogc:intersects can be implemented by ST_Intersects for geometries or for geographies.
//			 * 
//			 */
//			
//			Config config = parser.parse("PREFIX fn:<http://ex.org/fn/> DECLARE FUNCTION boolean ex:intersects(integer ?a, integer ?b) AS ST_INTERSECTS(?a, ?b, 1000 * ?a)", logger);
//			FunctionDeclarationTemplate fnDecl = config.getFunctionDeclarations().get(0);
//			sqlRegistry.add(fnDecl);
//		}
//		{
//			/*
//			Config config = parser.parse("PREFIX ex:<http://ex.org/> DECLARE FUNCTION boolean ex:intersects(geometry ?a, geometry ?b) AS ST_INTERSECTS(?a, ?b, 1000 * ?a)", logger);
//			FunctionDeclaration decl = config.getFunctionDeclarations().get(0);
//			sqlRegistry.add(decl);
//			*/
//		}
//		
//		ExprTransformerMap exprTransformer = new ExprTransformerMap();	
//		
//		ExprEvaluator evaluatorSql = new ExprEvaluatorPartial(FunctionRegistry.get(), exprTransformer);
//		//Expr expr = ExprUtils.parse("<http://ex.org/intersects>(1 + 1, ?a)");
//		
//		
//		Expr expr = ExprUtils.parse("<http://ex.org/fn/equalsIgnoreCase>('a', 'b') && <http://ex.org/fn/intersects>(1 + 1, ?a)");
//
//		Expr evaledExpr = evaluatorSql.eval(expr, null);
//		
//		
//		SqlTranslator sqlTranslator = new SqlTranslatorImpl(ds);
//		
//		Map<Var, Expr> binding = new HashMap<Var, Expr>();
//		
//		Map<String, TypeToken> typeMap = new HashMap<String, TypeToken>();
//		typeMap.put("a", TypeToken.Int);
//		
//		
//		System.out.println(evaledExpr);
//		SqlExpr sqlExpr = sqlTranslator.translate(evaledExpr, binding, typeMap);
//
//		System.out.println("Final: " + sqlExpr);
//		
//		//S_Method method = (S_Method)sqlExpr;
//		//System.out.println(method.getMethod().getSerializer().serialize(Arrays.asList("test", "b")));
//	}
//}

