def getNative(self): if isinstance(self.data.value_type, str): raise Exception(">>>>>") else: for field in self.data.value_type.getFields(): name = field.Name().capitalize() func = self.data.gofile.addFunction("GetBy{}".format(name)) if field not in self.data.getIndexes(): func.addArgs("{field} {type}".format( field=field.Name(), type=go_types.go_converter(field.getType()))) func.addResults("res []*{value_type}, count int".format( value_type=self.data.getValueType())) body = ''' for idx, value := range index_{first_index} <@ if value.{name} == {field} <@ res = append(res, &(index_{first_index}[idx])) count++ @> @> return res, count'''.format(name=name, field=field.Name(), first_index=self.data.getIndexes()[0].Name()) else: func.addArgs("{field} {type}".format( field=field.Name(), type=go_types.go_converter(field.getType()))) func.addResults("res []*{value_type}, count int".format( value_type=self.data.getValueType())) value = "index_{field}[res_idx]".format(field=field.Name()) if field == self.data.getIndexes()[0]: value = "&({value})".format(value=value) body = ''' res_idx := sort.Search(Len(), func(i int) bool <@ return index_{field}[i].{name} >= {field} @>) INTO_RES: if res_idx < Len() <@ count++ value := {value} if value.{name} == {field} <@ res = append(res, value) res_idx++ goto INTO_RES @> @> return res, count'''.format(field=field.Name(), name=name, data=self.data.Name(), value=value) func.addBody(body)
def addField(self, field, is_pointer=False): tf = "{name} {pointer}{type}".format( name=field.Name().capitalize(), type=field.field.getFullType() if field.isData() else go_types.go_converter(field.getType()), pointer="*" if is_pointer else "") self.fields.append(tf)
def __init__( self, name, key, value, parent=None, public=True ): super( GoDictionaryData, self ).__init__( name, parent ) self.key_type = key self.value_type = value self.value_type_name = go_types.go_converter(value) if isinstance(value, str) else value.Name() self.functions = [ AddDictionaryDataGoMethod, GetDictionaryDataGoMethod, RemoveDictionaryDataGoMethod, LenDictionaryDataGoMethod, ]
def funcGet(self): func = self.gofile.addFunction( "Get{data}Id".format(data=self.data.Name().capitalize())) func_args_list = [] invoke_args_list = [] for field in self.data.getFields(): if not field.isAuto(): func_args_list.append("{name} {type}".format( name=field.Name(), type=go_types.go_converter(field.getType()))) invoke_args_list.append(field.Name()) invoke_args = ", ".join(invoke_args_list) func_args = ", ".join(func_args_list) func.addArgs("foreign {foreign_type}, {func_args}".format( data=self.data.Name(), func_args=func_args, foreign_type=go_types.go_converter(self.foreign_type))) func.addResults("int, error") body = ''' {data}_id_list, count := index_{data}.GetById(foreign) if count == 0 <@ res_interface, err := core.Invoke("{service}", "get_{data}_id", {invoke_args}) if err != nil <@ return 0, err @> localid := core.ToInt(res_interface) _, err = index_{data}.Add(foreign, localid) if err != nil <@ return localid, err @> return localid, nil @> return {data}_id_list[0].Localid, nil'''.format( data=self.data.Name(), invoke_args=invoke_args, service=self.data.getService().Name()) func.addBody(body)
def getNative(self): if not len(self.data.getIndexes()) == 2: return if isinstance(self.data.value_type, str): raise Exception(">>>>>") else: self.data.gofile.addImport("core") field = self.data.getIndexes()[1] func = self.data.gofile.addFunction(self.Name()) func.addArgs("{field} {type}".format(field=field.Name(), type=go_types.go_converter( field.getType()))) func.addResults("int, error") body = ''' res_idx := sort.Search(Len(), func(i int) bool <@ return index_{field}[i].{name} >= {field} @>) if res_idx < Len() && index_{field}[res_idx].{name} == {field}<@ value := index_{field}[res_idx] return value.Id, nil @> else <@ core.PublishWarning("{data_name}_cache: GetIdFromCache: call cross cache") newitem, err := {data_name}.ReadByUnique({field}) if err != nil <@ return 0, err @> index_id = append(index_id, newitem) index_{field} = append(index_{field}, &(index_id[len(index_id) - 1])) to_sort() return newitem.Id, nil @>'''.format(name=field.Name().capitalize(), field=field.Name(), data_name=self.data.value_type.Name()) func.addBody(body)
def getNative(self): if isinstance(self.data.value_type, str): raise Exception(">>>>>") else: for field in self.data.value_type.getFields(): name = field.Name().capitalize() func = self.data.gofile.addFunction("GetBy{}".format(name)) func.addArgs("{field} {type}".format( field=field.Name(), type=go_types.go_converter(field.getType()))) func.addResults("res []*{value_type}".format( value_type=self.data.getValueType())) body = ''' for _, value := range {data}_list <@ if value.{name} == {field} <@ res = append(res, value) @> @> return res'''.format(data=self.data.value_type.Name(), name=name, field=field.Name()) func.addBody(body)
def getNative( self ): if not self.data.table or not self.data.getIdentifier(): return for field in self.args: name = field.Name( ).capitalize( ) func = self.data.gotype.addMethod( "Set{}".format( name ) ) func.addArgs( "{field} {type}".format( field = field.Name( ), type = go_types.go_converter(field.getType()) ) ) func.addResults( "error" ) body = ''' sql := "UPDATE {data} SET {field} = $1 WHERE id = $2" _, err := core.Postgres.Exec(sql, {field}, self.Id) if err != nil <@ return err @> self.{gofield} = {field} return nil'''.format( data = self.data.Name( ), field = field.Name( ), gofield = name ) func.addBody( body )
def getValueType(self): return self.value_type.getFullType() if not isinstance( self.value_type, str) else go_types.go_converter(self.value_type)
def getValueType( self ): return "{}.{}".format( self.value_type.Name( ), self.value_type.getType( ) ) if not isinstance( self.value_type, str ) else go_types.go_converter(self.value_type)
def getGoType( self ): return go_types.go_converter(self.type) if not self.isData() else self.field.getFullType()
def addVar(self, name, type, is_pointer=False): tf = "{name} {pointer}{type}".format(name=name, type=go_types.go_converter(type), pointer="*" if is_pointer else "") self.fields.append(tf)