@Test
  public void queryCustomFunction() {
    OSQLEngine.getInstance()
        .registerFunction(
            "bigger",
            new OSQLFunctionAbstract("bigger", 2, 2) {
              @Override
              public String getSyntax() {
                return "bigger(<first>, <second>)";
              }

              @Override
              public Object execute(
                  Object iThis,
                  OIdentifiable iCurrentRecord,
                  Object iCurrentResult,
                  final Object[] iParams,
                  OCommandContext iContext) {
                if (iParams[0] == null || iParams[1] == null)
                  // CHECK BOTH EXPECTED PARAMETERS
                  return null;

                if (!(iParams[0] instanceof Number) || !(iParams[1] instanceof Number))
                  // EXCLUDE IT FROM THE RESULT SET
                  return null;

                // USE DOUBLE TO AVOID LOSS OF PRECISION
                final double v1 = ((Number) iParams[0]).doubleValue();
                final double v2 = ((Number) iParams[1]).doubleValue();

                return Math.max(v1, v2);
              }
            });

    List<ODocument> result =
        database
            .command(
                new OSQLSynchQuery<ODocument>("select from Account where bigger(id,1000) = 1000"))
            .execute();

    Assert.assertTrue(result.size() != 0);
    for (ODocument d : result) {
      Assert.assertTrue((Integer) d.field("id") <= 1000);
    }

    OSQLEngine.getInstance().unregisterFunction("bigger");
  }
 @Test
 public void testCustomFunction() {
   OSQLFunction f = OSQLEngine.getInstance().getInlineFunction("containsValueSubstrings");
   String syntax = f.getSyntax();
   assertTrue(syntax.startsWith("containsValueSubstrings"));
 }