Skip to content

Commit 7a1176b

Browse files
authored
Merge pull request #103 from oracle/dev/1.6.0
dev/1.6.0
2 parents c6a18d4 + 1af2dd4 commit 7a1176b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+831
-783
lines changed

.github/workflows/oracle-xe-adapter-tests.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ jobs:
88
fail-fast: true
99
matrix:
1010
os: [ ubuntu-latest ]
11-
python-version: [ '3.7', '3.8', '3.9', '3.10', '3.11' ]
11+
python-version: [ '3.8', '3.9', '3.10', '3.11' ]
1212

1313
services:
1414
oracle_db_xe:
@@ -48,10 +48,9 @@ jobs:
4848
- name: Install dbt-oracle with core dependencies
4949
run: |
5050
python -m pip install --upgrade pip
51-
pip install pytest dbt-tests-adapter==1.5.3
51+
pip install pytest dbt-tests-adapter~=1.6
5252
pip install -r requirements.txt
5353
pip install -e .
54-
pip install sqlparse==0.4.3
5554
5655
- name: Check create-pem-from-p12 script is installed in bin
5756
run: |

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,4 +146,5 @@ doc/build.gitbak
146146
.venv1.3/
147147
.venv1.4/
148148
.venv1.5/
149+
.venv1.6/
149150
dbt_adbs_py_test_project

MANIFEST.in

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1 @@
1-
include CONTRIBUTING.rst
2-
include HISTORY.md
3-
include LICENSE
4-
include README.rst
5-
include README.md
6-
7-
recursive-include tests *
8-
recursive-exclude * __pycache__
9-
recursive-exclude * *.py[co]
10-
11-
recursive-include docs *.rst conf.py Makefile make.bat *.jpg *.png *.gif
1+
recursive-include dbt/include *.sql *.yml *.md

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Configuration variables
2-
VERSION=1.5.2
2+
VERSION=1.6.0
33
PROJ_DIR?=$(shell pwd)
44
VENV_DIR?=${PROJ_DIR}/.bldenv
55
BUILD_DIR=${PROJ_DIR}/build

dbt/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,6 @@
1414
See the License for the specific language governing permissions and
1515
limitations under the License.
1616
"""
17-
__path__ = __import__('pkgutil').extend_path(__path__, __name__)
17+
from pkgutil import extend_path
18+
19+
__path__ = extend_path(__path__, __name__)

dbt/adapters/oracle/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@
1414
See the License for the specific language governing permissions and
1515
limitations under the License.
1616
"""
17-
version = "1.5.3"
17+
version = "1.6.0"

dbt/adapters/oracle/connection_helper.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import dbt.exceptions
2121
from dbt.events import AdapterLogger
2222

23-
from dbt.ui import warning_tag, yellow
23+
from dbt.ui import warning_tag, yellow, red
2424

2525
logger = AdapterLogger("oracle")
2626

@@ -104,14 +104,15 @@ class OracleDriverType(str, enum.Enum):
104104
if ORA_PYTHON_DRIVER_TYPE == OracleDriverType.CX_ORACLE:
105105
logger.info("Running in cx mode")
106106
description = (
107-
f"cx_oracle will soon be deprecated, use python-oracledb"
107+
f"cx_oracle is no longer maintained, use python-oracledb"
108108
f"\n\nTo switch to python-oracledb set the environment variable ORA_PYTHON_DRIVER_TYPE=thin "
109+
f"\n\nDefault value of ORA_PYTHON_DRIVER_TYPE will be switched to thin started with v1.7.0 "
109110
f"\n\nRead the guideline here: "
110111
f"https://docs.getdbt.com/reference/warehouse-setups/oracle-setup#configure-the-python-driver-mode"
111112
f"\n\nDocumentation for python-oracledb can be found here: "
112113
f"https://oracle.github.io/python-oracledb/"
113114
)
114-
logger.warning(warning_tag(yellow(description)))
115+
logger.warning(warning_tag(red(description)))
115116
import cx_Oracle as oracledb
116117
elif ORA_PYTHON_DRIVER_TYPE == OracleDriverType.THICK:
117118
import oracledb

dbt/adapters/oracle/connections.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,9 @@ def open(cls, connection):
192192
'dsn': dsn
193193
}
194194

195+
if oracledb.__name__ == "oracledb":
196+
conn_config['connection_id_prefix'] = 'dbt-oracle-'
197+
195198
if credentials.shardingkey:
196199
conn_config['shardingkey'] = credentials.shardingkey
197200

dbt/adapters/oracle/impl.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,11 +104,8 @@ def date_function(cls):
104104

105105
@classmethod
106106
def convert_text_type(cls, agate_table, col_idx):
107-
column = agate_table.columns[col_idx]
108-
lens = (len(d.encode("utf-8")) for d in column.values_without_nulls())
109-
max_len = max(lens) if lens else 64
110-
length = max_len if max_len > 16 else 16
111-
return "varchar2({})".format(length)
107+
# Keep this consistent with STRING/TEXT datatypes mapped to "VARCHAR2(4000)"
108+
return "varchar2(4000)"
112109

113110
@classmethod
114111
def convert_date_type(cls, agate_table, col_idx):

dbt/adapters/oracle/relation.py

Lines changed: 116 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,32 +14,136 @@
1414
See the License for the specific language governing permissions and
1515
limitations under the License.
1616
"""
17-
from dataclasses import dataclass, field
17+
from typing import Optional
1818

19-
from dbt.adapters.base.relation import BaseRelation, Policy
19+
from dataclasses import dataclass, field
2020

21+
from dbt.adapters.base.relation import BaseRelation
22+
from dbt.adapters.relation_configs import (
23+
RelationConfigBase,
24+
RelationConfigChangeAction,
25+
RelationResults,
26+
)
27+
from dbt.context.providers import RuntimeConfigObject
28+
from dbt.contracts.graph.nodes import ModelNode
29+
from dbt.contracts.relation import RelationType
30+
from dbt.exceptions import DbtRuntimeError
2131

22-
@dataclass
23-
class OracleQuotePolicy(Policy):
24-
database: bool = False
25-
schema: bool = False
26-
identifier: bool = False
32+
from dbt.adapters.oracle.relation_configs import (
33+
OracleMaterializedViewConfig,
34+
OracleRefreshMethodConfigChange,
35+
OracleMaterializedViewConfigChangeset,
36+
OracleRefreshModeConfigChange,
37+
OracleBuildModeConfigChange,
38+
OracleQueryRewriteConfigChange,
39+
OracleQueryConfigChange,
40+
OracleQuotePolicy,
41+
OracleIncludePolicy)
2742

43+
from dbt.events import AdapterLogger
2844

29-
@dataclass
30-
class OracleIncludePolicy(Policy):
31-
database: bool = False
32-
schema: bool = True
33-
identifier: bool = True
45+
logger = AdapterLogger("oracle")
3446

3547

3648
@dataclass(frozen=True, eq=False, repr=False)
3749
class OracleRelation(BaseRelation):
3850
quote_policy: OracleQuotePolicy = field(default_factory=lambda: OracleQuotePolicy())
3951
include_policy: OracleIncludePolicy = field(default_factory=lambda: OracleIncludePolicy())
52+
relation_configs = {
53+
RelationType.MaterializedView.value: OracleMaterializedViewConfig
54+
}
4055

4156
@staticmethod
4257
def add_ephemeral_prefix(name):
4358
return f'dbt__cte__{name}__'
4459

60+
@classmethod
61+
def from_runtime_config(cls, runtime_config: RuntimeConfigObject) -> RelationConfigBase:
62+
model_node: ModelNode = runtime_config.model
63+
relation_type: str = model_node.config.materialized
64+
65+
if relation_config := cls.relation_configs.get(relation_type):
66+
return relation_config.from_model_node(model_node)
67+
68+
raise DbtRuntimeError(
69+
f"from_runtime_config() is not supported for the provided relation type: {relation_type}"
70+
)
71+
72+
@classmethod
73+
def materialized_view_config_changeset(
74+
cls, relation_results: RelationResults,
75+
runtime_config: RuntimeConfigObject) -> Optional[OracleMaterializedViewConfigChangeset]:
76+
config_change_collection = OracleMaterializedViewConfigChangeset()
77+
78+
existing_materialized_view = OracleMaterializedViewConfig.from_relation_results(
79+
relation_results
80+
)
81+
new_materialized_view = OracleMaterializedViewConfig.from_model_node(
82+
runtime_config.model
83+
)
84+
85+
assert isinstance(existing_materialized_view, OracleMaterializedViewConfig)
86+
assert isinstance(new_materialized_view, OracleMaterializedViewConfig)
87+
88+
if new_materialized_view.refresh_method.upper() != existing_materialized_view.refresh_method.upper():
89+
config_change_collection.refresh_method = OracleRefreshMethodConfigChange(
90+
action=RelationConfigChangeAction.alter,
91+
context=new_materialized_view.refresh_method
92+
)
93+
94+
if new_materialized_view.refresh_mode.upper() != existing_materialized_view.refresh_mode.upper():
95+
config_change_collection.refresh_mode = OracleRefreshModeConfigChange(
96+
action=RelationConfigChangeAction.alter,
97+
context=new_materialized_view.refresh_mode
98+
)
99+
100+
if new_materialized_view.build_mode.upper() != existing_materialized_view.build_mode.upper():
101+
config_change_collection.build_mode = OracleBuildModeConfigChange(
102+
action=RelationConfigChangeAction.alter,
103+
context=new_materialized_view.build_mode
104+
)
105+
106+
if new_materialized_view.query_rewrite.upper() != existing_materialized_view.query_rewrite.upper():
107+
config_change_collection.query_rewrite = OracleQueryRewriteConfigChange(
108+
action=RelationConfigChangeAction.alter,
109+
context=new_materialized_view.query_rewrite
110+
)
111+
112+
if new_materialized_view.query.upper() != existing_materialized_view.query.upper():
113+
config_change_collection.query = OracleQueryConfigChange(
114+
action=RelationConfigChangeAction.create,
115+
context=new_materialized_view.query
116+
)
117+
118+
logger.debug(f"Config change collection {config_change_collection}")
119+
120+
if config_change_collection.has_changes:
121+
122+
if config_change_collection.refresh_mode is None:
123+
config_change_collection.refresh_mode = OracleRefreshModeConfigChange(
124+
action=RelationConfigChangeAction.alter,
125+
context=existing_materialized_view.refresh_mode)
126+
127+
if config_change_collection.query_rewrite is None:
128+
config_change_collection.query_rewrite = OracleQueryRewriteConfigChange(
129+
action=RelationConfigChangeAction.alter,
130+
context=existing_materialized_view.query_rewrite)
131+
132+
if config_change_collection.refresh_method is None:
133+
config_change_collection.refresh_method = OracleRefreshMethodConfigChange(
134+
action=RelationConfigChangeAction.alter,
135+
context=existing_materialized_view.refresh_method)
136+
137+
if config_change_collection.build_mode is None:
138+
config_change_collection.build_mode = OracleBuildModeConfigChange(
139+
action=RelationConfigChangeAction.alter,
140+
context=existing_materialized_view.build_mode)
141+
142+
if config_change_collection.query is None:
143+
config_change_collection.query = OracleQueryConfigChange(
144+
action=RelationConfigChangeAction.create,
145+
context=existing_materialized_view.query)
146+
147+
return config_change_collection
45148

149+
return None

0 commit comments

Comments
 (0)