Example #1
0
/*******************************************************************************
  For simple flwor only.
********************************************************************************/
orderby_clause* flwor_expr::get_order_clause() const
{
  csize numClauses = num_clauses();
  for (csize i = 0; i < numClauses; ++i)
  {
    if (theClauses[i]->get_kind() == flwor_clause::orderby_clause)
      return reinterpret_cast<orderby_clause*>(theClauses[i]);
  }

  return NULL;
}
Example #2
0
/*******************************************************************************
  For simple flwor only.
********************************************************************************/
groupby_clause* flwor_expr::get_group_clause() const
{
  csize numClauses = num_clauses();
  for (csize i = 0; i < numClauses; ++i)
  {
    if (theClauses[i]->get_kind() == flwor_clause::groupby_clause)
      return static_cast<groupby_clause*>(theClauses[i]);
  }

  return NULL;
}
Example #3
0
void flwor_expr::compute_scripting_kind()
{
  csize numClauses = num_clauses();

  for (csize i = 0; i < numClauses; ++i)
  {
    const flwor_clause* c = theClauses[i];
    flwor_clause::ClauseKind k = c->get_kind();

    if (k == flwor_clause::for_clause ||
        k == flwor_clause::let_clause ||
        k == flwor_clause::window_clause)
    {
      const forletwin_clause* c2 = static_cast<const forletwin_clause*>(c);

      theScriptingKind |= c2->get_expr()->get_scripting_detail();

      if (c2->get_expr()->is_sequential())
        set_sequential_clauses(true);
    }
  }

  const expr* ret = get_return_expr();
  if (ret)
    theScriptingKind |= ret->get_scripting_detail();

  if (is_sequential(theScriptingKind))
  {
    theScriptingKind &= ~SIMPLE_EXPR;
    theScriptingKind &= ~VACUOUS_EXPR;
  }

  if (theScriptingKind & UPDATING_EXPR)
  {
    theScriptingKind &= ~SIMPLE_EXPR;
    theScriptingKind &= ~VACUOUS_EXPR;
  }

  if (theScriptingKind & VACUOUS_EXPR)
  {
    if (ret && ret->is_vacuous())
      theScriptingKind &= ~SIMPLE_EXPR;
    else
      theScriptingKind &= ~VACUOUS_EXPR;
  }

  checkScriptingKind();
}
Example #4
0
bool flwor_expr::is_single_for(csize& pos) const
{
  csize numClauses = num_clauses();

  csize numFors = 0;
  bool discardable = true;

  for (csize i = 0; i < numClauses; ++i)
  {
    flwor_clause* c = theClauses[i];

    switch (c->get_kind())
    {
    case flwor_clause::for_clause:
    {
      if (numFors > 0)
        return false;

      ++numFors;
      pos = i;
      break;
    }
    case flwor_clause::let_clause:
    {
      let_clause* lc = static_cast<let_clause*>(c);
      if (lc->get_expr()->isNonDiscardable())
      {
        if (numFors > 0)
          return false;

        discardable = false;
        break;
      }
    }
    default:
      return false;
    }
  }

  if (numFors ==  1 && discardable)
    return true;

  return false;
}
void DataAndStatistics::printShort() {
  if (exit_state_ == TIMEOUT) {
    cout << endl << " TIMEOUT !" << endl;
    return;
  }
  cout << endl << endl;
  cout << "variables (total / active / free)\t" << num_variables_ << "/"
      << num_used_variables_ << "/" << num_variables_ - num_used_variables_
      << endl;
  cout << "clauses (removed) \t\t\t" << num_original_clauses_ << " ("
      << num_original_clauses_ - num_clauses() << ")" << endl;
  cout << "decisions \t\t\t\t" << num_decisions_ << endl;
  cout << "conflicts \t\t\t\t" << num_conflicts_ << endl;
  cout << "conflict clauses (all/bin/unit) \t";
  cout << num_conflict_clauses();
  cout << "/" << num_binary_conflict_clauses_ << "/" << num_unit_clauses_
      << endl << endl;
  cout << "failed literals found by implicit BCP \t " <<
  		  num_failed_literals_detected_ << endl;;

    cout << "implicit BCP miss rate \t " << implicitBCP_miss_rate()*100 << "%";
    cout << endl;
  cout << "cache size " << cache_bytes_memory_usage_ / 1000 / 1000 << "MB\t"
      << endl;
  cout << "cache (stores / hits) \t\t\t" << num_cached_components_ << "/"
      << num_cache_hits_ << endl;
  cout << "cache miss rate " << cache_miss_rate() * 100 << "%" << endl;
  cout << " avg. variable count (stores / hits) \t" << getAvgComponentSize()
      << "/" << getAvgCacheHitSize() << endl << endl;
  cout << "\n# solutions " << endl;

  print_final_solution_count();

  cout << "\n# END" << endl << endl;
  cout << "time: " << time_elapsed_ << "s\n\n";
}
Example #6
0
/*****************************************************************************
  Returns a set containing all the variables defined by the clauses of this
  flwor expr.
******************************************************************************/
void flwor_expr::get_vars(std::vector<var_expr*>& vars) const
{
  csize numClauses = num_clauses();

  for (csize i = 0; i < numClauses; ++i)
  {
    const flwor_clause& c = *get_clause(i);

    switch (c.get_kind())
    {
    case flwor_clause::for_clause:
    {
      const for_clause* fc = static_cast<const for_clause *>(&c);

      vars.push_back(fc->get_var());

      if (fc->get_pos_var() != NULL)
        vars.push_back(fc->get_pos_var());

      break;
    }
    case flwor_clause::let_clause:
    {
      const let_clause* lc = static_cast<const let_clause *>(&c);
      vars.push_back(lc->get_var());
      break;
    }
    case flwor_clause::window_clause:
    {
      const window_clause* wc = static_cast<const window_clause *>(&c);

      vars.push_back(wc->get_var());

      if (wc->get_win_start() != NULL)
      {
        const flwor_wincond* cond = wc->get_win_start();
        const flwor_wincond::vars& condvars = cond->get_out_vars();

        if (condvars.posvar != NULL) vars.push_back(condvars.posvar);
        if (condvars.curr != NULL) vars.push_back(condvars.curr);
        if (condvars.prev != NULL) vars.push_back(condvars.prev);
        if (condvars.next != NULL) vars.push_back(condvars.next);
      }

      if (wc->get_win_stop() != NULL)
      {
        const flwor_wincond* cond = wc->get_win_stop();
        const flwor_wincond::vars& condvars = cond->get_out_vars();

        if (condvars.posvar != NULL) vars.push_back(condvars.posvar);
        if (condvars.curr != NULL) vars.push_back(condvars.curr);
        if (condvars.prev != NULL) vars.push_back(condvars.prev);
        if (condvars.next != NULL) vars.push_back(condvars.next);
      }

      break;
    }
    case flwor_clause::groupby_clause:
    {
      const groupby_clause* gc = static_cast<const groupby_clause *>(&c);

      flwor_clause::rebind_list_t::const_iterator ite = gc->beginGroupVars();
      flwor_clause::rebind_list_t::const_iterator end = gc->endGroupVars();

      for (; ite != end; ++ite)
      {
        vars.push_back((*ite).second);
      }

      ite = gc->beginNonGroupVars();
      end = gc->endNonGroupVars();

      for (; ite != end; ++ite)
      {
        vars.push_back((*ite).second);
      }

      break;
    }
    case flwor_clause::count_clause:
    {
      const count_clause* cc = static_cast<const count_clause *>(&c);
      vars.push_back(cc->get_var());
      break;
    }
    default:
      break;
    }
  }
}
Example #7
0
bool flwor_expr::compute_is_general()
{
  bool has_where = false;
  bool has_order = false;
  bool has_group = false;

  csize numClauses = num_clauses();

  for (csize i = 0; i < numClauses; ++i)
  {
    const flwor_clause* c = get_clause(i);

    switch (c->get_kind())
    {
    case flwor_clause::for_clause:
    case flwor_clause::let_clause:
    {
      if (has_group || has_where || has_order)
        return true;

      const forlet_clause* flc = static_cast<const forlet_clause*>(c);

      if (flc->is_allowing_empty())
        return true;

      break;
    }
    case flwor_clause::window_clause:
    {
      return true;
    }
    case flwor_clause::where_clause:
    {
      if (has_where || has_group || has_order)
        return true;

      has_where = true;
      break;
    }
    case flwor_clause::orderby_clause:
    {
      if (has_order)
        return true;

      has_order = true;
      break;
    }
    case flwor_clause::groupby_clause:
    {
      if (has_group || has_order)
        return true;

      has_group = true;
      break;
    }
    case flwor_clause::count_clause:
    {
      return true;
    }
    case flwor_clause::materialize_clause:
    {
      break;
    }
    default:
    {
      ZORBA_ASSERT(false);
    }
    }
  }

  return false;
}