001/*
002 * #%L
003 * HAPI FHIR JPA Server
004 * %%
005 * Copyright (C) 2014 - 2024 Smile CDR, Inc.
006 * %%
007 * Licensed under the Apache License, Version 2.0 (the "License");
008 * you may not use this file except in compliance with the License.
009 * You may obtain a copy of the License at
010 *
011 *      http://www.apache.org/licenses/LICENSE-2.0
012 *
013 * Unless required by applicable law or agreed to in writing, software
014 * distributed under the License is distributed on an "AS IS" BASIS,
015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016 * See the License for the specific language governing permissions and
017 * limitations under the License.
018 * #L%
019 */
020package ca.uhn.fhir.jpa.entity;
021
022import ca.uhn.fhir.i18n.Msg;
023import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
024import jakarta.persistence.Column;
025import jakarta.persistence.Entity;
026import jakarta.persistence.Id;
027import jakarta.persistence.Lob;
028import org.apache.commons.io.IOUtils;
029import org.hibernate.annotations.Immutable;
030import org.hibernate.annotations.Subselect;
031
032import java.io.IOException;
033import java.io.Reader;
034import java.io.Serializable;
035import java.sql.Clob;
036import java.sql.SQLException;
037
038@Entity
039@Immutable
040@Subselect(
041                /*
042                 * Note about the CONCAT function below- We need a primary key (an @Id) column
043                 * because hibernate won't allow the view the function without it, but
044                 */
045                "SELECT CONCAT_WS(' ', vsc.PID, vscd.PID) AS PID, " + "       vsc.PID                         AS CONCEPT_PID, "
046                                + "       vsc.VALUESET_PID                AS CONCEPT_VALUESET_PID, "
047                                + "       vsc.VALUESET_ORDER              AS CONCEPT_VALUESET_ORDER, "
048                                + "       vsc.SYSTEM_URL                  AS CONCEPT_SYSTEM_URL, "
049                                + "       vsc.CODEVAL                     AS CONCEPT_CODEVAL, "
050                                + "       vsc.DISPLAY                     AS CONCEPT_DISPLAY, "
051                                + "       vsc.SYSTEM_VER                  AS SYSTEM_VER, "
052                                + "       vsc.SOURCE_PID                  AS SOURCE_PID, "
053                                + "       vsc.SOURCE_DIRECT_PARENT_PIDS   AS SOURCE_DIRECT_PARENT_PIDS, "
054                                + "       vscd.PID                        AS DESIGNATION_PID, "
055                                + "       vscd.LANG                       AS DESIGNATION_LANG, "
056                                + "       vscd.USE_SYSTEM                 AS DESIGNATION_USE_SYSTEM, "
057                                + "       vscd.USE_CODE                   AS DESIGNATION_USE_CODE, "
058                                + "       vscd.USE_DISPLAY                AS DESIGNATION_USE_DISPLAY, "
059                                + "       vscd.VAL                        AS DESIGNATION_VAL "
060                                + "FROM TRM_VALUESET_CONCEPT vsc "
061                                + "LEFT OUTER JOIN TRM_VALUESET_C_DESIGNATION vscd ON vsc.PID = vscd.VALUESET_CONCEPT_PID")
062public class TermValueSetConceptView implements Serializable, ITermValueSetConceptView {
063        private static final long serialVersionUID = 1L;
064
065        @Id
066        @Column(name = "PID", length = 1000 /* length only needed to satisfy JpaEntityTest, it's not used*/)
067        private String id; // still set automatically
068
069        @Column(name = "CONCEPT_PID")
070        private Long myConceptPid;
071
072        @Column(name = "CONCEPT_VALUESET_PID")
073        private Long myConceptValueSetPid;
074
075        @Column(name = "CONCEPT_VALUESET_ORDER")
076        private int myConceptOrder;
077
078        @Column(name = "CONCEPT_SYSTEM_URL", length = TermCodeSystem.MAX_URL_LENGTH)
079        private String myConceptSystemUrl;
080
081        @Column(name = "CONCEPT_CODEVAL", length = TermConcept.MAX_CODE_LENGTH)
082        private String myConceptCode;
083
084        @Column(name = "CONCEPT_DISPLAY", length = TermConcept.MAX_DESC_LENGTH)
085        private String myConceptDisplay;
086
087        @Column(name = "SYSTEM_VER", length = TermCodeSystemVersion.MAX_VERSION_LENGTH)
088        private String myConceptSystemVersion;
089
090        @Column(name = "DESIGNATION_PID")
091        private Long myDesignationPid;
092
093        @Column(name = "DESIGNATION_LANG", length = TermConceptDesignation.MAX_LENGTH)
094        private String myDesignationLang;
095
096        @Column(name = "DESIGNATION_USE_SYSTEM", length = TermConceptDesignation.MAX_LENGTH)
097        private String myDesignationUseSystem;
098
099        @Column(name = "DESIGNATION_USE_CODE", length = TermConceptDesignation.MAX_LENGTH)
100        private String myDesignationUseCode;
101
102        @Column(name = "DESIGNATION_USE_DISPLAY", length = TermConceptDesignation.MAX_LENGTH)
103        private String myDesignationUseDisplay;
104
105        @Column(name = "DESIGNATION_VAL", length = TermConceptDesignation.MAX_VAL_LENGTH)
106        private String myDesignationVal;
107
108        @Column(name = "SOURCE_PID", nullable = true)
109        private Long mySourceConceptPid;
110
111        @Lob
112        @Column(name = "SOURCE_DIRECT_PARENT_PIDS", nullable = true)
113        private Clob mySourceConceptDirectParentPids;
114
115        @Override
116        public Long getSourceConceptPid() {
117                return mySourceConceptPid;
118        }
119
120        @Override
121        public String getSourceConceptDirectParentPids() {
122                if (mySourceConceptDirectParentPids != null) {
123                        try (Reader characterStream = mySourceConceptDirectParentPids.getCharacterStream()) {
124                                return IOUtils.toString(characterStream);
125                        } catch (IOException | SQLException e) {
126                                throw new InternalErrorException(Msg.code(828) + e);
127                        }
128                }
129                return null;
130        }
131
132        @Override
133        public Long getConceptPid() {
134                return myConceptPid;
135        }
136
137        @Override
138        public String getConceptSystemUrl() {
139                return myConceptSystemUrl;
140        }
141
142        @Override
143        public String getConceptCode() {
144                return myConceptCode;
145        }
146
147        @Override
148        public String getConceptDisplay() {
149                return myConceptDisplay;
150        }
151
152        @Override
153        public Long getDesignationPid() {
154                return myDesignationPid;
155        }
156
157        @Override
158        public String getDesignationLang() {
159                return myDesignationLang;
160        }
161
162        @Override
163        public String getDesignationUseSystem() {
164                return myDesignationUseSystem;
165        }
166
167        @Override
168        public String getDesignationUseCode() {
169                return myDesignationUseCode;
170        }
171
172        @Override
173        public String getDesignationUseDisplay() {
174                return myDesignationUseDisplay;
175        }
176
177        @Override
178        public String getDesignationVal() {
179                return myDesignationVal;
180        }
181
182        @Override
183        public String getConceptSystemVersion() {
184                return myConceptSystemVersion;
185        }
186}