Skip to content

Conversation

@Cool6689
Copy link

This PR achieves the refactoring of mathematical operators for tree models by reusing the type inference and runtime execution infrastructure generated by the FreeMarker template engine.

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi, this is your first pull request in IoTDB project. Thanks for your contribution! IoTDB will be better because of you.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refactors arithmetic operators for tree models by introducing TSDataType-based type inference alongside the existing Type system. The refactoring delegates operator type resolution to dedicated resolver classes and introduces a new API layer (ArithmeticColumnTransformerApi) for creating column transformers.

Key changes:

  • Added TSDataType support to arithmetic resolver classes (Addition, Subtraction, Multiplication, Division, Modulus)
  • Refactored ColumnTransformerVisitor to use ArithmeticColumnTransformerApi instead of direct transformer instantiation
  • Updated ExpressionTypeAnalyzer to use resolver-based type inference with comprehensive error handling
  • Added SessionInfo integration for ZoneId access in operator tree generation
  • Expanded test coverage for DATE/TIMESTAMP arithmetic, negation operations, overflow handling, and error cases

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
AdditionResolver.java Added CONDITION_MAP_TREE and inferType method for TSDataType support with DATE/TIMESTAMP operations
SubtractionResolver.java Added CONDITION_MAP_TREE and inferType method for TSDataType support with DATE/TIMESTAMP operations
MultiplicationResolver.java Added CONDITION_MAP_TREE and inferType method for TSDataType support (no DATE/TIMESTAMP)
ModulusResolver.java Added CONDITION_MAP_TREE and inferType method for TSDataType support (no DATE/TIMESTAMP)
DivisionResolver.java Added CONDITION_MAP_TREE and inferType method for TSDataType support (no DATE/TIMESTAMP)
ColumnTransformerVisitor.java Replaced direct transformer instantiation with ArithmeticColumnTransformerApi calls; added SessionInfo/ZoneId support
ExpressionTypeAnalyzer.java Refactored arithmetic type inference to use resolver classes with improved error messages
OperatorTreeGenerator.java Added SessionInfo parameter to ColumnTransformerVisitorContext constructors
IoTDBArithmeticIT.java Added comprehensive tests for new DATE/TIMESTAMP arithmetic, negation, overflow, and error handling

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.ArithmeticModuloColumnTransformer;
import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.ArithmeticMultiplicationColumnTransformer;
import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.ArithmeticSubtractionColumnTransformer;
import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.ArithmeticColumnTransformerApi;
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The ArithmeticColumnTransformerApi class is imported and used throughout this file but is not included in this PR. This will cause compilation failures as the class doesn't exist in the codebase. The API class must be added to the PR or this import should reference an existing class.

Suggested change
import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.ArithmeticColumnTransformerApi;

Copilot uses AI. Check for mistakes.
Comment on lines +90 to +131
addConditionTS(TSDataType.INT32, TSDataType.INT32, TSDataType.INT32);
addConditionTS(TSDataType.INT32, TSDataType.INT64, TSDataType.INT64);
addConditionTS(TSDataType.INT32, TSDataType.FLOAT, TSDataType.FLOAT);
addConditionTS(TSDataType.INT32, TSDataType.DOUBLE, TSDataType.DOUBLE);
addConditionTS(TSDataType.INT32, TSDataType.DATE, TSDataType.DATE);
addConditionTS(TSDataType.INT32, TSDataType.TIMESTAMP, TSDataType.TIMESTAMP);
addConditionTS(TSDataType.INT32, TSDataType.UNKNOWN, TSDataType.INT32);

addConditionTS(TSDataType.INT64, TSDataType.INT32, TSDataType.INT64);
addConditionTS(TSDataType.INT64, TSDataType.INT64, TSDataType.INT64);
addConditionTS(TSDataType.INT64, TSDataType.FLOAT, TSDataType.FLOAT);
addConditionTS(TSDataType.INT64, TSDataType.DOUBLE, TSDataType.DOUBLE);
addConditionTS(TSDataType.INT64, TSDataType.DATE, TSDataType.DATE);
addConditionTS(TSDataType.INT64, TSDataType.TIMESTAMP, TSDataType.TIMESTAMP);
addConditionTS(TSDataType.INT64, TSDataType.UNKNOWN, TSDataType.INT64);

addConditionTS(TSDataType.FLOAT, TSDataType.INT32, TSDataType.FLOAT);
addConditionTS(TSDataType.FLOAT, TSDataType.INT64, TSDataType.FLOAT);
addConditionTS(TSDataType.FLOAT, TSDataType.FLOAT, TSDataType.FLOAT);
addConditionTS(TSDataType.FLOAT, TSDataType.DOUBLE, TSDataType.DOUBLE);
addConditionTS(TSDataType.FLOAT, TSDataType.UNKNOWN, TSDataType.FLOAT);

addConditionTS(TSDataType.DOUBLE, TSDataType.INT32, TSDataType.DOUBLE);
addConditionTS(TSDataType.DOUBLE, TSDataType.INT64, TSDataType.DOUBLE);
addConditionTS(TSDataType.DOUBLE, TSDataType.FLOAT, TSDataType.DOUBLE);
addConditionTS(TSDataType.DOUBLE, TSDataType.DOUBLE, TSDataType.DOUBLE);
addConditionTS(TSDataType.DOUBLE, TSDataType.UNKNOWN, TSDataType.DOUBLE);

addConditionTS(TSDataType.DATE, TSDataType.INT32, TSDataType.DATE);
addConditionTS(TSDataType.DATE, TSDataType.INT64, TSDataType.DATE);
addConditionTS(TSDataType.DATE, TSDataType.UNKNOWN, TSDataType.DATE);

addConditionTS(TSDataType.TIMESTAMP, TSDataType.INT32, TSDataType.TIMESTAMP);
addConditionTS(TSDataType.TIMESTAMP, TSDataType.INT64, TSDataType.TIMESTAMP);
addConditionTS(TSDataType.TIMESTAMP, TSDataType.UNKNOWN, TSDataType.TIMESTAMP);

addConditionTS(TSDataType.UNKNOWN, TSDataType.INT32, TSDataType.INT32);
addConditionTS(TSDataType.UNKNOWN, TSDataType.INT64, TSDataType.INT64);
addConditionTS(TSDataType.UNKNOWN, TSDataType.FLOAT, TSDataType.FLOAT);
addConditionTS(TSDataType.UNKNOWN, TSDataType.DOUBLE, TSDataType.DOUBLE);
addConditionTS(TSDataType.UNKNOWN, TSDataType.DATE, TSDataType.DATE);
addConditionTS(TSDataType.UNKNOWN, TSDataType.TIMESTAMP, TSDataType.TIMESTAMP);
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The CONDITION_MAP_TREE initialization duplicates the exact same type promotion rules as CONDITION_MAP (lines 47-88). This duplication exists across all five resolver classes (Addition, Subtraction, Multiplication, Modulus, Division). Consider extracting this logic into a shared utility method or using a conversion function between Type and TSDataType to maintain a single source of truth for type promotion rules.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant