001package ca.uhn.fhir.mdm.rules.matcher;
002
003/*-
004 * #%L
005 * HAPI FHIR - Master Data Management
006 * %%
007 * Copyright (C) 2014 - 2022 Smile CDR, Inc.
008 * %%
009 * Licensed under the Apache License, Version 2.0 (the "License");
010 * you may not use this file except in compliance with the License.
011 * You may obtain a copy of the License at
012 *
013 *      http://www.apache.org/licenses/LICENSE-2.0
014 *
015 * Unless required by applicable law or agreed to in writing, software
016 * distributed under the License is distributed on an "AS IS" BASIS,
017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
018 * See the License for the specific language governing permissions and
019 * limitations under the License.
020 * #L%
021 */
022
023import org.hl7.fhir.instance.model.api.IBase;
024import org.hl7.fhir.r4.model.BaseDateTimeType;
025import org.hl7.fhir.r4.model.DateTimeType;
026import org.hl7.fhir.r4.model.DateType;
027
028public class HapiDateMatcherR4 {
029        // TODO KHS code duplication (tried generalizing it with generics, but it got too convoluted)
030        public boolean match(IBase theLeftBase, IBase theRightBase) {
031                if (theLeftBase instanceof BaseDateTimeType && theRightBase instanceof BaseDateTimeType) {
032                        BaseDateTimeType leftDate = (BaseDateTimeType) theLeftBase;
033                        BaseDateTimeType rightDate = (BaseDateTimeType) theRightBase;
034                        int comparison = leftDate.getPrecision().compareTo(rightDate.getPrecision());
035                        if (comparison == 0) {
036                                return leftDate.getValueAsString().equals(rightDate.getValueAsString());
037                        }
038                        BaseDateTimeType leftPDate;
039                        BaseDateTimeType rightPDate;
040                        //Left date is coarser
041                        if (comparison < 0) {
042                                leftPDate = leftDate;
043                                if (rightDate instanceof DateType) {
044                                        rightPDate = new DateType(rightDate.getValue(), leftDate.getPrecision());
045                                } else {
046                                        rightPDate = new DateTimeType(rightDate.getValue(), leftDate.getPrecision());
047                                }
048                        //Right date is coarser
049                        } else {
050                                rightPDate = rightDate;
051                                if (leftDate instanceof DateType) {
052                                        leftPDate = new DateType(leftDate.getValue(), rightDate.getPrecision());
053                                } else {
054                                        leftPDate = new DateTimeType(leftDate.getValue(), rightDate.getPrecision());
055                                }
056                        }
057                        return leftPDate.getValueAsString().equals(rightPDate.getValueAsString());
058                }
059
060                return false;
061        }
062}