@Test
  public void economizingTriplesEconomizesTheNodes() {
    Node s1a = Node.createURI("http://example.com/s1");
    Node s1b = Node.createURI("http://example.com/s1");
    Node p1a = Node.createURI("http://example.com/p1");
    Node p1b = Node.createURI("http://example.com/p1");
    Node o1a = Node.createLiteral("55", XSDDatatype.XSDint);
    Node o1b = Node.createLiteral("55", XSDDatatype.XSDint);

    assertTrue(o1a != o1b);

    Triple t1 = new Triple(s1a, p1a, o1a);
    Triple t2 = new Triple(s1b, p1b, o1b);
    assertTrue(t1 != t2);
    assertEquals(t1, t2);

    Economizer<Triple> e = new TripleEconomizer();

    Triple t3 = e.economize(t1);
    Triple t4 = e.economize(t2);

    assertTrue(t3.getSubject() == t4.getSubject());
    assertTrue(t3.getObject() == t4.getObject());
    assertTrue(t3.getPredicate() == t4.getPredicate());

    assertTrue(s1a.equals(t3.getSubject()));
    assertTrue(p1a.equals(t3.getPredicate()));
    assertTrue(o1a.equals(t3.getObject()));
  }
 ReificationStatementMask(Triple t) {
   mask = HasNada;
   Node p = t.getPredicate();
   if (p != null) {
     if (p.equals(RDF.Nodes.subject)) mask = HasSubj;
     else if (p.equals(RDF.Nodes.predicate)) mask = HasPred;
     else if (p.equals(RDF.Nodes.object)) mask = HasObj;
     else if (p.equals(RDF.Nodes.type)) {
       Node o = t.getObject();
       if (o.equals(RDF.Nodes.Statement)) mask = HasType;
     }
   }
 }
 @Test
 public void identicallyNamedNodesAreNotSameObject() {
   Node uriA = Node.createURI("http://slashdot.org/");
   Node uriB = Node.createURI("http://slashdot.org/");
   assertTrue(uriA.equals(uriB));
   assertTrue(uriA != uriB);
 }
  /**
   * This method is invoked when the builtin is called in a rule body.
   *
   * @param args the array of argument values for the builtin, this is an array of Nodes, some of
   *     which may be Node_RuleVariables.
   * @param length the length of the argument list, may be less than the length of the args array
   *     for some rule engines
   * @param context an execution context giving access to other relevant data
   * @return return true if the buildin predicate is deemed to have succeeded in the current
   *     environment
   */
  public boolean bodyCall(Node[] args, int length, RuleContext context) {
    if (length != 3) {
      throw new BuiltinException(
          this, context, "builtin " + getName() + " requires 3 arguments but saw " + length);
    }
    Node obj = getArg(2, args, context);
    Node subj = getArg(0, args, context);
    // Allow variables in subject position to correspond to a wild card
    if (subj.isVariable()) {
      subj = null;
    }

    // Allow variables in the predicate position to correspond to a wild card
    Node pred = getArg(1, args, context);
    if (pred.isVariable()) {
      pred = null;
    }
    boolean bContainsObj = context.contains(subj, pred, obj);
    if (!bContainsObj) {
      return false;
    }
    // does it contain anything else?
    ClosableIterator<Triple> citr = context.find((Node) null, pred, obj);
    boolean otherSubject = false;
    while (citr.hasNext()) {
      Object o = citr.next();
      Node tmpSubj = ((Triple) o).getSubject();
      if (!tmpSubj.equals(subj)) {
        otherSubject = true;
        break;
      }
    }
    citr.close();
    return !otherSubject;
  }
 /**
  * this nodeToElement is pretty much identical to that of
  * graph.query.patternstagecompiler.compile.
  */
 private Element nodeToElement(Node X, Mapping map) {
   if (X.equals(Query.ANY)) return Element.ANY;
   if (X.isVariable()) {
     if (map.hasBound(X)) return new Bound(map.indexOf(X));
     else {
       freeVarCnt++;
       return new Free(X);
     }
   }
   return new Fixed(X);
 }
  public static boolean sameTerm(Node n1, Node n2) {
    if (n1.equals(n2)) return true;
    if (n1.isLiteral() && n2.isLiteral()) {
      // But language tags are case insensitive.
      String lang1 = n1.getLiteralLanguage();
      String lang2 = n2.getLiteralLanguage();

      if (!lang1.equals("") && lang1.equalsIgnoreCase(lang2)) {
        // Two language tags, equal by case insensitivity.
        boolean b = n1.getLiteralLexicalForm().equals(n2.getLiteralLexicalForm());
        if (b) return true;
      }
    }
    return false;
  }
  // Exact as defined by SPARQL spec.
  public static boolean rdfTermEquals(Node n1, Node n2) {
    if (n1.equals(n2)) return true;

    if (n1.isLiteral() && n2.isLiteral()) {
      // Two literals, may be sameTerm by language tag case insensitivity.
      String lang1 = n1.getLiteralLanguage();
      String lang2 = n2.getLiteralLanguage();

      if (!lang1.equals("") && lang1.equalsIgnoreCase(lang2)) {
        // Two language tags, equal by case insensitivity.
        boolean b = n1.getLiteralLexicalForm().equals(n2.getLiteralLexicalForm());
        if (b) return true;
      }
      // Two literals, different terms, different language tags.
      NodeValue.raise(new ExprEvalException("Mismatch in RDFterm-equals: " + n1 + ", " + n2));
    }
    // One or both not a literal.
    return false;
  }
 /**
  * This method splits services as bindings would be ask to them.
  *
  * @param bindingList
  * @param serviceOp
  * @param serviceList
  * @return
  */
 private static List<List<NumericBinding>> generateUnionGroups(
     List<NumericBinding> bindingList, OpService serviceOp, List<Node> serviceList) {
   List<List<NumericBinding>> bindingUnionGroups = new ArrayList<List<NumericBinding>>();
   // generate Ops for each service value
   for (int j = 0; j < serviceList.size(); j++) {
     List<NumericBinding> bindingGroupToUnion = new ArrayList<NumericBinding>();
     Node currentService = serviceList.get(j);
     for (int i = 0; i < bindingList.size(); i++) {
       BindingMap binding = (BindingMap) bindingList.get(i).getBinding();
       Node serviceValue = binding.get((Var) serviceOp.getService());
       // if this serviceValue same as one with service list add it to
       // binding group.
       if (currentService.equals(serviceValue)) {
         bindingGroupToUnion.add(bindingList.get(i));
       }
     }
     bindingUnionGroups.add(bindingGroupToUnion);
   }
   return bindingUnionGroups;
 }
Exemple #9
0
 /**
  * This method is invoked when the builtin is called in a rule body.
  *
  * @param args the array of argument values for the builtin, this is an array of Nodes, some of
  *     which may be Node_RuleVariables.
  * @param length the length of the argument list, may be less than the length of the args array
  *     for some rule engines
  * @param context an execution context giving access to other relevant data
  * @return return true if the buildin predicate is deemed to have succeeded in the current
  *     environment
  */
 @SuppressWarnings("unused")
 public boolean bodyCall(Node[] args, int length, RuleContext context) {
   checkArgs(length, context);
   BindingEnvironment env = context.getEnv();
   Object maxVal = null;
   Node min = null;
   boolean allLongs = true;
   if (length >= 3) {
     for (int i = 0; i < length; i++) {
       Node n1 = getArg(i, args, context);
       if (n1.isLiteral()) {
         Object v1 = n1.getLiteralValue();
         if (v1 instanceof Number) {
           Number nv1 = (Number) v1;
           if (maxVal == null) {
             maxVal = nv1;
           } else {
             if (v1 instanceof Float || v1 instanceof Double) {
               double pwd = nv1.doubleValue();
               if (pwd > ((Number) maxVal).doubleValue()) {
                 maxVal = nv1;
               }
               allLongs = false;
             } else if (v1 instanceof Integer || v1 instanceof Long) {
               long pwd = nv1.longValue();
               if (pwd > ((Number) maxVal).doubleValue()) {
                 maxVal = nv1;
               }
             }
           }
         } else if (v1 instanceof XSDDateTime) {
           if (maxVal == null) {
             maxVal = v1;
           } else if (maxVal instanceof XSDDateTime) {
             if (((XSDDateTime) maxVal).compareTo((XSDDateTime) v1) < 0) {
               maxVal = v1;
             }
           } else {
             throw new BuiltinException(
                 this,
                 context,
                 "Can't compare datetime ("
                     + v1.toString()
                     + ") with non-datetime value ("
                     + maxVal.toString()
                     + ")");
           }
         } else {
           return false;
         }
       }
     } // end for
   } else {
     Node n1 = getArg(0, args, context);
     if (n1 == null || n1.equals(RDF.Nodes.nil)) {
       return false;
     } else {
       maxVal = maxOfList(n1, context);
     }
   }
   if (maxVal == null) {
     return false;
   }
   if (maxVal instanceof Float) {
     min = Utils.makeFloatNode(((Number) maxVal).floatValue());
   } else if (maxVal instanceof Double) {
     min = Util.makeDoubleNode(((Number) maxVal).doubleValue());
   } else if (maxVal instanceof XSDDateTime) {
     min = Utils.makeXSDDateTimeNode((XSDDateTime) maxVal);
   } else if (maxVal instanceof Integer) {
     min = Util.makeIntNode(((Number) maxVal).intValue());
   } else {
     min = Util.makeLongNode(((Number) maxVal).longValue());
   }
   return env.bind(args[length - 1], min);
 }
 /**
  * Answer true iff both <code>a</code> and <code>b</code> are ANY wildcards or are null (legacy).
  */
 private boolean bothANY(Node a, Node b) {
   return (a == null || a.equals(Node.ANY)) && (b == null || b.equals(Node.ANY));
 }