/**
  * Return the datatype label associated with the given node. If there is no datatype label
  * associated, returns the default datatype.
  */
 static String getDatatype(QueryConfigHandler config, QueryNode node) {
   // if a datatype has been defined, return it
   if (node.getTag(DatatypeQueryNode.DATATYPE_TAGID) != null) {
     return (String) node.getTag(DatatypeQueryNode.DATATYPE_TAGID);
   }
   // otherwise, return the default datatype
   else {
     return getDefaultDatatype(config);
   }
 }
  @Override
  public BooleanQuery build(QueryNode queryNode) throws QueryNodeException {
    AnyQueryNode andNode = (AnyQueryNode) queryNode;

    BooleanQuery bQuery = new BooleanQuery();
    List<QueryNode> children = andNode.getChildren();

    if (children != null) {

      for (QueryNode child : children) {
        Object obj = child.getTag(QueryTreeBuilder.QUERY_TREE_BUILDER_TAGID);

        if (obj != null) {
          Query query = (Query) obj;

          try {
            bQuery.add(query, BooleanClause.Occur.SHOULD);
          } catch (TooManyClauses ex) {

            throw new QueryNodeException(
                new MessageImpl(/*
             * IQQQ.Q0028E_TOO_MANY_BOOLEAN_CLAUSES,
             * BooleanQuery.getMaxClauseCount()
             */ QueryParserMessages.EMPTY_MESSAGE), ex);
          }
        }
      }
    }

    bQuery.setMinimumNumberShouldMatch(andNode.getMinimumMatchingElements());

    return bQuery;
  }