mirror of
https://github.com/Kingsrook/qqq.git
synced 2025-07-18 13:10:44 +00:00
CE-881 - Add pivot table details to QReportView, renaming previous "pivot" things to "summary"
This commit is contained in:
@ -428,7 +428,7 @@ public class GenerateReportAction
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(String summaryField : CollectionUtils.nonNullList(view.getPivotFields()))
|
for(String summaryField : CollectionUtils.nonNullList(view.getSummaryFields()))
|
||||||
{
|
{
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// all pivotFields that are possible value sources are implicitly translated //
|
// all pivotFields that are possible value sources are implicitly translated //
|
||||||
@ -545,7 +545,7 @@ public class GenerateReportAction
|
|||||||
for(QRecord record : records)
|
for(QRecord record : records)
|
||||||
{
|
{
|
||||||
SummaryKey key = new SummaryKey();
|
SummaryKey key = new SummaryKey();
|
||||||
for(String summaryField : view.getPivotFields())
|
for(String summaryField : view.getSummaryFields())
|
||||||
{
|
{
|
||||||
Serializable summaryValue = record.getValue(summaryField);
|
Serializable summaryValue = record.getValue(summaryField);
|
||||||
if(table.getField(summaryField).getPossibleValueSourceName() != null)
|
if(table.getField(summaryField).getPossibleValueSourceName() != null)
|
||||||
@ -557,7 +557,7 @@ public class GenerateReportAction
|
|||||||
}
|
}
|
||||||
key.add(summaryField, summaryValue);
|
key.add(summaryField, summaryValue);
|
||||||
|
|
||||||
if(view.getIncludePivotSubTotals() && key.getKeys().size() < view.getPivotFields().size())
|
if(view.getIncludeSummarySubTotals() && key.getKeys().size() < view.getSummaryFields().size())
|
||||||
{
|
{
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// be careful here, with these key objects, and their identity, being used as map keys //
|
// be careful here, with these key objects, and their identity, being used as map keys //
|
||||||
@ -694,10 +694,10 @@ public class GenerateReportAction
|
|||||||
private List<QFieldMetaData> getFields(QTableMetaData table, QReportView view)
|
private List<QFieldMetaData> getFields(QTableMetaData table, QReportView view)
|
||||||
{
|
{
|
||||||
List<QFieldMetaData> fields = new ArrayList<>();
|
List<QFieldMetaData> fields = new ArrayList<>();
|
||||||
for(String pivotField : view.getPivotFields())
|
for(String summaryField : view.getSummaryFields())
|
||||||
{
|
{
|
||||||
QFieldMetaData field = table.getField(pivotField);
|
QFieldMetaData field = table.getField(summaryField);
|
||||||
fields.add(new QFieldMetaData(pivotField, field.getType()).withLabel(field.getLabel())); // todo do we need the type? if so need table as input here
|
fields.add(new QFieldMetaData(summaryField, field.getType()).withLabel(field.getLabel())); // todo do we need the type? if so need table as input here
|
||||||
}
|
}
|
||||||
for(QReportField column : view.getColumns())
|
for(QReportField column : view.getColumns())
|
||||||
{
|
{
|
||||||
@ -761,7 +761,7 @@ public class GenerateReportAction
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// for summary subtotals, add the text "Total" to the last field in this key //
|
// for summary subtotals, add the text "Total" to the last field in this key //
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
if(summaryKey.getKeys().size() < view.getPivotFields().size())
|
if(summaryKey.getKeys().size() < view.getSummaryFields().size())
|
||||||
{
|
{
|
||||||
String fieldName = summaryKey.getKeys().get(summaryKey.getKeys().size() - 1).getA();
|
String fieldName = summaryKey.getKeys().get(summaryKey.getKeys().size() - 1).getA();
|
||||||
summaryRow.setValue(fieldName, summaryRow.getValueString(fieldName) + " Total");
|
summaryRow.setValue(fieldName, summaryRow.getValueString(fieldName) + " Total");
|
||||||
@ -799,11 +799,11 @@ public class GenerateReportAction
|
|||||||
{
|
{
|
||||||
totalRow = new QRecord();
|
totalRow = new QRecord();
|
||||||
|
|
||||||
for(String pivotField : view.getPivotFields())
|
for(String summaryField : view.getSummaryFields())
|
||||||
{
|
{
|
||||||
if(totalRow.getValues().isEmpty())
|
if(totalRow.getValues().isEmpty())
|
||||||
{
|
{
|
||||||
totalRow.setValue(pivotField, "Totals");
|
totalRow.setValue(summaryField, "Totals");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ import java.util.List;
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
** Full definition of a pivot table - its rows, columns, and values.
|
** Full definition of a pivot table - its rows, columns, and values.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
public class PivotTableDefinition
|
public class PivotTableDefinition implements Cloneable
|
||||||
{
|
{
|
||||||
private List<PivotTableGroupBy> rows;
|
private List<PivotTableGroupBy> rows;
|
||||||
private List<PivotTableGroupBy> columns;
|
private List<PivotTableGroupBy> columns;
|
||||||
@ -37,6 +37,46 @@ public class PivotTableDefinition
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
@Override
|
||||||
|
protected PivotTableDefinition clone() throws CloneNotSupportedException
|
||||||
|
{
|
||||||
|
PivotTableDefinition clone = (PivotTableDefinition) super.clone();
|
||||||
|
|
||||||
|
if(rows != null)
|
||||||
|
{
|
||||||
|
clone.rows = new ArrayList<>();
|
||||||
|
for(PivotTableGroupBy row : rows)
|
||||||
|
{
|
||||||
|
clone.rows.add(row.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(columns != null)
|
||||||
|
{
|
||||||
|
clone.columns = new ArrayList<>();
|
||||||
|
for(PivotTableGroupBy column : columns)
|
||||||
|
{
|
||||||
|
clone.columns.add(column.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(values != null)
|
||||||
|
{
|
||||||
|
clone.values = new ArrayList<>();
|
||||||
|
for(PivotTableValue value : values)
|
||||||
|
{
|
||||||
|
clone.values.add(value.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (clone);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
**
|
**
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
@ -26,7 +26,7 @@ package com.kingsrook.qqq.backend.core.actions.reporting.pivottable;
|
|||||||
** Either a row or column grouping in a pivot table. e.g., a field plus
|
** Either a row or column grouping in a pivot table. e.g., a field plus
|
||||||
** sorting details, plus showTotals boolean.
|
** sorting details, plus showTotals boolean.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
public class PivotTableGroupBy
|
public class PivotTableGroupBy implements Cloneable
|
||||||
{
|
{
|
||||||
private String fieldName;
|
private String fieldName;
|
||||||
private PivotTableOrderBy orderBy;
|
private PivotTableOrderBy orderBy;
|
||||||
@ -125,4 +125,16 @@ public class PivotTableGroupBy
|
|||||||
return (this);
|
return (this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
@Override
|
||||||
|
public PivotTableGroupBy clone() throws CloneNotSupportedException
|
||||||
|
{
|
||||||
|
PivotTableGroupBy clone = (PivotTableGroupBy) super.clone();
|
||||||
|
return clone;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -25,12 +25,13 @@ package com.kingsrook.qqq.backend.core.actions.reporting.pivottable;
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
** a value (e.g., field name + function) used in a pivot table
|
** a value (e.g., field name + function) used in a pivot table
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
public class PivotTableValue
|
public class PivotTableValue implements Cloneable
|
||||||
{
|
{
|
||||||
private String fieldName;
|
private String fieldName;
|
||||||
private PivotTableFunction function;
|
private PivotTableFunction function;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
** Getter for fieldName
|
** Getter for fieldName
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
@ -91,4 +92,16 @@ public class PivotTableValue
|
|||||||
return (this);
|
return (this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
@Override
|
||||||
|
public PivotTableValue clone() throws CloneNotSupportedException
|
||||||
|
{
|
||||||
|
PivotTableValue clone = (PivotTableValue) super.clone();
|
||||||
|
return clone;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@ package com.kingsrook.qqq.backend.core.model.metadata.reporting;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import com.kingsrook.qqq.backend.core.actions.reporting.pivottable.PivotTableDefinition;
|
||||||
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterOrderBy;
|
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterOrderBy;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference;
|
import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference;
|
||||||
|
|
||||||
@ -40,11 +41,11 @@ public class QReportView implements Cloneable
|
|||||||
private ReportType type;
|
private ReportType type;
|
||||||
private String titleFormat;
|
private String titleFormat;
|
||||||
private List<String> titleFields;
|
private List<String> titleFields;
|
||||||
private List<String> pivotFields;
|
private List<String> summaryFields;
|
||||||
|
|
||||||
private boolean includeHeaderRow = true;
|
private boolean includeHeaderRow = true;
|
||||||
private boolean includeTotalRow = false;
|
private boolean includeTotalRow = false;
|
||||||
private boolean includePivotSubTotals = false;
|
private boolean includeSummarySubTotals = false;
|
||||||
|
|
||||||
private List<QReportField> columns;
|
private List<QReportField> columns;
|
||||||
private List<QFilterOrderBy> orderByFields;
|
private List<QFilterOrderBy> orderByFields;
|
||||||
@ -52,6 +53,9 @@ public class QReportView implements Cloneable
|
|||||||
private QCodeReference recordTransformStep;
|
private QCodeReference recordTransformStep;
|
||||||
private QCodeReference viewCustomizer;
|
private QCodeReference viewCustomizer;
|
||||||
|
|
||||||
|
private String pivotTableSourceViewName;
|
||||||
|
private PivotTableDefinition pivotTableDefinition;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Note: This class is Cloneable - think about if new fields added here need deep-copied in the clone method! //
|
// Note: This class is Cloneable - think about if new fields added here need deep-copied in the clone method! //
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -297,34 +301,34 @@ public class QReportView implements Cloneable
|
|||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
** Getter for pivotFields
|
** Getter for summaryFields
|
||||||
**
|
**
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
public List<String> getPivotFields()
|
public List<String> getSummaryFields()
|
||||||
{
|
{
|
||||||
return pivotFields;
|
return summaryFields;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
** Setter for pivotFields
|
** Setter for summaryFields
|
||||||
**
|
**
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
public void setPivotFields(List<String> pivotFields)
|
public void setSummaryFields(List<String> summaryFields)
|
||||||
{
|
{
|
||||||
this.pivotFields = pivotFields;
|
this.summaryFields = summaryFields;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
** Fluent setter for pivotFields
|
** Fluent setter for summaryFields
|
||||||
**
|
**
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
public QReportView withPivotFields(List<String> pivotFields)
|
public QReportView withSummaryFields(List<String> summaryFields)
|
||||||
{
|
{
|
||||||
this.pivotFields = pivotFields;
|
this.summaryFields = summaryFields;
|
||||||
return (this);
|
return (this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -399,34 +403,34 @@ public class QReportView implements Cloneable
|
|||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
** Getter for pivotSubTotals
|
** Getter for summarySubTotals
|
||||||
**
|
**
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
public boolean getIncludePivotSubTotals()
|
public boolean getIncludeSummarySubTotals()
|
||||||
{
|
{
|
||||||
return includePivotSubTotals;
|
return includeSummarySubTotals;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
** Setter for pivotSubTotals
|
** Setter for summarySubTotals
|
||||||
**
|
**
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
public void setIncludePivotSubTotals(boolean includePivotSubTotals)
|
public void setIncludeSummarySubTotals(boolean includeSummarySubTotals)
|
||||||
{
|
{
|
||||||
this.includePivotSubTotals = includePivotSubTotals;
|
this.includeSummarySubTotals = includeSummarySubTotals;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
** Fluent setter for pivotSubTotals
|
** Fluent setter for summarySubTotals
|
||||||
**
|
**
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
public QReportView withIncludePivotSubTotals(boolean pivotSubTotals)
|
public QReportView withIncludeSummarySubTotals(boolean summarySubTotals)
|
||||||
{
|
{
|
||||||
this.includePivotSubTotals = pivotSubTotals;
|
this.includeSummarySubTotals = summarySubTotals;
|
||||||
return (this);
|
return (this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -602,9 +606,9 @@ public class QReportView implements Cloneable
|
|||||||
clone.setTitleFields(new ArrayList<>(titleFields));
|
clone.setTitleFields(new ArrayList<>(titleFields));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pivotFields != null)
|
if(summaryFields != null)
|
||||||
{
|
{
|
||||||
clone.setPivotFields(new ArrayList<>(pivotFields));
|
clone.setSummaryFields(new ArrayList<>(summaryFields));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(columns != null)
|
if(columns != null)
|
||||||
@ -624,4 +628,67 @@ public class QReportView implements Cloneable
|
|||||||
throw new AssertionError();
|
throw new AssertionError();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
** Getter for pivotTableSourceViewName
|
||||||
|
*******************************************************************************/
|
||||||
|
public String getPivotTableSourceViewName()
|
||||||
|
{
|
||||||
|
return (this.pivotTableSourceViewName);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
** Setter for pivotTableSourceViewName
|
||||||
|
*******************************************************************************/
|
||||||
|
public void setPivotTableSourceViewName(String pivotTableSourceViewName)
|
||||||
|
{
|
||||||
|
this.pivotTableSourceViewName = pivotTableSourceViewName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
** Fluent setter for pivotTableSourceViewName
|
||||||
|
*******************************************************************************/
|
||||||
|
public QReportView withPivotTableSourceViewName(String pivotTableSourceViewName)
|
||||||
|
{
|
||||||
|
this.pivotTableSourceViewName = pivotTableSourceViewName;
|
||||||
|
return (this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
** Getter for pivotTableDefinition
|
||||||
|
*******************************************************************************/
|
||||||
|
public PivotTableDefinition getPivotTableDefinition()
|
||||||
|
{
|
||||||
|
return (this.pivotTableDefinition);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
** Setter for pivotTableDefinition
|
||||||
|
*******************************************************************************/
|
||||||
|
public void setPivotTableDefinition(PivotTableDefinition pivotTableDefinition)
|
||||||
|
{
|
||||||
|
this.pivotTableDefinition = pivotTableDefinition;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
** Fluent setter for pivotTableDefinition
|
||||||
|
*******************************************************************************/
|
||||||
|
public QReportView withPivotTableDefinition(PivotTableDefinition pivotTableDefinition)
|
||||||
|
{
|
||||||
|
this.pivotTableDefinition = pivotTableDefinition;
|
||||||
|
return (this);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,6 @@ package com.kingsrook.qqq.backend.core.model.metadata.reporting;
|
|||||||
public enum ReportType
|
public enum ReportType
|
||||||
{
|
{
|
||||||
TABLE, // e.g., raw data in tabular form.
|
TABLE, // e.g., raw data in tabular form.
|
||||||
SUMMARY, // e.g., summaries computed within QQQ
|
SUMMARY, // e.g., summaries computed within QQQ.
|
||||||
PIVOT // e.g., a true spreadsheet pivot. Not initially supported...
|
PIVOT // e.g., a true spreadsheet pivot.
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user