Example #1
0
SequenceType SequenceType::createAtomicOrUnionType(
    const StaticContext_t& sctx,
    const String& uri,
    const String& localName,
    Quantifier quant)
{
  TypeManager* tm;

  if (sctx == NULL)
  {
    tm = &GENV_TYPESYSTEM;
  }
  else
  {
    static_context* sctx2 = Unmarshaller::getInternalStaticContext(sctx);
    tm = sctx2->get_typemanager();
  }

  zstring& ns = Unmarshaller::getInternalString(uri);
  zstring& local = Unmarshaller::getInternalString(localName);

  store::Item_t qname;
  GENV_ITEMFACTORY->createQName(qname, ns, "", local);

  xqtref_t type = tm->create_named_type(qname, quant, QueryLoc::null, false);

  if (type->isGenAtomicAny())
    return Unmarshaller::createSequenceType(type.getp());

  return Unmarshaller::createSequenceType(NULL);
}
Example #2
0
SequenceType SequenceType::createElementType(
    const StaticContext_t& sctx,
    const String& nodeUri,
    const String& nodeLocalName,
    const String& typeUri,
    const String& typeLocalName,
    bool nillable,
    Quantifier quant)
{
  TypeManager* tm;

  if (sctx == NULL)
  {
    tm = &GENV_TYPESYSTEM;
  }
  else
  {
    static_context* sctx2 = Unmarshaller::getInternalStaticContext(sctx);
    tm = sctx2->get_typemanager();
  }

  zstring& nodeNS = Unmarshaller::getInternalString(nodeUri);
  zstring& nodeLocal = Unmarshaller::getInternalString(nodeLocalName);
  store::Item_t nodeQName;

  if (!nodeLocal.empty())
    GENV_ITEMFACTORY->createQName(nodeQName, nodeNS, "", nodeLocal);

  zstring& typeNS = Unmarshaller::getInternalString(typeUri);
  zstring& typeLocal = Unmarshaller::getInternalString(typeLocalName);
  store::Item_t typeQName;
  xqtref_t contentType;

  if (!typeLocal.empty())
  {
    GENV_ITEMFACTORY->createQName(typeQName, typeNS, "", typeLocal);

    contentType = tm->create_named_type(typeQName, QUANT_ONE, QueryLoc::null, false);

    if (contentType == NULL)
      return Unmarshaller::createSequenceType(NULL);
  }

  xqtref_t res = tm->create_node_type(store::StoreConsts::elementNode,
                                      nodeQName,
                                      contentType,
                                      quant,
                                      nillable,
                                      false);

  return Unmarshaller::createSequenceType(res.getp());
}
Example #3
0
bool deepEqualNodes(
    const QueryLoc& loc,
    static_context* sctx,
    const store::Item* item1,
    const store::Item* item2,
    XQPCollator* collator,
    int timezone,
    bool raiseError)
{
  if (item1->getNodeKind() != item2->getNodeKind())
    return false;

  switch (item1->getNodeKind())
  {
  case store::StoreConsts::documentNode:
  {
    return deepEqualChildren(loc,
                             sctx,
                             item1->getChildren(),
                             item2->getChildren(),
                             collator,
                             timezone,
                             raiseError);
    break;
  }
  case store::StoreConsts::elementNode:
  {
    if (! item1->getNodeName()->equals(item2->getNodeName()))
      return false;

    if (!deepEqualAttributes(loc,
                             sctx,
                             item1->getAttributes(),
                             item2->getAttributes(),
                             collator,
                             timezone,
                             raiseError))
      return false;

    if (item1->haveSimpleContent())
    {
      if (!item2->haveSimpleContent())
        return false;

      store::Item_t value1, value2;
      store::Iterator_t ite1, ite2;
      item1->getTypedValue(value1, ite1);
      item2->getTypedValue(value2, ite2);

      if (ite1 == NULL && ite2 == NULL)
      {
        return deepEqual(loc, sctx, value1, value2, collator, timezone, raiseError);
      }
      else if (ite1 != NULL && ite2 != NULL)
      {
        ite1->open();
        ite2->open();

        while (1)
        {
          bool c1Valid = ite1->next(value1);
          bool c2Valid = ite2->next(value2);

          if (!c1Valid && !c2Valid)
            return true;
          else if (!c1Valid || !c2Valid)
            return false;
          else if (!deepEqual(loc, sctx, value1, value2, collator, timezone, raiseError))
            return false;
        }
      }
      else
      {
        return false;
      }
    }
    else if (item2->haveSimpleContent())
    {
      return false;
    }
    else
    {
      store::Item* typename1 = item1->getType();
      store::Item* typename2 = item2->getType();

      if (typename1->equals(typename2))
      {
        return deepEqualChildren(loc,
                                 sctx,
                                 item1->getChildren(),
                                 item2->getChildren(),
                                 collator,
                                 timezone,
                                 raiseError);
      }
      else
      {
        TypeManager* tm = sctx->get_typemanager();

        xqtref_t type1 =
        tm->create_named_type(typename1, SequenceType::QUANT_ONE, loc, raiseError);

        xqtref_t type2 =
        tm->create_named_type(typename2, SequenceType::QUANT_ONE, loc, raiseError);

        ZORBA_ASSERT(type1->isComplex() && type2->isComplex());

        if (type1->contentKind() != type2->contentKind())
          return false;

        return deepEqualChildren(loc,
                                 sctx,
                                 item1->getChildren(),
                                 item2->getChildren(),
                                 collator,
                                 timezone,
                                 raiseError);
      }
    }
    break;
  }
  case store::StoreConsts::attributeNode:
  {
    if (! item1->getNodeName()->equals(item2->getNodeName()))
      return false;

    store::Item_t value1, value2;
    store::Iterator_t ite1, ite2;
    item1->getTypedValue(value1, ite1);
    item2->getTypedValue(value2, ite2);

    if (ite1 == NULL && ite2 == NULL)
    {
      return deepEqual(loc, sctx, value1, value2, collator, timezone, raiseError);
    }
    else if (ite1 != NULL && ite2 != NULL)
    {
      ite1->open();
      ite2->open();

      while (1)
      {
        bool c1Valid = ite1->next(value1);
        bool c2Valid = ite2->next(value2);

        if (!c1Valid && !c2Valid)
          return true;
        else if (!c1Valid || !c2Valid)
          return false;
        else if (!deepEqual(loc, sctx, value1, value2, collator, timezone, raiseError))
          return false;
      }
    }
    else
    {
      return false;
    }

    break;
  }
  case store::StoreConsts::textNode:
  case store::StoreConsts::commentNode:
  {
    return (0 == utf8::compare(item1->getStringValue(),
                               item2->getStringValue(),
                               collator));
  }

  case store::StoreConsts::piNode:
  {
    if (utf8::compare(item1->getNodeName()->getStringValue(),
                      item2->getNodeName()->getStringValue(),
                      collator))
      return false;

    return (0 == utf8::compare(item1->getStringValue(),
                               item2->getStringValue(),
                               collator));
  }

  case store::StoreConsts::namespaceNode:
  {
    if (utf8::compare(item1->getNamespacePrefix(),
                      item2->getNamespacePrefix(),
                      collator))
      return false;

    return (0 == utf8::compare(item1->getStringValue(),
                               item2->getStringValue(),
                               collator));
  }
  default:
    ZORBA_ASSERT(false);
  }

  return true;
}