Пример #1
0
  ColumnWalker(CrosstabReportItemHandle item, EdgeCursor columnEdgeCursor) {
    this.crosstabItem = item;
    this.columnEdgeCursor = columnEdgeCursor;

    rowGroups = GroupUtil.getGroups(crosstabItem, ROW_AXIS_TYPE);
    columnGroups = GroupUtil.getGroups(crosstabItem, COLUMN_AXIS_TYPE);

    mCount = crosstabItem.getMeasureCount();
    isVerticalMeasure = MEASURE_DIRECTION_VERTICAL.equals(crosstabItem.getMeasureDirection());
    isHideMeasureHeader = crosstabItem.isHideMeasureHeader();

    groupIndex = 0;
    measureIndex = -1;

    lastColumnGroupIndex = columnGroups.size() - 1;

    currentState = STATE_INIT;
  }
Пример #2
0
  public List<User> findByC_FN_MN_LN_SN_EA_S(
      long companyId,
      String[] firstNames,
      String[] middleNames,
      String[] lastNames,
      String[] screenNames,
      String[] emailAddresses,
      int status,
      LinkedHashMap<String, Object> params,
      boolean andOperator,
      int start,
      int end,
      OrderByComparator obc)
      throws SystemException {

    firstNames = CustomSQLUtil.keywords(firstNames);
    middleNames = CustomSQLUtil.keywords(middleNames);
    lastNames = CustomSQLUtil.keywords(lastNames);
    screenNames = CustomSQLUtil.keywords(screenNames);
    emailAddresses = CustomSQLUtil.keywords(emailAddresses);

    if (params == null) {
      params = _emptyLinkedHashMap;
    }

    Long[] groupIds = null;

    if (params.get("usersGroups") instanceof Long) {
      Long groupId = (Long) params.get("usersGroups");

      if (groupId > 0) {
        groupIds = new Long[] {groupId};
      }
    } else {
      groupIds = (Long[]) params.get("usersGroups");
    }

    boolean inherit = GetterUtil.getBoolean(params.get("inherit"));

    boolean doUnion = Validator.isNotNull(groupIds) && inherit;

    LinkedHashMap<String, Object> params1 = params;

    LinkedHashMap<String, Object> params2 = null;

    LinkedHashMap<String, Object> params3 = null;

    if (doUnion) {
      params2 = new LinkedHashMap<String, Object>(params1);

      params2.remove("usersGroups");

      params3 = new LinkedHashMap<String, Object>(params1);

      params3.remove("usersGroups");

      List<Long> organizationIds = new ArrayList<Long>();
      List<Long> userGroupIds = new ArrayList<Long>();

      for (long groupId : groupIds) {
        Group group = GroupLocalServiceUtil.fetchGroup(groupId);

        if ((group != null) && group.isOrganization()) {
          organizationIds.add(group.getOrganizationId());
        }

        List<Organization> organizations = GroupUtil.getOrganizations(groupId);

        for (Organization organization : organizations) {
          organizationIds.add(organization.getOrganizationId());
        }

        List<UserGroup> userGroups = GroupUtil.getUserGroups(groupId);

        for (int i = 0; i < userGroups.size(); i++) {
          UserGroup userGroup = userGroups.get(i);

          userGroupIds.add(userGroup.getUserGroupId());
        }
      }

      params2.put("usersOrgs", organizationIds.toArray(new Long[organizationIds.size()]));

      params3.put("usersUserGroups", userGroupIds.toArray(new Long[userGroupIds.size()]));
    }

    Session session = null;

    try {
      session = openSession();

      String sql = CustomSQLUtil.get(FIND_BY_C_FN_MN_LN_SN_EA_S);

      sql =
          CustomSQLUtil.replaceKeywords(
              sql, "lower(User_.firstName)", StringPool.LIKE, false, firstNames);
      sql =
          CustomSQLUtil.replaceKeywords(
              sql, "lower(User_.middleName)", StringPool.LIKE, false, middleNames);
      sql =
          CustomSQLUtil.replaceKeywords(
              sql, "lower(User_.lastName)", StringPool.LIKE, false, lastNames);
      sql =
          CustomSQLUtil.replaceKeywords(
              sql, "lower(User_.screenName)", StringPool.LIKE, false, screenNames);
      sql =
          CustomSQLUtil.replaceKeywords(
              sql, "lower(User_.emailAddress)", StringPool.LIKE, true, emailAddresses);

      if (status == WorkflowConstants.STATUS_ANY) {
        sql = StringUtil.replace(sql, _STATUS_SQL, StringPool.BLANK);
      }

      StringBundler sb = new StringBundler();

      sb.append(StringPool.OPEN_PARENTHESIS);
      sb.append(replaceJoinAndWhere(sql, params1));
      sb.append(StringPool.CLOSE_PARENTHESIS);

      if (doUnion) {
        sb.append(" UNION (");
        sb.append(replaceJoinAndWhere(sql, params2));
        sb.append(") UNION (");
        sb.append(replaceJoinAndWhere(sql, params3));
        sb.append(StringPool.CLOSE_PARENTHESIS);
      }

      if (obc != null) {
        sb.append(" ORDER BY ");
        sb.append(obc.toString());
      }

      sql = sb.toString();

      sql = CustomSQLUtil.replaceAndOperator(sql, andOperator);

      SQLQuery q = session.createSQLQuery(sql);

      q.addScalar("userId", Type.LONG);

      QueryPos qPos = QueryPos.getInstance(q);

      setJoin(qPos, params1);

      qPos.add(companyId);
      qPos.add(false);
      qPos.add(firstNames, 2);
      qPos.add(middleNames, 2);
      qPos.add(lastNames, 2);
      qPos.add(screenNames, 2);
      qPos.add(emailAddresses, 2);

      if (status != WorkflowConstants.STATUS_ANY) {
        qPos.add(status);
      }

      if (doUnion) {
        setJoin(qPos, params2);

        qPos.add(companyId);
        qPos.add(false);
        qPos.add(firstNames, 2);
        qPos.add(middleNames, 2);
        qPos.add(lastNames, 2);
        qPos.add(screenNames, 2);
        qPos.add(emailAddresses, 2);

        if (status != WorkflowConstants.STATUS_ANY) {
          qPos.add(status);
        }

        setJoin(qPos, params3);

        qPos.add(companyId);
        qPos.add(false);
        qPos.add(firstNames, 2);
        qPos.add(middleNames, 2);
        qPos.add(lastNames, 2);
        qPos.add(screenNames, 2);
        qPos.add(emailAddresses, 2);

        if (status != WorkflowConstants.STATUS_ANY) {
          qPos.add(status);
        }
      }

      List<Long> userIds = (List<Long>) QueryUtil.list(q, getDialect(), start, end);

      List<User> users = new ArrayList<User>(userIds.size());

      for (Long userId : userIds) {
        User user = UserUtil.findByPrimaryKey(userId);

        users.add(user);
      }

      return users;
    } catch (Exception e) {
      throw new SystemException(e);
    } finally {
      closeSession(session);
    }
  }
Пример #3
0
  public int countByC_FN_MN_LN_SN_EA_S(
      long companyId,
      String[] firstNames,
      String[] middleNames,
      String[] lastNames,
      String[] screenNames,
      String[] emailAddresses,
      int status,
      LinkedHashMap<String, Object> params,
      boolean andOperator)
      throws SystemException {

    firstNames = CustomSQLUtil.keywords(firstNames);
    middleNames = CustomSQLUtil.keywords(middleNames);
    lastNames = CustomSQLUtil.keywords(lastNames);
    screenNames = CustomSQLUtil.keywords(screenNames);
    emailAddresses = CustomSQLUtil.keywords(emailAddresses);

    if (params == null) {
      params = _emptyLinkedHashMap;
    }

    Long[] groupIds = null;

    if (params.get("usersGroups") instanceof Long) {
      Long groupId = (Long) params.get("usersGroups");

      if (groupId > 0) {
        groupIds = new Long[] {groupId};
      }
    } else {
      groupIds = (Long[]) params.get("usersGroups");
    }

    boolean inherit = GetterUtil.getBoolean(params.get("inherit"));

    boolean doUnion = Validator.isNotNull(groupIds) && inherit;

    LinkedHashMap<String, Object> params1 = params;

    LinkedHashMap<String, Object> params2 = null;

    LinkedHashMap<String, Object> params3 = null;

    if (doUnion) {
      params2 = new LinkedHashMap<String, Object>(params1);

      params2.remove("usersGroups");

      params3 = new LinkedHashMap<String, Object>(params1);

      params3.remove("usersGroups");

      List<Long> organizationIds = new ArrayList<Long>();
      List<Long> userGroupIds = new ArrayList<Long>();

      for (long groupId : groupIds) {
        Group group = GroupLocalServiceUtil.fetchGroup(groupId);

        if ((group != null) && group.isOrganization()) {
          organizationIds.add(group.getOrganizationId());
        }

        List<Organization> organizations = GroupUtil.getOrganizations(groupId);

        for (Organization organization : organizations) {
          organizationIds.add(organization.getOrganizationId());
        }

        List<UserGroup> userGroups = GroupUtil.getUserGroups(groupId);

        for (int i = 0; i < userGroups.size(); i++) {
          UserGroup userGroup = userGroups.get(i);

          userGroupIds.add(userGroup.getUserGroupId());
        }
      }

      params2.put("usersOrgs", organizationIds.toArray(new Long[organizationIds.size()]));

      params3.put("usersUserGroups", userGroupIds.toArray(new Long[userGroupIds.size()]));
    }

    Session session = null;

    try {
      session = openSession();

      Set<Long> userIds = new HashSet<Long>();

      userIds.addAll(
          countByC_FN_MN_LN_SN_EA_S(
              session,
              companyId,
              firstNames,
              middleNames,
              lastNames,
              screenNames,
              emailAddresses,
              status,
              params1,
              andOperator));

      if (doUnion) {
        userIds.addAll(
            countByC_FN_MN_LN_SN_EA_S(
                session,
                companyId,
                firstNames,
                middleNames,
                lastNames,
                screenNames,
                emailAddresses,
                status,
                params2,
                andOperator));

        userIds.addAll(
            countByC_FN_MN_LN_SN_EA_S(
                session,
                companyId,
                firstNames,
                middleNames,
                lastNames,
                screenNames,
                emailAddresses,
                status,
                params3,
                andOperator));
      }

      return userIds.size();
    } catch (Exception e) {
      throw new SystemException(e);
    } finally {
      closeSession(session);
    }
  }
Пример #4
0
  private void advance() throws OLAPException {
    switch (currentState) {
      case STATE_INIT:
      case STATE_ROW_EDGE:
        if (rowGroups.size() > 0) {
          // TODO how to skip dummy groups?

          // process row dimension header column if available
          for (int i = groupIndex; i < rowGroups.size(); i++) {
            EdgeGroup group = (EdgeGroup) rowGroups.get(i);

            groupIndex++;

            dimensionIndex = group.dimensionIndex;
            levelIndex = group.levelIndex;
            currentState = STATE_ROW_EDGE;
            return;
          }
        }

        // process vertical measure header column if available
        if (mCount > 0 && isVerticalMeasure && !isHideMeasureHeader) {
          for (int i = 0; i < mCount; i++) {
            MeasureViewHandle mv = crosstabItem.getMeasure(i);

            if (mv.getHeader() != null) {
              currentState = STATE_MEASURE_HEADER;
              return;
            }
          }
        } else if (rowGroups.size() == 0 && groupIndex == 0 && crosstabItem.getHeader() != null) {
          // mark the flag as we only check once.
          groupIndex++;

          boolean hasHeaderContent = false;
          for (int i = 0; i < crosstabItem.getHeaderCount(); i++) {
            CrosstabCellHandle cell = crosstabItem.getHeader(i);

            if (cell.getContents().size() > 0) {
              hasHeaderContent = true;
              break;
            }
          }

          if (hasHeaderContent) {
            // in case it has no row edge but has non-empty header
            // cell, we produce a dummy row edge event to output the
            // crosstab header.

            dimensionIndex = -1;
            levelIndex = -1;
            currentState = STATE_ROW_EDGE;
            return;
          }
        }

      case STATE_MEASURE_HEADER:

        // check if need processing grandtotal_before
        inProcessingGrandTotalBefore =
            columnGroups.size() > 0
                && columnEdgeCursor != null
                && crosstabItem.getGrandTotal(COLUMN_AXIS_TYPE) != null
                && GRAND_TOTAL_LOCATION_BEFORE.equals(
                    crosstabItem.getCrosstabView(COLUMN_AXIS_TYPE).getGrandTotalLocation());

      case STATE_PENDING_CHECK_COLUMN_EDGE:
        if (!inProcessingGrandTotalBefore && columnGroups.size() > 0 && columnEdgeCursor != null) {
          columnDimensionCursors = columnEdgeCursor.getDimensionCursor();

          columnEdgeCursor.beforeFirst();
          hasNext = columnEdgeCursor.next();
          columnProcessed = false;

          groupIndex = 0;
          measureIndex = -1;

          tmpStartGroupIndex = 0;
          tmpEndGroupIndex = lastColumnGroupIndex;
        }

      case STATE_COLUMN_TOTAL_BEFORE:
      case STATE_COLUMN_TOTAL_AFTER:
      case STATE_COLUMN_EDGE:
        if (!inProcessingGrandTotalBefore && columnGroups.size() > 0 && columnEdgeCursor != null) {
          while (hasNext) {
            if (mCount > 0 || !IGNORE_TOTAL_COLUMN_WITHOUT_MEASURE) {
              // check header
              for (int i = tmpStartGroupIndex; i < columnGroups.size(); i++) {
                EdgeGroup group = (EdgeGroup) columnGroups.get(i);

                if (!GroupUtil.isLeafOrDummyGroup(columnDimensionCursors, i)) {
                  DimensionCursor dc = (DimensionCursor) columnDimensionCursors.get(i);

                  if (dc.getEdgeStart() == columnEdgeCursor.getPosition()) {
                    // process leading subtoal column if
                    // available
                    LevelViewHandle lv =
                        crosstabItem
                            .getDimension(COLUMN_AXIS_TYPE, group.dimensionIndex)
                            .getLevel(group.levelIndex);

                    if (lv.getAggregationHeader() != null
                        && AGGREGATION_HEADER_LOCATION_BEFORE.equals(
                            lv.getAggregationHeaderLocation())) {
                      if (mCount > 0 && !isVerticalMeasure) {
                        for (int m = measureIndex + 1; m < mCount; m++) {
                          if (GroupUtil.hasTotalContent(
                              crosstabItem,
                              COLUMN_AXIS_TYPE,
                              group.dimensionIndex,
                              group.levelIndex,
                              m)) {
                            tmpStartGroupIndex = i;

                            dimensionIndex = group.dimensionIndex;
                            levelIndex = group.levelIndex;
                            measureIndex = m;
                            currentState = STATE_COLUMN_TOTAL_BEFORE;
                            return;
                          }
                        }

                        // reset measure index
                        measureIndex = -1;
                      } else if (GroupUtil.hasTotalContent(
                          crosstabItem,
                          COLUMN_AXIS_TYPE,
                          group.dimensionIndex,
                          group.levelIndex,
                          -1)) {
                        tmpStartGroupIndex = i + 1;

                        dimensionIndex = group.dimensionIndex;
                        levelIndex = group.levelIndex;
                        currentState = STATE_COLUMN_TOTAL_BEFORE;
                        return;
                      }
                    }
                  }
                }
              }

              // set to skip later header check
              tmpStartGroupIndex = columnGroups.size();
            }

            // reset measure index
            if (currentState != STATE_COLUMN_EDGE && currentState != STATE_COLUMN_TOTAL_AFTER) {
              measureIndex = -1;
            }

            // check column
            if (!columnProcessed) {
              // add data columns per edge tuple
              if (mCount > 0 && !isVerticalMeasure) {
                for (int m = measureIndex + 1; m < mCount; m++) {
                  measureIndex = m;
                  currentState = STATE_COLUMN_EDGE;
                  return;
                }
              } else if (measureIndex == -1) {
                measureIndex--;
                currentState = STATE_COLUMN_EDGE;
                return;
              }

              columnProcessed = true;
            }

            if (mCount > 0 || !IGNORE_TOTAL_COLUMN_WITHOUT_MEASURE) {
              // reset measure index
              if (currentState != STATE_COLUMN_TOTAL_AFTER) {
                measureIndex = -1;
              }

              // check footer
              for (int i = tmpEndGroupIndex; i >= 0; i--) {
                EdgeGroup group = (EdgeGroup) columnGroups.get(i);

                if (!GroupUtil.isLeafOrDummyGroup(columnDimensionCursors, i)) {
                  DimensionCursor dc = (DimensionCursor) columnDimensionCursors.get(i);

                  if (dc.getEdgeEnd() == columnEdgeCursor.getPosition()) {
                    // process trailing subtoal column
                    // if
                    // available
                    LevelViewHandle lv =
                        crosstabItem
                            .getDimension(COLUMN_AXIS_TYPE, group.dimensionIndex)
                            .getLevel(group.levelIndex);

                    if (lv.getAggregationHeader() != null
                        && AGGREGATION_HEADER_LOCATION_AFTER.equals(
                            lv.getAggregationHeaderLocation())) {
                      if (mCount > 0 && !isVerticalMeasure) {
                        for (int m = measureIndex + 1; m < mCount; m++) {
                          if (GroupUtil.hasTotalContent(
                              crosstabItem,
                              COLUMN_AXIS_TYPE,
                              group.dimensionIndex,
                              group.levelIndex,
                              m)) {
                            tmpEndGroupIndex = i;

                            dimensionIndex = group.dimensionIndex;
                            levelIndex = group.levelIndex;
                            measureIndex = m;
                            currentState = STATE_COLUMN_TOTAL_AFTER;
                            return;
                          }
                        }

                        // reset measure index
                        measureIndex = -1;
                      } else if (GroupUtil.hasTotalContent(
                          crosstabItem,
                          COLUMN_AXIS_TYPE,
                          group.dimensionIndex,
                          group.levelIndex,
                          -1)) {
                        tmpEndGroupIndex = i - 1;

                        dimensionIndex = group.dimensionIndex;
                        levelIndex = group.levelIndex;
                        currentState = STATE_COLUMN_TOTAL_AFTER;
                        return;
                      }
                    }
                  }
                }
              }
            }

            hasNext = columnEdgeCursor.next();

            // reset temp index
            columnProcessed = false;

            tmpStartGroupIndex = 0;
            tmpEndGroupIndex = lastColumnGroupIndex;

            measureIndex = -1;
          }

          // check if grandtotal already processed, otherwise, this is
          // already the end of column edge
          if (crosstabItem.getGrandTotal(COLUMN_AXIS_TYPE) != null
              && GRAND_TOTAL_LOCATION_BEFORE.equals(
                  crosstabItem.getCrosstabView(COLUMN_AXIS_TYPE).getGrandTotalLocation())) {
            currentState = STATE_END;
            return;
          }
        }

        // reset measure index
        measureIndex = -1;

      case STATE_GRAND_TOTAL:
        if (columnGroups.size() > 0 && columnEdgeCursor != null) {
          // process grand total column
          if (crosstabItem.getGrandTotal(COLUMN_AXIS_TYPE) != null) {
            if (mCount > 0 || !IGNORE_TOTAL_COLUMN_WITHOUT_MEASURE) {
              if (mCount > 0 && !isVerticalMeasure) {
                for (int i = measureIndex + 1; i < mCount; i++) {
                  if (GroupUtil.hasTotalContent(crosstabItem, COLUMN_AXIS_TYPE, -1, -1, i)) {
                    measureIndex = i;
                    currentState = STATE_GRAND_TOTAL;
                    return;
                  }
                }
              } else if (currentState != STATE_GRAND_TOTAL) {
                if (GroupUtil.hasTotalContent(crosstabItem, COLUMN_AXIS_TYPE, -1, -1, -1)) {
                  currentState = STATE_GRAND_TOTAL;
                  return;
                }
              }
            }

            // check if this is grandtotal_before, then forward the
            // processing to column edge
            if (inProcessingGrandTotalBefore) {
              inProcessingGrandTotalBefore = false;

              currentState = STATE_PENDING_CHECK_COLUMN_EDGE;
              return;
            }
          }

          currentState = STATE_END;
          return;
        }

      case STATE_MEASURE:

        // process measure columns in case no column edge defined
        if (!isVerticalMeasure) {
          for (int i = measureIndex + 1; i < mCount; i++) {
            measureIndex = i;
            currentState = STATE_MEASURE;
            return;
          }
        } else if (measureIndex == -1 && mCount > 0) {
          measureIndex--;
          currentState = STATE_MEASURE;
          return;
        }

        currentState = STATE_END;
        return;
    }
  }