# tagHistory in SDK module

**URL:** <https://forum.inductiveautomation.com/t/taghistory-in-sdk-module/68933>\
**Category:** Module Development\
**Tags:** scripting\
**Created:** [January 23, 2023, 8:00pm UTC](https://forum.inductiveautomation.com/t/taghistory-in-sdk-module/68933 "2023-01-23T20:00:01Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Sebastian\_Munoz\_Vasq](https://avatars.discourse-cdn.com/v4/letter/s/ebca7d/32.png) [@Sebastian\_Munoz\_Vasq](https://forum.inductiveautomation.com/u/Sebastian_Munoz_Vasq)\
**Post date:** [January 23, 2023, 8:00pm UTC](https://forum.inductiveautomation.com/t/taghistory-in-sdk-module/68933/1 "2023-01-23T20:00:01Z")

</div>

Hello,  
I am developing a script to make a query in the database from the SDK module, in designer script I use system.tag.queryTagHistory to get the dataset, but I can't find the function to get the dataset from java, would there be any way to make that query? thank you

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [January 23, 2023, 8:43pm UTC](https://forum.inductiveautomation.com/t/taghistory-in-sdk-module/68933/2 "2023-01-23T20:43:49Z")

</div>

From the `GatewayContext` delivered to your module's setup, you get the [`GatewayTagHistoryManager`](https://files.inductiveautomation.com/sdk/javadoc/ignition81/8.1.24/com/inductiveautomation/ignition/gateway/model/GatewayContext.html#getTagHistoryManager()). From there, issue a [tag history query](https://files.inductiveautomation.com/sdk/javadoc/ignition81/8.1.24/com/inductiveautomation/ignition/gateway/sqltags/history/TagHistoryManager.html#queryHistory(com.inductiveautomation.ignition.common.sqltags.history.TagHistoryQueryParams,com.inductiveautomation.ignition.common.StreamingDatasetWriter)) you [constructed](https://files.inductiveautomation.com/sdk/javadoc/ignition81/8.1.24/com/inductiveautomation/ignition/common/sqltags/history/BasicTagHistoryQueryParams.html), and collect the results in a [`BasicStreamingDataset`](https://files.inductiveautomation.com/sdk/javadoc/ignition81/8.1.24/com/inductiveautomation/ignition/gateway/datasource/BasicStreamingDataset.html), which implements the `Dataset` interface.

---

<div class="post-metadata">

**Author:** ![Sebastian\_Munoz\_Vasq](https://avatars.discourse-cdn.com/v4/letter/s/ebca7d/32.png) [@Sebastian\_Munoz\_Vasq](https://forum.inductiveautomation.com/u/Sebastian_Munoz_Vasq)\
**Post date:** [January 25, 2023, 8:23pm UTC](https://forum.inductiveautomation.com/t/taghistory-in-sdk-module/68933/3 "2023-01-25T20:23:17Z")

</div>

I understand, while building it I have another problem, for the BasicStreamingDataset I need a StreamingDatasetWriter and I have an error to initialize it in the columType parameter.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [January 25, 2023, 8:33pm UTC](https://forum.inductiveautomation.com/t/taghistory-in-sdk-module/68933/4 "2023-01-25T20:33:00Z")

</div>

`public class BasicStreamingDataset extends AbstractDataset implements StreamingDatasetWriter`

You don't need an additional class. Construct a `BasicStreamingDataset` and pass it directly to `queryHistory`.

---

<div class="post-metadata">

**Author:** ![Sebastian\_Munoz\_Vasq](https://avatars.discourse-cdn.com/v4/letter/s/ebca7d/32.png) [@Sebastian\_Munoz\_Vasq](https://forum.inductiveautomation.com/u/Sebastian_Munoz_Vasq)\
**Post date:** [January 25, 2023, 8:46pm UTC](https://forum.inductiveautomation.com/t/taghistory-in-sdk-module/68933/5 "2023-01-25T20:46:04Z")

</div>

Ok, to build the BasicStreamingDataset I need two lists, one of names and the other of types, the list of types is the one that is giving me error

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [January 25, 2023, 8:53pm UTC](https://forum.inductiveautomation.com/t/taghistory-in-sdk-module/68933/6 "2023-01-25T20:53:46Z")

</div>

No, you don't? It has a no-arg constructor.

[https://files.inductiveautomation.com/sdk/javadoc/ignition81/8.1.24/com/inductiveautomation/ignition/gateway/datasource/BasicStreamingDataset.html#constructor.summary](https://files.inductiveautomation.com/sdk/javadoc/ignition81/8.1.24/com/inductiveautomation/ignition/gateway/datasource/BasicStreamingDataset.html#constructor.summary)

---

<div class="post-metadata">

**Author:** ![Sebastian\_Munoz\_Vasq](https://avatars.discourse-cdn.com/v4/letter/s/ebca7d/32.png) [@Sebastian\_Munoz\_Vasq](https://forum.inductiveautomation.com/u/Sebastian_Munoz_Vasq)\
**Post date:** [January 25, 2023, 9:50pm UTC](https://forum.inductiveautomation.com/t/taghistory-in-sdk-module/68933/7 "2023-01-25T21:50:28Z")

</div>

I was able to perform the query, thank you very much  
tagHistoryManager.queryHistory(params,dataStream);  
What option could you recommend me to validate the data I am getting in dataStream?

---

<div class="post-metadata">

**Author:** ![Manuel\_Rodriguez](https://avatars.discourse-cdn.com/v4/letter/m/94ad74/32.png) [@Manuel\_Rodriguez](https://forum.inductiveautomation.com/u/Manuel_Rodriguez)\
**Post date:** [December 23, 2024, 1:45am UTC](https://forum.inductiveautomation.com/t/taghistory-in-sdk-module/68933/8 "2024-12-23T01:45:31Z")

</div>

I am trying to get historical always getting 0.0 as value data using this code:

> Blockquote  
> public void getTagHistoryProvider() {  
> this.historyManager = context.getTagHistoryManager();

```
    try {
        int rangeLength = 600;
        TimeUnits rangeUnits = TimeUnits.MIN;
        int returnSize = 10; // -1 for all raw data
        AggregationMode aggregationMode = AggregationMode.MinMax; // Assuming RAW is a valid enum
        ReturnFormat returnFormat = ReturnFormat.Wide; // Adjust as needed
        List<String> aliases = null; // or Arrays.asList("Alias1", "Alias2")
        List<Aggregate> colAggModes = null; // or specify per tag

        // 2) Build a list of the tag paths we want to query
        List<Path> tagPaths = Arrays.asList(
                TagPathParser.parse("[Sorba/sorba]Cluster1/INPUTS/Flow"),
                TagPathParser.parse("[Sorba]Cluster1/INPUTS/Temp"),
                TagPathParser.parse("[SORBA]Cluster1/INPUTS/Temp"),
                TagPathParser.parse("[Sorba/sorba]Cluster1/INPUTS/Flow"),
                TagPathParser.parse("[Sorba/sorba]cluster1/inputs/temp"),
                TagPathParser.parse("cluster1/inputs/temp")
        );

        Date endDate = new Date(); // Current time
        Date startDate = new Date(endDate.getTime() - 100000);

        BasicTagHistoryQueryParams queryParams = new BasicTagHistoryQueryParams(
                tagPaths,
                startDate,
                endDate,
                returnSize,
                aggregationMode,
                returnFormat,
                aliases,
                colAggModes
        );

        StreamingDatasetWriter writer = new StreamingDatasetWriter() {
            @Override
            public void initialize(String[] columnNames, Class<?>[] columnTypes, boolean supportsQuality, int expectedRows) {
                logger.info("Data History Column Names: " + Arrays.toString(columnNames));
                logger.info("Data History Expected Rows: " + expectedRows);
            }

            @Override
            public void write(Object[] data, QualityCode[] quality) {
                logger.info("Data History: " + Arrays.toString(data));
                logger.info("Data History Quality: " + Arrays.toString(quality));
            }

            @Override
            public void finish() {
            }

            @Override
            public void finishWithError(Exception e) {
            }
        };

        this.historyManager.queryHistory(queryParams, writer);
    } catch (Exception e) {
        logger.error("Error finding historic data:", e);
    }
}

```

> Blockquote  
> I have used python code and I get the values as expected:  
> endTime = system.date.now()  
> startTime = system.date.addMinutes(endTime, -600)  
> dataSet = system.tag.queryTagHistory(  
> paths=['[Sorba/sorba]Cluster1/INPUTS/Flow'],  
> startDate=startTime,  
> endDate=endTime,  
> returnSize=10,  
> aggregationMode="MinMax",  
> returnFormat='Wide'  
> )

I think is not resolving the correct path in java module, any suggestion?

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [December 23, 2024, 12:54pm UTC](https://forum.inductiveautomation.com/t/taghistory-in-sdk-module/68933/9 "2024-12-23T12:54:25Z")

</div>

Please fix your code block to use "Preformatted text", not Block Quote.

Please see [Wiki - how to post code on this forum](https://forum.inductiveautomation.com/t/wiki-how-to-post-code-on-this-forum/77831).
