示例#1
0
xqtref_t fn_remove::getReturnType(const fo_expr* caller) const
{
  TypeManager* tm = caller->get_type_manager();

  return tm->create_type_x_quant(*caller->get_arg(0)->get_return_type(),
                                 SequenceType::QUANT_QUESTION);
}
示例#2
0
xqtref_t op_concatenate::getReturnType(const fo_expr* caller) const
{
  TypeManager* tm = caller->get_type_manager();

  csize sz = caller->num_args();

  if (sz == 0)
  {
    return GENV_TYPESYSTEM.EMPTY_TYPE;
  }
  else
  {
    xqtref_t t = caller->get_arg(0)->get_return_type();
    SequenceType::Quantifier q = SequenceType::QUANT_STAR;
    for (csize i = 1; i < sz; i++)
    {
      t = TypeOps::union_type(*t, *caller->get_arg(i)->get_return_type(), tm);

      SequenceType::Quantifier pq = t->get_quantifier();

      if (pq == SequenceType::QUANT_ONE || pq == SequenceType::QUANT_PLUS)
        q = SequenceType::QUANT_PLUS;
    }

    return tm->create_type_x_quant(*t, q);
  }
}
示例#3
0
xqtref_t op_zorba_subsequence_int::getReturnType(const fo_expr* caller) const
{
  TypeManager* tm = caller->get_type_manager();
  xqtref_t argType = caller->get_arg(0)->get_return_type();

  //When there is a length argument and it's 1 then we know we will return
  //a value type T? where the input sequence was type T* or T+
  if (caller->num_args() > 2 &&
      caller->get_arg(2)->get_expr_kind() == const_expr_kind)
  {
    store::Item* len = static_cast<const_expr*>(caller->get_arg(2))->get_val();

    if (len->getIntegerValue() == Integer(1))
      return tm->create_type(*argType, SequenceType::QUANT_QUESTION);
  }

  return tm->create_type_x_quant(*argType, SequenceType::QUANT_QUESTION);
}