##Table=group

#inputs

##Input=source
##Fields=field multiple Input
##Frequency=sink table


from processing.tools.vector import TableWriter
from collections import defaultdict
from qgis.core import QgsProcessingUtils, QgsFields, QgsField, QgsWkbTypes, QgsFeature
from qgis.PyQt.QtCore import QVariant
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException

inputFields = Input.fields()
fieldIdxs = []
out_fields = QgsFields()
for f in Fields:
    idx = inputFields.indexFromName(f)
    if idx == -1:
        raise GeoAlgorithmExecutionException('Field not found:' + f)
    fieldIdxs.append(idx)
    out_fields.append(inputFields.at(idx))

out_fields.append(QgsField('FREQ', QVariant.Int))

(sink, Frequency) = self.parameterAsSink(parameters, 'Frequency', context,
                                         out_fields)

counts = {}
feats = Input.getFeatures()
nFeats = Input.featureCount()
counts = defaultdict(int)
for i, feat in enumerate(feats):
    feedback.setProgress(int(100 * i / nFeats))
    if feedback.isCanceled():
        break

    attrs = feat.attributes()
    clazz = tuple([attrs[i] for i in fieldIdxs])
    counts[clazz] += 1

for c in counts:
    f = QgsFeature()
    f.setAttributes(list(c) + [counts[c]])
    sink.addFeature(f)