package physicalplan

import (
	
	

	
	
)

type RegExpFilter struct {
	left     *ArrayRef
	notMatch bool
	right    *regexp.Regexp
}

func ( *RegExpFilter) ( arrow.Record) (*Bitmap, error) {
	, ,  := .left.ArrowArray()
	if  != nil {
		return nil, 
	}

	if ! {
		 := NewBitmap()
		 := .right.Match(nil)
		if (.notMatch && !) || (!.notMatch && ) {
			for  := uint32(0);  < uint32(.NumRows()); ++ {
				.Add()
			}
			return , nil
		}
		return , nil
	}

	if .notMatch {
		return ArrayScalarRegexNotMatch(, .right)
	}

	return ArrayScalarRegexMatch(, .right)
}

func ( *RegExpFilter) () string {
	if .notMatch {
		return fmt.Sprintf("%s !~ \"%s\"", .left.String(), .right.String())
	}
	return fmt.Sprintf("%s =~ \"%s\"", .left.String(), .right.String())
}

func ( arrow.Array,  *regexp.Regexp) (*Bitmap, error) {
	switch arr := .(type) {
	case *array.Binary:
		return BinaryArrayScalarRegexMatch(, )
	case *array.String:
		return StringArrayScalarRegexMatch(, )
	case *array.Dictionary:
		switch dict := .Dictionary().(type) {
		case *array.Binary:
			return BinaryDictionaryArrayScalarRegexMatch(, , )
		default:
			return nil, fmt.Errorf("ArrayScalarRegexMatch: unsupported dictionary type: %T", )
		}
	default:
		return nil, fmt.Errorf("ArrayScalarRegexMatch: unsupported type: %T", )
	}
}

func ( arrow.Array,  *regexp.Regexp) (*Bitmap, error) {
	switch arr := .(type) {
	case *array.Binary:
		return BinaryArrayScalarRegexNotMatch(, )
	case *array.String:
		return StringArrayScalarRegexNotMatch(, )
	case *array.Dictionary:
		switch dict := .Dictionary().(type) {
		case *array.Binary:
			return BinaryDictionaryArrayScalarRegexNotMatch(, , )
		default:
			return nil, fmt.Errorf("ArrayScalarRegexNotMatch: unsupported dictionary type: %T", )
		}
	default:
		return nil, fmt.Errorf("ArrayScalarRegexNotMatch: unsupported type: %T", )
	}
}

func ( *array.Binary,  *regexp.Regexp) (*Bitmap, error) {
	 := NewBitmap()
	for  := 0;  < .Len(); ++ {
		if .IsNull() {
			continue
		}
		if .MatchString(string(.Value())) {
			.Add(uint32())
		}
	}

	return , nil
}

func ( *array.Binary,  *regexp.Regexp) (*Bitmap, error) {
	 := NewBitmap()
	for  := 0;  < .Len(); ++ {
		if .IsNull() {
			continue
		}
		if !.MatchString(string(.Value())) {
			.Add(uint32())
		}
	}

	return , nil
}

func ( *array.String,  *regexp.Regexp) (*Bitmap, error) {
	 := NewBitmap()
	for  := 0;  < .Len(); ++ {
		if .IsNull() {
			continue
		}
		if .MatchString(.Value()) {
			.Add(uint32())
		}
	}

	return , nil
}

func ( *array.String,  *regexp.Regexp) (*Bitmap, error) {
	 := NewBitmap()
	for  := 0;  < .Len(); ++ {
		if .IsNull() {
			continue
		}
		if !.MatchString(.Value()) {
			.Add(uint32())
		}
	}

	return , nil
}

func ( *array.Dictionary,  *array.Binary,  *regexp.Regexp) (*Bitmap, error) {
	 := NewBitmap()
	for  := 0;  < .Len(); ++ {
		if .IsNull() {
			continue
		}
		if .MatchString(string(.Value(.GetValueIndex()))) {
			.Add(uint32())
		}
	}
	return , nil
}

func ( *array.Dictionary,  *array.Binary,  *regexp.Regexp) (*Bitmap, error) {
	 := NewBitmap()
	for  := 0;  < .Len(); ++ {
		if .IsNull() {
			continue
		}
		if !.MatchString(string(.Value(.GetValueIndex()))) {
			.Add(uint32())
		}
	}

	return , nil
}